{"matchId":"17376","match":"exact_match","creationMatch":"match","runtimeMatch":"exact_match","chainId":"4217","address":"0x3b3f2e2aa07460a9ba95ffd06ad9597398bbbab7","verifiedAt":"2026-05-27 18:09:02","transactionHash":null,"blockNumber":null,"name":"bridgedBRLVRouter","fullyQualifiedName":"src/bridgedBRLVRouter.sol:bridgedBRLVRouter","compiler":"solc","compilerVersion":"0.8.34+commit.80d5c536","language":"Solidity","compilerSettings":{"remappings":["@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/","@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.6/","forge-std-1.16.0/=dependencies/forge-std-1.16.0/","tempo-std-0.1.6/=dependencies/tempo-std-0.1.6/","@openzeppelin-contracts-4.9.6/=dependencies/@openzeppelin-contracts-4.9.6/","@openzeppelin-contracts-upgradeable-4.9.6/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"osaka","viaIR":false,"libraries":{}},"runtimeMetadataMatch":"exact_match","creationMetadataMatch":"match","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BridgedBRLVRouterInvalidAddress","type":"error"},{"inputs":[],"name":"BridgedBRLVRouterInvalidAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"BridgedBRLVRouterInvalidBlockedAccount","type":"error"},{"inputs":[{"internalType":"bytes32","name":"provided","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"BridgedBRLVRouterInvalidCanonicalDomain","type":"error"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"BridgedBRLVRouterTxHashAlreadyProcessed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountBlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountUnblocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgedBurnRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"canonicalTxHash","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"canonicalDomain","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardMultiplier","type":"uint256"}],"name":"BridgedMintCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BLOCKLIST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalDomain","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITIP20","name":"token_","type":"address"},{"internalType":"contract ITIP403Registry","name":"policyRegistry_","type":"address"},{"internalType":"uint64","name":"policyId_","type":"uint64"},{"internalType":"bytes32","name":"canonicalDomain_","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"isProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"canonicalTxHash","type":"bytes32"},{"internalType":"bytes32","name":"canonicalDomain_","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"rewardMultiplier","type":"uint256"}],"name":"mint","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":"policyId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policyRegistry","outputs":[{"internalType":"contract ITIP403Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"token","outputs":[{"internalType":"contract ITIP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"userdoc":null,"devdoc":null,"storageLayout":null,"metadata":"{\"compiler\":{\"version\":\"0.8.34+commit.80d5c536\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BridgedBRLVRouterInvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BridgedBRLVRouterInvalidAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"BridgedBRLVRouterInvalidBlockedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"provided\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"BridgedBRLVRouterInvalidCanonicalDomain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"}],\"name\":\"BridgedBRLVRouterTxHashAlreadyProcessed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AccountBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AccountUnblocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BridgedBurnRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"canonicalTxHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"canonicalDomain\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardMultiplier\",\"type\":\"uint256\"}],\"name\":\"BridgedMintCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKLIST_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURNER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"blockAccounts\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canonicalDomain\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITIP20\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"contract ITIP403Registry\",\"name\":\"policyRegistry_\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"policyId_\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"canonicalDomain_\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isBlocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"}],\"name\":\"isProcessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"canonicalTxHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"canonicalDomain_\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"rewardMultiplier\",\"type\":\"uint256\"}],\"name\":\"mint\",\"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\":\"policyId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"policyRegistry\",\"outputs\":[{\"internalType\":\"contract ITIP403Registry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"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\":\"token\",\"outputs\":[{\"internalType\":\"contract ITIP20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"unblockAccounts\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"security@crowndigital.xyz\",\"details\":\"The user-facing token is a TIP-20 instance named \\\"bridgedBRLV\\\", deployed via the TIP-20 factory. This router handles inbound (canonical \\u2192 Tempo mint) and outbound (Tempo \\u2192 canonical burn) operations, plus admin-side blocklist and pause management. It must hold ISSUER_ROLE, PAUSE_ROLE, and UNPAUSE_ROLE on the TIP-20; the burn flow uses EIP-2612 permit + transferFrom + self-burn, requiring no privileged TIP-20 role on that path. User-side ERC-20 operations (transfer, balanceOf, approve, permit) happen on the TIP-20 directly.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"BridgedBurnRequested(address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens burned.\",\"from\":\"The address whose tokens were burned.\"}},\"BridgedMintCompleted(bytes32,bytes32,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens minted.\",\"canonicalDomain\":\"The domain identifier of the canonical chain.\",\"canonicalTxHash\":\"The transaction hash from the canonical chain.\",\"rewardMultiplier\":\"The reward multiplier at the time of mint on canonical chain.\",\"to\":\"The recipient address.\"}},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"blockAccounts(address[])\":{\"details\":\"Only callable by accounts with BLOCKLIST_ROLE. Blocked accounts are rejected by the TIP-20 precompile on subsequent transfers (with TIP-20's native PolicyForbids error).\",\"params\":{\"addresses\":\"The addresses to block.\"}},\"burn(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Only callable by accounts with BURNER_ROLE (the relayer). Caller must supply an EIP-2612      permit signed by `from` authorizing this router to spend `amount`. Blocked accounts      cannot bridge out \\u2014 TIP-403 rejects the `transferFrom`. Compliance burns of sanctioned      balances are handled outside this router via TIP-20 `burnBlocked` operated by whoever      holds `BURN_BLOCKED_ROLE`.\",\"params\":{\"amount\":\"The amount of tokens to burn.\",\"deadline\":\"EIP-2612 permit deadline.\",\"from\":\"The token holder whose balance is being burned.\",\"r\":\"Permit signature r.\",\"s\":\"Permit signature s.\",\"v\":\"Permit signature v.\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"initialize(address,address,uint64,bytes32,address)\":{\"details\":\"The deployer must have already created the TIP-20 instance via the factory, created a BLACKLIST policy in the TIP-403 registry, and wired the TIP-20's transferPolicyId to that policy. Post-deploy steps (transferring policy admin to this contract, granting TIP-20 roles, granting operational roles) are performed by the deploy script.\",\"params\":{\"canonicalDomain_\":\"The domain identifier of the canonical chain.\",\"owner\":\"The address that will receive DEFAULT_ADMIN_ROLE.\",\"policyId_\":\"The BLACKLIST policy ID this router administers.\",\"policyRegistry_\":\"The TIP-403 policy registry precompile.\",\"token_\":\"The TIP-20 instance backing the bridgedBRLV token.\"}},\"isBlocked(address)\":{\"params\":{\"account\":\"The account to check.\"},\"returns\":{\"_0\":\"True if the account is blocked, false otherwise.\"}},\"isProcessed(bytes32)\":{\"params\":{\"txHash\":\"The transaction hash to check.\"},\"returns\":{\"_0\":\"True if the txHash has been processed, false otherwise.\"}},\"mint(bytes32,bytes32,uint256,address,uint256)\":{\"details\":\"Only callable by accounts with MINTER_ROLE (typically the relayer).\",\"params\":{\"amount\":\"The amount of tokens to mint.\",\"canonicalDomain_\":\"The domain identifier of the canonical chain.\",\"canonicalTxHash\":\"The transaction hash from the canonical chain.\",\"rewardMultiplier\":\"The reward multiplier at the time of mint on canonical chain.\",\"to\":\"The recipient address.\"}},\"pause()\":{\"details\":\"Only callable by accounts with PAUSE_ROLE. This contract must hold PAUSE_ROLE on the TIP-20.\"},\"paused()\":{\"returns\":{\"_0\":\"True if paused, false otherwise.\"}},\"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.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"unblockAccounts(address[])\":{\"details\":\"Only callable by accounts with BLOCKLIST_ROLE.\",\"params\":{\"addresses\":\"The addresses to unblock.\"}},\"unpause()\":{\"details\":\"Only callable by accounts with PAUSE_ROLE. This contract must hold UNPAUSE_ROLE on the TIP-20.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"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\":\"This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\"}},\"title\":\"bridgedBRLVRouter\",\"version\":1},\"userdoc\":{\"events\":{\"AccountBlocked(address)\":{\"notice\":\"Emitted when an account is added to the TIP-403 blacklist policy.\"},\"AccountUnblocked(address)\":{\"notice\":\"Emitted when an account is removed from the TIP-403 blacklist policy.\"},\"BridgedBurnRequested(address,uint256)\":{\"notice\":\"Emitted when tokens are burned, requesting a burn on the canonical chain.\"},\"BridgedMintCompleted(bytes32,bytes32,uint256,address,uint256)\":{\"notice\":\"Emitted when tokens are minted from a canonical chain transaction.\"}},\"kind\":\"user\",\"methods\":{\"blockAccounts(address[])\":{\"notice\":\"Blocks multiple accounts via the TIP-403 BLACKLIST policy.\"},\"burn(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Burns `amount` tokens from `from` via permit + transferFrom + self-burn, signaling a         bridge-out request to the canonical chain.\"},\"initialize(address,address,uint64,bytes32,address)\":{\"notice\":\"Initializes the bridgedBRLVRouter. Called once via the ERC1967 proxy at deploy time.\"},\"isBlocked(address)\":{\"notice\":\"Checks if an account is on the TIP-403 BLACKLIST policy.\"},\"isProcessed(bytes32)\":{\"notice\":\"Checks if a canonical txHash has been processed by mint.\"},\"mint(bytes32,bytes32,uint256,address,uint256)\":{\"notice\":\"Mints tokens via the TIP-20 instance from a canonical chain transaction.\"},\"pause()\":{\"notice\":\"Pauses transfers on the underlying TIP-20.\"},\"paused()\":{\"notice\":\"Returns true if the underlying TIP-20 is paused.\"},\"unblockAccounts(address[])\":{\"notice\":\"Unblocks multiple accounts via the TIP-403 BLACKLIST policy.\"},\"unpause()\":{\"notice\":\"Unpauses transfers on the underlying TIP-20.\"}},\"notice\":\"Cross-chain router for the bridgedBRLV TIP-20.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/bridgedBRLVRouter.sol\":\"bridgedBRLVRouter\"},\"evmVersion\":\"osaka\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin-contracts-4.9.6/=dependencies/@openzeppelin-contracts-4.9.6/\",\":@openzeppelin-contracts-upgradeable-4.9.6/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/\",\":@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/\",\":@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.6/\",\":forge-std-1.16.0/=dependencies/forge-std-1.16.0/\",\":tempo-std-0.1.6/=dependencies/tempo-std-0.1.6/\"]},\"sources\":{\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/AccessControlUpgradeable.sol\":{\"keccak256\":\"0xc8710577334e8d0799ae2b2a731b1924a7bddd64319da9787ddd2dc69bdd1ce5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b83b7afa4d2372da3ba5402fb10860a105c35d79812c60dc61007be2afc17618\",\"dweb:/ipfs/QmYX9xPmbNVSKXrepKiUZiG5oL3SdzFp9a4kqspxX1sEUx\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/IAccessControlUpgradeable.sol\":{\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://740cf4dc535e3082560cf5a031473029f322690fc8037fe9d5e3a8bef42e757c\",\"dweb:/ipfs/QmTQxFdfxcaueQa23VX34wAPqzruZbkzyeN58tZK2yav2b\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/IERC1967Upgradeable.sol\":{\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ac55bf6f92fc7b90c6d79d346163a0a02bd5c648c7fede08b20e5da96d4ae2a0\",\"dweb:/ipfs/QmQoSrHhka35iKDK5iyNt8cuXXS5ANXVPjLhfsJjktB8V9\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/draft-IERC1822Upgradeable.sol\":{\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://496bd9b3df2455d571018c09f0c6badd29713fdeb907c6aa09d8d28cb603f053\",\"dweb:/ipfs/QmXdJDyYs6WMwMh21dez2BYPxhSUaUYFMDtVNcn2cgFR79\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"keccak256\":\"0x7795808e3899c805254e3ae58074b20f799b466e3f43e057e47bedee5fb771f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://319853a2a682f3f72411507242669ef5e76e0ad3457be53102439709ee8948f0\",\"dweb:/ipfs/QmRtm4Ese9u4jfxXyuWPXLwzenwFotuQjAWV7rXtZTB1E9\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/beacon/IBeaconUpgradeable.sol\":{\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4dbfe1a3b3b3fb64294ce41fd2ad362e7b7012208117864f42c1a67620a6d5c1\",\"dweb:/ipfs/QmVMU5tWt7zBQMmf5cpMX8UMHV86T3kFeTxBTBjFqVWfoJ\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0xefb41f5c1a00249b7a99f0782f8c557865605426a3fb6e5fe9ae334293ae4f33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://90def55e5782595aabc13f57780c02d3613e5226f20ce6c1709503a63fdeb58f\",\"dweb:/ipfs/Qmb5vcymmNEZUJMaHmYxnhvGJDEsGMae4YjcHwkA74jy99\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95\",\"dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StorageSlotUpgradeable.sol\":{\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a9df9de7b5da1d1bd3d4b6c073d0174bc4211db60e794a321c8cb5d4eae34685\",\"dweb:/ipfs/QmWe49zj65jayrCe9jZpoWhYUZ1RiwSxyU2s7SBZnMztVy\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0xb96dc79b65b7c37937919dcdb356a969ce0aa2e8338322bf4dc027a3c9c9a7eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f8613145881436fc0480fff22da4868d611e2b0c0c3da083334eb4362ce1945a\",\"dweb:/ipfs/QmPqpP3YeRbBdTJRe6Gv2eGsUaANf4J6RwTNRW36iYahfV\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0xd90d7723512df65ae417adaf0801042940f0dabd60039ceeaffe34aa5b238da1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1b13befeb3413749292f9fb229de1c7a509a5ce2c8047d9094fc004ca9d3af89\",\"dweb:/ipfs/QmRzJ2hZSwRtMejHUZAYTPRKgZsnfb112Fno9Jf3EiDfwA\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0x2bc0007987c229ae7624eb29be6a9b84f6a6a5872f76248b15208b131ea41c4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2b2835c737d073ef8b82a4cc246495a9740f43e7ff2cf130906b2449ff9bfb91\",\"dweb:/ipfs/QmSCWfNoSvvTN57ic7o1RW6NqSxxGAqbBTnLKc7QHe27qB\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/SignedMathUpgradeable.sol\":{\"keccak256\":\"0x88f6b7bba3ee33eeb741f9a0f5bc98b6e6e352d0fe4905377bb328590f84095a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88ace2d60f265752f18903d839910be4e4e104340b2957678585b812447825d4\",\"dweb:/ipfs/QmXFkNxMc3AAGzhs2wUEZyErWQjsvoTGyYjuU5oZkFki5Z\"]},\"dependencies/tempo-std-0.1.6/src/interfaces/ITIP20.sol\":{\"keccak256\":\"0xf553c9b00766125fb93cd8920588bb5429d96af1a23b797511c66a533c7a98d5\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b514d1884b58d40d65bcf40217e8a90f099def388e114f316b10cb72c261db69\",\"dweb:/ipfs/QmS6eDUTGayPHRomh43rBfruGeaps5oZxh1vQGQG59juxH\"]},\"dependencies/tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol\":{\"keccak256\":\"0xeb7d50bd3987ac2a71fbdbc8e391666d7ecf3c2ce25617dda2c36fe97fabe597\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://91caa2b888c7a92f56fac58648a62792edbeb3b4fe6f3c9bf4aa54e207f6f5e5\",\"dweb:/ipfs/Qmf5jZnRitrRxAQram8CeGFfTrZbNmCtrW1sckNxWq1TzU\"]},\"src/bridgedBRLVRouter.sol\":{\"keccak256\":\"0x40864eb4b838f703c0288168a92139707fb50cdada42b174fdc37374254dba8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://433c1a5f6a05cbc7a75bee69ff027de1161c41956940d637efbdb314666b946a\",\"dweb:/ipfs/QmNY2ZuuyXZoHW3a3i1mEqx8PkYvS9gwERbbYEeeABcS1B\"]},\"src/interfaces/IBridgedBRLVRouter.sol\":{\"keccak256\":\"0xe8224cb7a7dcb7f155ff7e1f7bc8a18cd989b66699f90971b6dc7deecc708126\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3430c7b2381106619f02c4bab62df494400dd64ac43a48fa560920ed19cd0109\",\"dweb:/ipfs/QmULS3MYBVHsvDK8qFMyV49gcY2wgpDgHqGWqFHzRB3tMT\"]}},\"version\":1}","sources":{"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/AccessControlUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControlUpgradeable.sol\";\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../utils/StringsUpgradeable.sol\";\nimport \"../utils/introspection/ERC165Upgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\n    struct RoleData {\n        mapping(address => bool) members;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with a standardized message including the required role.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     *\n     * _Available since v4.1._\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    function __AccessControl_init() internal onlyInitializing {\n    }\n\n    function __AccessControl_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n        return _roles[role].members[account];\n    }\n\n    /**\n     * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n     * Overriding this function changes the behavior of the {onlyRole} modifier.\n     *\n     * Format of the revert message is described in {_checkRole}.\n     *\n     * _Available since v4.6._\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Revert with a standard message if `account` is missing `role`.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"AccessControl: account \",\n                        StringsUpgradeable.toHexString(account),\n                        \" is missing role \",\n                        StringsUpgradeable.toHexString(uint256(role), 32)\n                    )\n                )\n            );\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address account) public virtual override {\n        require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event. Note that unlike {grantRole}, this function doesn't perform any\n     * checks on the calling account.\n     *\n     * May emit a {RoleGranted} event.\n     *\n     * [WARNING]\n     * ====\n     * This function should only be called from the constructor when setting\n     * up the initial roles for the system.\n     *\n     * Using this function in any other way is effectively circumventing the admin\n     * system imposed by {AccessControl}.\n     * ====\n     *\n     * NOTE: This function is deprecated in favor of {_grantRole}.\n     */\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual {\n        if (!hasRole(role, account)) {\n            _roles[role].members[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual {\n        if (hasRole(role, account)) {\n            _roles[role].members[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/IAccessControlUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControlUpgradeable {\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted signaling this.\n     *\n     * _Available since v3.1._\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {AccessControl-_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     */\n    function renounceRole(bytes32 role, address account) external;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/IERC1967Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967Upgradeable {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/draft-IERC1822Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822ProxiableUpgradeable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeaconUpgradeable.sol\";\nimport \"../../interfaces/IERC1967Upgradeable.sol\";\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/StorageSlotUpgradeable.sol\";\nimport {Initializable} from \"../utils/Initializable.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n */\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\n    // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    function __ERC1967Upgrade_init() internal onlyInitializing {\n    }\n\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        require(AddressUpgradeable.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Perform implementation upgrade\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeTo(address newImplementation) internal {\n        _setImplementation(newImplementation);\n        emit Upgraded(newImplementation);\n    }\n\n    /**\n     * @dev Perform implementation upgrade with additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(newImplementation, data);\n        }\n    }\n\n    /**\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\n        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\n            _setImplementation(newImplementation);\n        } else {\n            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n                require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n            } catch {\n                revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n            }\n            _upgradeToAndCall(newImplementation, data, forceCall);\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {AdminChanged} event.\n     */\n    function _changeAdmin(address newAdmin) internal {\n        emit AdminChanged(_getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n     */\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        require(AddressUpgradeable.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n    }\n\n    /**\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n     *\n     * Emits a {BeaconUpgraded} event.\n     */\n    function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/beacon/IBeaconUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeaconUpgradeable {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {BeaconProxy} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../ERC1967/ERC1967UpgradeUpgradeable.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n    address private immutable __self = address(this);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        require(address(this) != __self, \"Function must be called through delegatecall\");\n        require(_getImplementation() == __self, \"Function must be called through active proxy\");\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n        return _IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeTo(address newImplementation) public virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data, true);\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeTo} and {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal override onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StorageSlotUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlotUpgradeable {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := store.slot\n        }\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StringsUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\nimport \"./math/SignedMathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = MathUpgradeable.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMathUpgradeable.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/ERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n    function __ERC165_init() internal onlyInitializing {\n    }\n\n    function __ERC165_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/IERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/MathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/SignedMathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMathUpgradeable {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},"dependencies/tempo-std-0.1.6/src/interfaces/ITIP20.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\n/// @title The interface for TIP-20 compliant tokens\n/// @notice A token standard that extends ERC-20 with additional features including transfer policies, memo support, and pause functionality\ninterface ITIP20 {\n    /// @notice Error when attempting an operation while the contract is paused.\n    error ContractPaused();\n\n    /// @notice Error when the spender has insufficient allowance for the requested transfer.\n    error InsufficientAllowance();\n\n    /// @notice Error when an account has insufficient balance for the requested operation.\n    error InsufficientBalance(uint256 currentBalance, uint256 expectedBalance, address);\n    error InvalidAmount();\n\n    /// @notice Error when an invalid currency identifier is provided.\n    error InvalidCurrency();\n    error InvalidQuoteToken();\n    error InvalidBaseToken();\n    error InvalidToken();\n    error InvalidTransferPolicyId();\n\n    /// @notice Error when attempting to transfer to an invalid recipient address.\n    error InvalidRecipient();\n    error InvalidSupplyCap();\n    error NoOptedInSupply();\n\n    /// @notice Error when a transfer is blocked by the current transfer policy.\n    error PolicyForbids();\n\n    /// @notice Error when attempting to burn from a protected address.\n    error ProtectedAddress();\n    error SupplyCapExceeded();\n\n    /// @notice Emitted when an allowance is set between owner and spender.\n    /// @param owner The address that owns the tokens.\n    /// @param spender The address that is approved to spend the tokens.\n    /// @param amount The amount of tokens approved for spending.\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n    /// @notice Emitted when tokens are burned.\n    /// @param from The address from which tokens were burned.\n    /// @param amount The amount of tokens burned.\n    event Burn(address indexed from, uint256 amount);\n\n    /// @notice Emitted when tokens are forcibly burned from a blocked account.\n    /// @param from The address from which tokens were forcibly burned.\n    /// @param amount The amount of tokens burned.\n    event BurnBlocked(address indexed from, uint256 amount);\n\n    /// @notice Emitted when tokens are minted.\n    /// @param to The address that received the newly minted tokens.\n    /// @param amount The amount of tokens minted.\n    event Mint(address indexed to, uint256 amount);\n    event NextQuoteTokenSet(address indexed updater, ITIP20 indexed nextQuoteToken);\n\n    /// @notice Emitted when the contract's pause state changes.\n    /// @param updater The address that initiated the pause state change.\n    /// @param isPaused The new pause state of the contract.\n    event PauseStateUpdate(address indexed updater, bool isPaused);\n    event QuoteTokenUpdate(address indexed updater, ITIP20 indexed newQuoteToken);\n    event RewardRecipientSet(address indexed holder, address indexed recipient);\n    event RewardDistributed(address indexed funder, uint256 amount);\n\n    /// @notice Emitted when the supply cap is updated.\n    /// @param updater The address that initiated the supply cap update.\n    /// @param newSupplyCap The new maximum supply limit for the token.\n    event SupplyCapUpdate(address indexed updater, uint256 indexed newSupplyCap);\n\n    /// @notice Emitted when tokens are transferred.\n    /// @param from The address tokens were transferred from.\n    /// @param to The address tokens were transferred to.\n    /// @param amount The amount of tokens transferred.\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    /// @notice Emitted when the transfer policy is updated.\n    /// @param updater The address that initiated the policy update.\n    /// @param newPolicyId The new policy identifier that will govern transfers.\n    event TransferPolicyUpdate(address indexed updater, uint64 indexed newPolicyId);\n\n    /// @notice Emitted when tokens are transferred with an attached memo.\n    /// @param from The address tokens were transferred from.\n    /// @param to The address tokens were transferred to.\n    /// @param amount The amount of tokens transferred.\n    /// @param memo The memo attached to the transfer.\n    event TransferWithMemo(address indexed from, address indexed to, uint256 amount, bytes32 indexed memo);\n\n    /// @notice Returns the role identifier for burning tokens from blocked accounts.\n    /// @return The burn blocked role identifier.\n    function BURN_BLOCKED_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the role identifier for issuing tokens.\n    /// @return The issuer role identifier.\n    function ISSUER_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the role identifier for pausing the contract.\n    /// @return The pause role identifier.\n    function PAUSE_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the role identifier for unpausing the contract.\n    /// @return The unpause role identifier.\n    function UNPAUSE_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the amount of tokens that spender is allowed to spend on behalf of owner.\n    /// @param owner The address that owns the tokens.\n    /// @param spender The address that is approved to spend the tokens.\n    /// @return The allowance amount.\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Returns the token balance of a specific account.\n    /// @param account The address to query the balance of.\n    /// @return The token balance of the account.\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Burns tokens from the caller's balance.\n    /// @param amount The amount of tokens to burn.\n    function burn(uint256 amount) external;\n\n    /// @notice Burns tokens from a blocked account (admin function).\n    /// @param from The address to burn tokens from.\n    /// @param amount The amount of tokens to burn.\n    function burnBlocked(address from, uint256 amount) external;\n\n    /// @notice Burns tokens from the caller's balance with an attached memo.\n    /// @param amount The amount of tokens to burn.\n    /// @param memo The memo to attach to the burn operation.\n    function burnWithMemo(uint256 amount, bytes32 memo) external;\n\n    /// @notice Changes the transfer policy identifier.\n    /// @param newPolicyId The new policy identifier to set.\n    function changeTransferPolicyId(uint64 newPolicyId) external;\n\n    function claimRewards() external returns (uint256 maxAmount);\n\n    function completeQuoteTokenUpdate() external;\n\n    function currency() external view returns (string memory);\n\n    function decimals() external pure returns (uint8);\n\n    function globalRewardPerToken() external view returns (uint256);\n\n    /// @notice Mints new tokens to a specified address.\n    /// @param to The address to mint tokens to.\n    /// @param amount The amount of tokens to mint.\n    function mint(address to, uint256 amount) external;\n\n    /// @notice Mints new tokens to a specified address with an attached memo.\n    /// @param to The address to mint tokens to.\n    /// @param amount The amount of tokens to mint.\n    /// @param memo The memo to attach to the mint operation.\n    function mintWithMemo(address to, uint256 amount, bytes32 memo) external;\n\n    function name() external view returns (string memory);\n\n    function nextQuoteToken() external view returns (ITIP20);\n\n    function optedInSupply() external view returns (uint128);\n\n    /// @notice Pauses the contract, preventing transfers and other operations.\n    function pause() external;\n\n    /// @notice Returns whether the contract is currently paused.\n    /// @return True if the contract is paused, false otherwise.\n    function paused() external view returns (bool);\n\n    function quoteToken() external view returns (ITIP20);\n\n    function setNextQuoteToken(ITIP20 newQuoteToken) external;\n\n    function setRewardRecipient(address newRewardRecipient) external;\n\n    function setSupplyCap(uint256 newSupplyCap) external;\n\n    function distributeReward(uint256 amount) external;\n\n    /// @notice Returns the maximum supply cap for the token.\n    /// @return The supply cap amount.\n    function supplyCap() external view returns (uint256);\n\n    function symbol() external view returns (string memory);\n\n    function systemTransferFrom(address from, address to, uint256 amount) external returns (bool);\n\n    /// @notice Returns the total token supply.\n    /// @return The total amount of tokens in circulation.\n    function totalSupply() external view returns (uint256);\n\n    /// @notice Transfers tokens from caller to another address.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @return success True if the transfer was successful.\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    function transferFeePostTx(address to, uint256 refund, uint256 actualUsed) external;\n\n    function transferFeePreTx(address from, uint256 amount) external;\n\n    /// @notice Transfers tokens from one address to another using allowance.\n    /// @param from The address to transfer tokens from.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @return success True if the transfer was successful.\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n    /// @notice Transfers tokens from one address to another with a memo using allowance.\n    /// @param from The address to transfer tokens from.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @param memo The memo to attach to the transfer.\n    /// @return success True if the transfer was successful.\n    function transferFromWithMemo(address from, address to, uint256 amount, bytes32 memo) external returns (bool);\n\n    /// @notice Returns the current transfer policy identifier.\n    /// @return The active transfer policy ID.\n    function transferPolicyId() external view returns (uint64);\n\n    /// @notice Transfers tokens with an attached memo.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @param memo The memo to attach to the transfer.\n    function transferWithMemo(address to, uint256 amount, bytes32 memo) external;\n\n    /// @notice Unpauses the contract, allowing transfers and other operations to resume.\n    function unpause() external;\n\n    function userRewardInfo(address)\n        external\n        view\n        returns (address rewardRecipient, uint256 rewardPerToken, uint256 rewardBalance);\n\n    /// @notice Calculates the pending claimable rewards for an account without modifying state.\n    /// @dev Returns the total pending claimable reward amount, including stored balance and newly accrued rewards.\n    /// @param account The address to query pending rewards for.\n    /// @return The total pending claimable reward amount.\n    function getPendingRewards(address account) external view returns (uint256);\n\n    // EIP-2612 Permit (TIP-1004)\n\n    /// @notice The permit signature has expired (block.timestamp > deadline)\n    error PermitExpired();\n\n    /// @notice The permit signature is invalid (wrong signer, malformed, or zero address recovered)\n    error InvalidSignature();\n\n    /// @notice Approves `spender` to spend `value` tokens on behalf of `owner` via a signed permit\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n        external;\n\n    /// @notice Returns the current nonce for an address\n    function nonces(address owner) external view returns (uint256);\n\n    /// @notice Returns the EIP-712 domain separator for this token\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"dependencies/tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\n/// @title The interface for TIP-403 transfer policy registry\n/// @notice Registry for managing transfer policies that control which addresses can send or receive tokens\ninterface ITIP403Registry {\n    /// @notice Policy types available for transfer restrictions\n    /// @param WHITELIST Only addresses on the whitelist are authorized for transfers\n    /// @param BLACKLIST All addresses except those on the blacklist are authorized for transfers\n    /// @param COMPOUND TIP-1015: Compound policy referencing three simple policies\n    enum PolicyType {\n        WHITELIST,\n        BLACKLIST,\n        COMPOUND\n    }\n\n    /// @notice Data structure containing policy configuration\n    /// @param policyType The type of policy (whitelist or blacklist)\n    /// @param admin The address authorized to modify this policy\n    struct PolicyData {\n        PolicyType policyType;\n        address admin;\n    }\n\n    /// @notice Error when caller lacks authorization to perform the requested action\n    error Unauthorized();\n\n    /// @notice Error when querying a policy that does not exist\n    error PolicyNotFound();\n\n    /// @notice TIP-1015: Error when a compound policy references a non-simple policy\n    error PolicyNotSimple();\n\n    /// @notice Error when attempting to operate on a policy with incompatible type\n    error IncompatiblePolicyType();\n\n    /// @notice Error when policy has an invalid type\n    error InvalidPolicyType();\n\n    /// @notice TIP-1022 virtual addresses cannot be used as literal policy members\n    error VirtualAddressNotAllowed();\n\n    /// @notice Emitted when a policy's admin is updated\n    /// @param policyId The ID of the policy that was updated\n    /// @param updater The address that performed the update\n    /// @param admin The new admin address for the policy\n    event PolicyAdminUpdated(uint64 indexed policyId, address indexed updater, address indexed admin);\n\n    /// @notice Emitted when a new policy is created\n    /// @param policyId The ID of the newly created policy\n    /// @param updater The address that created the policy\n    /// @param policyType The type of policy that was created\n    event PolicyCreated(uint64 indexed policyId, address indexed updater, PolicyType policyType);\n\n    /// @notice Emitted when a whitelist policy is modified\n    /// @param policyId The ID of the whitelist policy that was updated\n    /// @param updater The address that performed the update\n    /// @param account The account whose whitelist status was changed\n    /// @param allowed Whether the account is now allowed (true) or not (false)\n    event WhitelistUpdated(uint64 indexed policyId, address indexed updater, address indexed account, bool allowed);\n\n    /// @notice Emitted when a blacklist policy is modified\n    /// @param policyId The ID of the blacklist policy that was updated\n    /// @param updater The address that performed the update\n    /// @param account The account whose blacklist status was changed\n    /// @param restricted Whether the account is now restricted (true) or not (false)\n    event BlacklistUpdated(uint64 indexed policyId, address indexed updater, address indexed account, bool restricted);\n\n    /// @notice Returns the current policy ID counter\n    /// @return The next policy ID that will be assigned to a newly created policy\n    function policyIdCounter() external view returns (uint64);\n\n    /// @notice Returns whether a policy exists\n    /// @param policyId The ID of the policy to check\n    /// @return True if the policy exists, false otherwise\n    function policyExists(uint64 policyId) external view returns (bool);\n\n    /// @notice Returns the policy data for a given policy ID\n    /// @param policyId The ID of the policy to query\n    /// @return policyType The type of the policy (whitelist or blacklist)\n    /// @return admin The admin address of the policy\n    function policyData(uint64 policyId) external view returns (PolicyType policyType, address admin);\n\n    /// @notice Creates a new transfer policy without initial accounts\n    /// @param admin The address to be assigned as the admin of the new policy\n    /// @param policyType The type of policy to create (whitelist or blacklist)\n    /// @return newPolicyId The ID of the newly created policy\n    function createPolicy(address admin, PolicyType policyType) external returns (uint64 newPolicyId);\n\n    /// @notice Creates a new transfer policy with initial accounts\n    /// @param admin The address to be assigned as the admin of the new policy\n    /// @param policyType The type of policy to create (whitelist or blacklist)\n    /// @param accounts The initial accounts to add to the policy list\n    /// @return newPolicyId The ID of the newly created policy\n    function createPolicyWithAccounts(address admin, PolicyType policyType, address[] calldata accounts)\n        external\n        returns (uint64 newPolicyId);\n\n    /// @notice Updates the admin address for an existing policy\n    /// @param policyId The ID of the policy to update\n    /// @param admin The new admin address for the policy\n    function setPolicyAdmin(uint64 policyId, address admin) external;\n\n    /// @notice Modifies the whitelist status of an account for a whitelist policy\n    /// @param policyId The ID of the whitelist policy to modify\n    /// @param account The account to update\n    /// @param allowed Whether to allow (true) or disallow (false) the account\n    function modifyPolicyWhitelist(uint64 policyId, address account, bool allowed) external;\n\n    /// @notice Modifies the blacklist status of an account for a blacklist policy\n    /// @param policyId The ID of the blacklist policy to modify\n    /// @param account The account to update\n    /// @param restricted Whether to restrict (true) or unrestrict (false) the account\n    function modifyPolicyBlacklist(uint64 policyId, address account, bool restricted) external;\n\n    /// @notice Checks if a user is authorized under a specific policy\n    /// @param policyId The ID of the policy to check against\n    /// @param user The address to check authorization for\n    /// @return True if the user is authorized, false otherwise\n    function isAuthorized(uint64 policyId, address user) external view returns (bool);\n\n    // =========================================================================\n    //                      TIP-1015: Compound Policies\n    // =========================================================================\n\n    /// @notice TIP-1015: Emitted when a new compound policy is created\n    event CompoundPolicyCreated(\n        uint64 indexed policyId,\n        address indexed creator,\n        uint64 senderPolicyId,\n        uint64 recipientPolicyId,\n        uint64 mintRecipientPolicyId\n    );\n\n    /// @notice TIP-1015: Creates a new immutable compound policy\n    /// @param senderPolicyId Policy ID to check for transfer senders\n    /// @param recipientPolicyId Policy ID to check for transfer recipients\n    /// @param mintRecipientPolicyId Policy ID to check for mint recipients\n    /// @return newPolicyId ID of the newly created compound policy\n    function createCompoundPolicy(uint64 senderPolicyId, uint64 recipientPolicyId, uint64 mintRecipientPolicyId)\n        external\n        returns (uint64 newPolicyId);\n\n    /// @notice TIP-1015: Checks if a user is authorized as a sender\n    /// @param policyId Policy ID to check against\n    /// @param user Address to check\n    /// @return True if authorized to send\n    function isAuthorizedSender(uint64 policyId, address user) external view returns (bool);\n\n    /// @notice TIP-1015: Checks if a user is authorized as a recipient\n    /// @param policyId Policy ID to check against\n    /// @param user Address to check\n    /// @return True if authorized to receive\n    function isAuthorizedRecipient(uint64 policyId, address user) external view returns (bool);\n\n    /// @notice TIP-1015: Checks if a user is authorized as a mint recipient\n    /// @param policyId Policy ID to check against\n    /// @param user Address to check\n    /// @return True if authorized to receive mints\n    function isAuthorizedMintRecipient(uint64 policyId, address user) external view returns (bool);\n\n    /// @notice TIP-1015: Returns the constituent policy IDs for a compound policy\n    /// @param policyId ID of the compound policy to query\n    /// @return senderPolicyId Policy ID for sender checks\n    /// @return recipientPolicyId Policy ID for recipient checks\n    /// @return mintRecipientPolicyId Policy ID for mint recipient checks\n    function compoundPolicyData(uint64 policyId)\n        external\n        view\n        returns (uint64 senderPolicyId, uint64 recipientPolicyId, uint64 mintRecipientPolicyId);\n}\n"},"src/bridgedBRLVRouter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {AccessControlUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\";\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {ITIP20} from \"tempo-std-0.1.6/src/interfaces/ITIP20.sol\";\nimport {ITIP403Registry} from \"tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol\";\nimport {IBridgedBRLVRouter} from \"./interfaces/IBridgedBRLVRouter.sol\";\n\n/**\n * @title bridgedBRLVRouter\n * @notice Cross-chain router for the bridgedBRLV TIP-20.\n * @dev The user-facing token is a TIP-20 instance named \"bridgedBRLV\", deployed via the TIP-20\n * factory. This router handles inbound (canonical → Tempo mint) and outbound (Tempo → canonical\n * burn) operations, plus admin-side blocklist and pause management. It must hold ISSUER_ROLE,\n * PAUSE_ROLE, and UNPAUSE_ROLE on the TIP-20; the burn flow uses EIP-2612 permit + transferFrom +\n * self-burn, requiring no privileged TIP-20 role on that path. User-side ERC-20 operations\n * (transfer, balanceOf, approve, permit) happen on the TIP-20 directly.\n * @custom:security-contact security@crowndigital.xyz\n */\ncontract bridgedBRLVRouter is Initializable, AccessControlUpgradeable, UUPSUpgradeable, IBridgedBRLVRouter {\n    // The TIP-20 instance backing the bridgedBRLV token (created via the TIP-20 factory)\n    ITIP20 public token;\n\n    // The TIP-403 policy registry precompile that owns the BLACKLIST policy below\n    ITIP403Registry public policyRegistry;\n\n    // The BLACKLIST policy ID this contract administers; referenced by token.transferPolicyId\n    uint64 public policyId;\n\n    // Canonical domain identifier — required to match on every mint\n    bytes32 public canonicalDomain;\n\n    // Mapping of processed canonical transactions (replay protection), keyed by txHash\n    mapping(bytes32 => bool) private _processedTxHashes;\n\n    // Access control roles\n    bytes32 public constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\n    bytes32 public constant BURNER_ROLE = keccak256(\"BURNER_ROLE\");\n    bytes32 public constant BLOCKLIST_ROLE = keccak256(\"BLOCKLIST_ROLE\");\n    bytes32 public constant PAUSE_ROLE = keccak256(\"PAUSE_ROLE\");\n    bytes32 public constant UPGRADE_ROLE = keccak256(\"UPGRADE_ROLE\");\n\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor() {\n        _disableInitializers();\n    }\n\n    /**\n     * @notice Initializes the bridgedBRLVRouter. Called once via the ERC1967 proxy at deploy time.\n     * @dev The deployer must have already created the TIP-20 instance via the factory, created a BLACKLIST\n     * policy in the TIP-403 registry, and wired the TIP-20's transferPolicyId to that policy. Post-deploy\n     * steps (transferring policy admin to this contract, granting TIP-20 roles, granting operational roles)\n     * are performed by the deploy script.\n     * @param token_ The TIP-20 instance backing the bridgedBRLV token.\n     * @param policyRegistry_ The TIP-403 policy registry precompile.\n     * @param policyId_ The BLACKLIST policy ID this router administers.\n     * @param canonicalDomain_ The domain identifier of the canonical chain.\n     * @param owner The address that will receive DEFAULT_ADMIN_ROLE.\n     */\n    function initialize(\n        ITIP20 token_,\n        ITIP403Registry policyRegistry_,\n        uint64 policyId_,\n        bytes32 canonicalDomain_,\n        address owner\n    ) external initializer {\n        token = token_;\n        policyRegistry = policyRegistry_;\n        policyId = policyId_;\n        canonicalDomain = canonicalDomain_;\n\n        __AccessControl_init();\n        __UUPSUpgradeable_init();\n\n        _grantRole(DEFAULT_ADMIN_ROLE, owner);\n    }\n\n    /**\n     * @notice Pauses transfers on the underlying TIP-20.\n     * @dev Only callable by accounts with PAUSE_ROLE. This contract must hold PAUSE_ROLE on the TIP-20.\n     */\n    function pause() external onlyRole(PAUSE_ROLE) {\n        token.pause();\n    }\n\n    /**\n     * @notice Unpauses transfers on the underlying TIP-20.\n     * @dev Only callable by accounts with PAUSE_ROLE. This contract must hold UNPAUSE_ROLE on the TIP-20.\n     */\n    function unpause() external onlyRole(PAUSE_ROLE) {\n        token.unpause();\n    }\n\n    /**\n     * @notice Mints tokens via the TIP-20 instance from a canonical chain transaction.\n     * @dev Only callable by accounts with MINTER_ROLE (typically the relayer).\n     * @param canonicalTxHash The transaction hash from the canonical chain.\n     * @param canonicalDomain_ The domain identifier of the canonical chain.\n     * @param amount The amount of tokens to mint.\n     * @param to The recipient address.\n     * @param rewardMultiplier The reward multiplier at the time of mint on canonical chain.\n     */\n    function mint(\n        bytes32 canonicalTxHash,\n        bytes32 canonicalDomain_,\n        uint256 amount,\n        address to,\n        uint256 rewardMultiplier\n    ) external onlyRole(MINTER_ROLE) {\n        // Validate canonical domain\n        if (canonicalDomain_ != canonicalDomain) {\n            revert BridgedBRLVRouterInvalidCanonicalDomain(canonicalDomain_, canonicalDomain);\n        }\n\n        // Check for replay attack — entries are keyed by canonicalTxHash\n        if (_processedTxHashes[canonicalTxHash]) {\n            revert BridgedBRLVRouterTxHashAlreadyProcessed(canonicalTxHash);\n        }\n\n        // Mark transaction as processed\n        _processedTxHashes[canonicalTxHash] = true;\n\n        // Mint tokens to recipient via TIP-20 (canonical tx hash carried as on-chain memo)\n        token.mintWithMemo(to, amount, canonicalTxHash);\n\n        // Emit event for tracking\n        emit BridgedMintCompleted(canonicalTxHash, canonicalDomain_, amount, to, rewardMultiplier);\n    }\n\n    /**\n     * @notice Burns `amount` tokens from `from` via permit + transferFrom + self-burn, signaling a\n     *         bridge-out request to the canonical chain.\n     * @dev Only callable by accounts with BURNER_ROLE (the relayer). Caller must supply an EIP-2612\n     *      permit signed by `from` authorizing this router to spend `amount`. Blocked accounts\n     *      cannot bridge out — TIP-403 rejects the `transferFrom`. Compliance burns of sanctioned\n     *      balances are handled outside this router via TIP-20 `burnBlocked` operated by whoever\n     *      holds `BURN_BLOCKED_ROLE`.\n     * @param from The token holder whose balance is being burned.\n     * @param amount The amount of tokens to burn.\n     * @param deadline EIP-2612 permit deadline.\n     * @param v Permit signature v.\n     * @param r Permit signature r.\n     * @param s Permit signature s.\n     */\n    function burn(\n        address from,\n        uint256 amount,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external onlyRole(BURNER_ROLE) {\n        if (amount == 0) revert BridgedBRLVRouterInvalidAmount();\n        if (from == address(0)) revert BridgedBRLVRouterInvalidAddress();\n\n        token.permit(from, address(this), amount, deadline, v, r, s);\n        token.transferFrom(from, address(this), amount);\n        token.burn(amount);\n\n        emit BridgedBurnRequested(from, amount);\n    }\n\n    /**\n     * @dev Private function to add an account to the TIP-403 BLACKLIST policy.\n     * @param account The account to block.\n     */\n    function _blockAccount(address account) private {\n        if (account == address(0)) {\n            revert BridgedBRLVRouterInvalidBlockedAccount(account);\n        }\n        if (!policyRegistry.isAuthorized(policyId, account)) {\n            revert BridgedBRLVRouterInvalidBlockedAccount(account);\n        }\n\n        policyRegistry.modifyPolicyBlacklist(policyId, account, true);\n        emit AccountBlocked(account);\n    }\n\n    /**\n     * @dev Private function to remove an account from the TIP-403 BLACKLIST policy.\n     * @param account The account to unblock.\n     */\n    function _unblockAccount(address account) private {\n        if (policyRegistry.isAuthorized(policyId, account)) {\n            revert BridgedBRLVRouterInvalidBlockedAccount(account);\n        }\n\n        policyRegistry.modifyPolicyBlacklist(policyId, account, false);\n        emit AccountUnblocked(account);\n    }\n\n    /**\n     * @notice Blocks multiple accounts via the TIP-403 BLACKLIST policy.\n     * @dev Only callable by accounts with BLOCKLIST_ROLE. Blocked accounts are rejected by the TIP-20\n     * precompile on subsequent transfers (with TIP-20's native PolicyForbids error).\n     * @param addresses The addresses to block.\n     */\n    function blockAccounts(address[] calldata addresses) external onlyRole(BLOCKLIST_ROLE) {\n        for (uint256 i = 0; i < addresses.length; i++) {\n            _blockAccount(addresses[i]);\n        }\n    }\n\n    /**\n     * @notice Unblocks multiple accounts via the TIP-403 BLACKLIST policy.\n     * @dev Only callable by accounts with BLOCKLIST_ROLE.\n     * @param addresses The addresses to unblock.\n     */\n    function unblockAccounts(address[] calldata addresses) external onlyRole(BLOCKLIST_ROLE) {\n        for (uint256 i = 0; i < addresses.length; i++) {\n            _unblockAccount(addresses[i]);\n        }\n    }\n\n    /**\n     * @notice Checks if an account is on the TIP-403 BLACKLIST policy.\n     * @param account The account to check.\n     * @return True if the account is blocked, false otherwise.\n     */\n    function isBlocked(address account) public view returns (bool) {\n        return !policyRegistry.isAuthorized(policyId, account);\n    }\n\n    /**\n     * @notice Checks if a canonical txHash has been processed by mint.\n     * @param txHash The transaction hash to check.\n     * @return True if the txHash has been processed, false otherwise.\n     */\n    function isProcessed(bytes32 txHash) external view returns (bool) {\n        return _processedTxHashes[txHash];\n    }\n\n    /**\n     * @notice Returns true if the underlying TIP-20 is paused.\n     * @return True if paused, false otherwise.\n     */\n    function paused() public view returns (bool) {\n        return token.paused();\n    }\n\n    /**\n     * @dev Ensures that only accounts with UPGRADE_ROLE can upgrade the contract.\n     */\n    function _authorizeUpgrade(address) internal override onlyRole(UPGRADE_ROLE) {}\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[44] private __gap;\n}\n"},"src/interfaces/IBridgedBRLVRouter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {ITIP20} from \"tempo-std-0.1.6/src/interfaces/ITIP20.sol\";\nimport {ITIP403Registry} from \"tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol\";\n\n/**\n * @title IBridgedBRLVRouter Interface\n * @notice Cross-chain router for the bridgedBRLV TIP-20. Handles inbound (mint from canonical) and\n *         outbound (burn requesting canonical release) operations, along with admin-side blocklist\n *         and pause management. The user-facing token is a TIP-20 instance deployed via the factory;\n *         this router holds the privileged roles on that instance and admins a TIP-403 BLACKLIST\n *         policy referenced by the TIP-20's transferPolicyId.\n * @custom:security-contact security@crowndigital.xyz\n */\ninterface IBridgedBRLVRouter {\n    // Events\n\n    /**\n     * @notice Emitted when tokens are minted from a canonical chain transaction.\n     * @param canonicalTxHash The transaction hash from the canonical chain.\n     * @param canonicalDomain The domain identifier of the canonical chain.\n     * @param amount The amount of tokens minted.\n     * @param to The recipient address.\n     * @param rewardMultiplier The reward multiplier at the time of mint on canonical chain.\n     */\n    event BridgedMintCompleted(\n        bytes32 indexed canonicalTxHash,\n        bytes32 indexed canonicalDomain,\n        uint256 amount,\n        address indexed to,\n        uint256 rewardMultiplier\n    );\n\n    /**\n     * @notice Emitted when tokens are burned, requesting a burn on the canonical chain.\n     * @param from The address whose tokens were burned.\n     * @param amount The amount of tokens burned.\n     */\n    event BridgedBurnRequested(address indexed from, uint256 amount);\n\n    /**\n     * @notice Emitted when an account is added to the TIP-403 blacklist policy.\n     */\n    event AccountBlocked(address indexed account);\n\n    /**\n     * @notice Emitted when an account is removed from the TIP-403 blacklist policy.\n     */\n    event AccountUnblocked(address indexed account);\n\n    // Errors\n\n    error BridgedBRLVRouterInvalidCanonicalDomain(bytes32 provided, bytes32 expected);\n    error BridgedBRLVRouterTxHashAlreadyProcessed(bytes32 txHash);\n    error BridgedBRLVRouterInvalidBlockedAccount(address account);\n    error BridgedBRLVRouterInvalidAmount();\n    error BridgedBRLVRouterInvalidAddress();\n\n    // Router functions\n\n    /**\n     * @notice Mints tokens via the TIP-20 instance from a canonical chain transaction.\n     * @dev Only callable by accounts with MINTER_ROLE. Calls `tip20.mintWithMemo(to, amount, canonicalTxHash)`.\n     */\n    function mint(\n        bytes32 canonicalTxHash,\n        bytes32 canonicalDomain_,\n        uint256 amount,\n        address to,\n        uint256 rewardMultiplier\n    ) external;\n\n    /**\n     * @notice Burns `amount` tokens from `from` via permit + transferFrom + self-burn, signaling a\n     *         bridge-out request to the canonical chain.\n     * @dev Only callable by accounts with BURNER_ROLE (the relayer). Caller must supply an EIP-2612\n     *      permit signed by `from` authorizing this router to spend `amount`. The router calls\n     *      `tip20.permit(from, address(this), amount, deadline, v, r, s)`, then\n     *      `tip20.transferFrom(from, address(this), amount)`, then `tip20.burn(amount)`. No\n     *      privileged TIP-20 role is needed for this path. Blocked accounts cannot bridge out —\n     *      `transferFrom` is rejected by the TIP-403 policy. Compliance burns of sanctioned balances\n     *      are handled outside the router via TIP-20 `burnBlocked` operated by whoever holds\n     *      `BURN_BLOCKED_ROLE`.\n     */\n    function burn(\n        address from,\n        uint256 amount,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    // Blocklist (TIP-403 BLACKLIST policy)\n\n    function blockAccounts(address[] calldata addresses) external;\n    function unblockAccounts(address[] calldata addresses) external;\n    function isBlocked(address account) external view returns (bool);\n\n    // Pause forwarding\n\n    function pause() external;\n    function unpause() external;\n    function paused() external view returns (bool);\n\n    // Views\n\n    function canonicalDomain() external view returns (bytes32);\n    function isProcessed(bytes32 txHash) external view returns (bool);\n    function token() external view returns (ITIP20);\n    function policyRegistry() external view returns (ITIP403Registry);\n    function policyId() external view returns (uint64);\n}\n"}},"sourceIds":{"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/AccessControlUpgradeable.sol":"0x02d97180d60ce6d05fe0e682b51e7d654e800ec1f847c3592f31ea8f9f2af351","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/IAccessControlUpgradeable.sol":"0x6d3fbd4566bc123db1ee6ba2a1b79544b572df9b9cc9be360ddb3244dd07c86b","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/IERC1967Upgradeable.sol":"0x167828e6f725b1d47d82bc912fd0f1c6ed0fb67a4e5e06a4d62e72b4a53e95cf","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/draft-IERC1822Upgradeable.sol":"0xa94576fd98585c07b2a9725f7c89c910a3a1909a03f49ec2df465327c6a0ffc3","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol":"0x8e179cb7b9755bdeed75982a1ea0124626080d11ef4bd12fb514a18128a2f8af","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/beacon/IBeaconUpgradeable.sol":"0xe0ac7115916f0dce0a8e80769694736f3e674bdc5b2e5853964c82004b1e1cc5","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/Initializable.sol":"0xa2c4e5c274a586f145d278293ae33198cd8f412ab7e6d26f2394c8949b32b24b","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/UUPSUpgradeable.sol":"0x4a86f9f9535a77b73779dc7f673023f3f6f20fce973fea7eff58981ea28acbbf","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/AddressUpgradeable.sol":"0xdb92fc1b515decad3a783b1422190877d2d70b907c6e36fb0998d9465aee42db","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/ContextUpgradeable.sol":"0x2d3d7dc6e116cb8ebb8517208141cb3d0950b337a285f15f8476ec3df29d824e","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StorageSlotUpgradeable.sol":"0x5b478023a1200e1364308ca06cdefec7cb7ab990a1cb904cbbdbaa7ba85076be","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StringsUpgradeable.sol":"0x357c8d1a0fb673fa10a884d6e27b383171ecc3eaf8dee8211de75f88ff77843d","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/ERC165Upgradeable.sol":"0xf8d4b0a3c1d2a05d82534328734f4b2840dc39dcd14abd9e99ac037c94cb2448","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/IERC165Upgradeable.sol":"0xa39bc026ad6214e9ecd526bd4a1ddf9862d80bd4a9d0d031d9bafa4c3c147c0b","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/MathUpgradeable.sol":"0xfbf7ebc0f3c2cf5aef908ecce85e69af53db4e2c6652f61c8ac1e3f416c2fa99","dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/SignedMathUpgradeable.sol":"0x4f06981f993ea4a96e078c2036b5a42e1edade38996e5180171d5fe4be2f18fe","dependencies/tempo-std-0.1.6/src/interfaces/ITIP20.sol":"0x1a5392ab9d6fdcba37d80227a3e1d3c15b3ee3446233f57011272be6e9c183df","dependencies/tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol":"0xc64b83ada92fa70ddf9adc9c8add7dbbce48dc105b7c7b73c848a044c957ce1d","src/bridgedBRLVRouter.sol":"0xd39edc19c24399c7b559b8282ea28df4279b69c88a782f287bab0de572a378e6","src/interfaces/IBridgedBRLVRouter.sol":"0xeaa21ee1a5f907d73e4db37f200ce12259ee7ae2ef85561e0fef214ef9546416"},"signatures":{"function":[{"signature":"supportsInterface(bytes4)","signatureHash32":"0x01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2","signatureHash4":"0x01ffc9a7"},{"signature":"isProcessed(bytes32)","signatureHash32":"0x11c168961d244dc26c0855806690494f93ce5fa07b1897ec50c528e6b6f114f3","signatureHash4":"0x11c16896"},{"signature":"policyRegistry()","signatureHash32":"0x1c4dd7d07eacd9f14c6d2ebdeb130bbb998efe56e6bf60906a8ae9be46462711","signatureHash4":"0x1c4dd7d0"},{"signature":"getRoleAdmin(bytes32)","signatureHash32":"0x248a9ca39e7e298ea3bbd193e7d36b87492efea84ff513fd03940aaa5bc0d98f","signatureHash4":"0x248a9ca3"},{"signature":"BURNER_ROLE()","signatureHash32":"0x282c51f3af86cf09008c9091065d100aa2091c794e99c4010c59f726e11c7aeb","signatureHash4":"0x282c51f3"},{"signature":"grantRole(bytes32,address)","signatureHash32":"0x2f2ff15deca029b64bbc0874ae59c8f39be024a95aa718b4c13ca407db350be8","signatureHash4":"0x2f2ff15d"},{"signature":"renounceRole(bytes32,address)","signatureHash32":"0x36568abe2c7e6c1d662bad0fe1760ac72cf2f9478a86be824d68ec83895c49e9","signatureHash4":"0x36568abe"},{"signature":"upgradeTo(address)","signatureHash32":"0x3659cfe672549963da205df855ebfb8672cda4801e0255183bd6a6f536855df7","signatureHash4":"0x3659cfe6"},{"signature":"PAUSE_ROLE()","signatureHash32":"0x389ed26798273df784e155981b340b82f34f9b26f2c8f66f9f36635c37d97917","signatureHash4":"0x389ed267"},{"signature":"unpause()","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc","signatureHash4":"0x3f4ba83a"},{"signature":"burn(address,uint256,uint256,uint8,bytes32,bytes32)","signatureHash32":"0x4cdce933a5b42f046254ffbe82d42ee28fb2534e298b0d887b2db074a6b20502","signatureHash4":"0x4cdce933"},{"signature":"upgradeToAndCall(address,bytes)","signatureHash32":"0x4f1ef2866b98625bdfefae89411f7a82754ac4089eff8e78c8832329a538337f","signatureHash4":"0x4f1ef286"},{"signature":"proxiableUUID()","signatureHash32":"0x52d1902ddf94a87b87c42e6ab3aff7da3c30beb57dc65dd86cb2543522a55a4c","signatureHash4":"0x52d1902d"},{"signature":"BLOCKLIST_ROLE()","signatureHash32":"0x596b1f4df9cb5f30c910eacdadd3b377c729f623eb81cb10bb2f2c20ebaefc48","signatureHash4":"0x596b1f4d"},{"signature":"paused()","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2","signatureHash4":"0x5c975abb"},{"signature":"blockAccounts(address[])","signatureHash32":"0x6abf7081204dab5940e3a4a0e4565e06f805a4abd1951f5a6389f68604a81c43","signatureHash4":"0x6abf7081"},{"signature":"pause()","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89","signatureHash4":"0x8456cb59"},{"signature":"mint(bytes32,bytes32,uint256,address,uint256)","signatureHash32":"0x8fec57dd8f5ef3f7d50d6ebe14bd7f3e1cd7fc104b0c16c6292fab55c79059af","signatureHash4":"0x8fec57dd"},{"signature":"hasRole(bytes32,address)","signatureHash32":"0x91d1485424b278bc736d5d34907ed48280c7188845bc82b33370da2b4dc1194e","signatureHash4":"0x91d14854"},{"signature":"initialize(address,address,uint64,bytes32,address)","signatureHash32":"0x98efe62d6d4dc098c34a4c7330d03de8c6ab8baa62d91b2f9b4309803cbb5a17","signatureHash4":"0x98efe62d"},{"signature":"DEFAULT_ADMIN_ROLE()","signatureHash32":"0xa217fddfde7807bb766525e432eeeecaaf4de889a05e8df9fb827257fb978cf4","signatureHash4":"0xa217fddf"},{"signature":"UPGRADE_ROLE()","signatureHash32":"0xb908afa865238daf4495b0c67fdfcc89828f622cb1c0eeeb1b0b855330506f18","signatureHash4":"0xb908afa8"},{"signature":"canonicalDomain()","signatureHash32":"0xbb4a05435639a81b40230fc90322181e3495fbaa2266b06194af8e499cf77f30","signatureHash4":"0xbb4a0543"},{"signature":"MINTER_ROLE()","signatureHash32":"0xd5391393148b83454a7ce0feba5669f1be31824be5022ab68df7b94c6f764c96","signatureHash4":"0xd5391393"},{"signature":"revokeRole(bytes32,address)","signatureHash32":"0xd547741fd8d55981251e167708119763c372f2b41e85a1468b0a759b055a009f","signatureHash4":"0xd547741f"},{"signature":"policyId()","signatureHash32":"0xee89ef3a9f9eb77a8df0151120b88b959a2d6e57da023334bbfdf7d2be08347c","signatureHash4":"0xee89ef3a"},{"signature":"unblockAccounts(address[])","signatureHash32":"0xfaed47fd1f1c699dc62e020c40802d3344e219e1209ceff2ba9faa17b1892f06","signatureHash4":"0xfaed47fd"},{"signature":"isBlocked(address)","signatureHash32":"0xfbac395195626cdfbc38cb4668fc8127e6c01660340ed5c9ab96bbb6b8104c4f","signatureHash4":"0xfbac3951"},{"signature":"token()","signatureHash32":"0xfc0c546a8dce9d6e9b97c086302918c9106d97a17809f6bcacfe02124763cb39","signatureHash4":"0xfc0c546a"}],"event":[{"signature":"BeaconUpgraded(address)","signatureHash32":"0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e","signatureHash4":"0x1cf3b03a"},{"signature":"BridgedMintCompleted(bytes32,bytes32,uint256,address,uint256)","signatureHash32":"0x1e058c4f3a13be8a7b8b880554aad8437ae010e0efa514070822351f39616a68","signatureHash4":"0x1e058c4f"},{"signature":"AccountBlocked(address)","signatureHash32":"0x28e9b38569d728986e5868b0e113d9a49ee4c47dfc6db29a673e25b3515a56a8","signatureHash4":"0x28e9b385"},{"signature":"RoleGranted(bytes32,address,address)","signatureHash32":"0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","signatureHash4":"0x2f878811"},{"signature":"AdminChanged(address,address)","signatureHash32":"0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f","signatureHash4":"0x7e644d79"},{"signature":"Initialized(uint8)","signatureHash32":"0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498","signatureHash4":"0x7f26b83f"},{"signature":"AccountUnblocked(address)","signatureHash32":"0xa240927645d1251d97459a96c490f3efd3af585e7b0da4814c92aad8ef6ebbf6","signatureHash4":"0xa2409276"},{"signature":"Upgraded(address)","signatureHash32":"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","signatureHash4":"0xbc7cd75a"},{"signature":"RoleAdminChanged(bytes32,bytes32,bytes32)","signatureHash32":"0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff","signatureHash4":"0xbd79b86f"},{"signature":"BridgedBurnRequested(address,uint256)","signatureHash32":"0xd140e4b36186a1a884cc163ad7ee8c187ea22a5496df5f4f906c2ebf5d82f399","signatureHash4":"0xd140e4b3"},{"signature":"RoleRevoked(bytes32,address,address)","signatureHash32":"0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b","signatureHash4":"0xf6391f5c"}],"error":[{"signature":"BridgedBRLVRouterTxHashAlreadyProcessed(bytes32)","signatureHash32":"0x4151bb87b8fe5f5cc70796e84c545eff32b93ddd7ead1d32ae11822b3478f781","signatureHash4":"0x4151bb87"},{"signature":"BridgedBRLVRouterInvalidCanonicalDomain(bytes32,bytes32)","signatureHash32":"0x653f4c6513a39ac06716d460ad12079a243ee36d06cacfee432bf3fc7238a3f5","signatureHash4":"0x653f4c65"},{"signature":"BridgedBRLVRouterInvalidAddress()","signatureHash32":"0x915bcfe9f6b086b3c95e8be9286cfb3094b7344596a300ac8a9373ef268a0509","signatureHash4":"0x915bcfe9"},{"signature":"BridgedBRLVRouterInvalidBlockedAccount(address)","signatureHash32":"0x93dcb7c14d969e9d235ed9893c0b2ab7db77b8a716e8ffaa12ec55f5ad046bcb","signatureHash4":"0x93dcb7c1"},{"signature":"BridgedBRLVRouterInvalidAmount()","signatureHash32":"0xf45f48189017d1953e6cd4088c631b984ae16046ae635f1a16c56b55a12487e4","signatureHash4":"0xf45f4818"}]},"creationBytecode":{"bytecode":"0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610042575f5ffd5b5061005161005660201b60201c565b6101e6565b5f60019054906101000a900460ff16156100a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161009c90610194565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146101125760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161010991906101cd565b60405180910390a15b565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61017e602783610114565b915061018982610124565b604082019050919050565b5f6020820190508181035f8301526101ab81610172565b9050919050565b5f60ff82169050919050565b6101c7816101b2565b82525050565b5f6020820190506101e05f8301846101be565b92915050565b60805161399161021a5f395f8181610844015281816108d201528181610d6f01528181610dfd0152610eac01526139915ff3fe6080604052600436106101c1575f3560e01c80635c975abb116100f6578063b908afa811610094578063ee89ef3a11610063578063ee89ef3a146105e1578063faed47fd1461060b578063fbac395114610633578063fc0c546a1461066f576101c1565b8063b908afa81461053b578063bb4a054314610565578063d53913931461058f578063d547741f146105b9576101c1565b80638fec57dd116100d05780638fec57dd1461048557806391d14854146104ad57806398efe62d146104e9578063a217fddf14610511576101c1565b80635c975abb1461041d5780636abf7081146104475780638456cb591461046f576101c1565b80633659cfe6116101635780634cdce9331161013d5780634cdce933146103855780634f1ef286146103ad57806352d1902d146103c9578063596b1f4d146103f3576101c1565b80633659cfe61461031d578063389ed267146103455780633f4ba83a1461036f576101c1565b8063248a9ca31161019f578063248a9ca314610267578063282c51f3146102a35780632f2ff15d146102cd57806336568abe146102f5576101c1565b806301ffc9a7146101c557806311c16896146102015780631c4dd7d01461023d575b5f5ffd5b3480156101d0575f5ffd5b506101eb60048036038101906101e6919061267d565b610699565b6040516101f891906126c2565b60405180910390f35b34801561020c575f5ffd5b506102276004803603810190610222919061270e565b610712565b60405161023491906126c2565b60405180910390f35b348015610248575f5ffd5b50610251610738565b60405161025e91906127b3565b60405180910390f35b348015610272575f5ffd5b5061028d6004803603810190610288919061270e565b61075d565b60405161029a91906127db565b60405180910390f35b3480156102ae575f5ffd5b506102b761077a565b6040516102c491906127db565b60405180910390f35b3480156102d8575f5ffd5b506102f360048036038101906102ee919061282f565b61079e565b005b348015610300575f5ffd5b5061031b6004803603810190610316919061282f565b6107bf565b005b348015610328575f5ffd5b50610343600480360381019061033e919061286d565b610842565b005b348015610350575f5ffd5b506103596109c8565b60405161036691906127db565b60405180910390f35b34801561037a575f5ffd5b506103836109ec565b005b348015610390575f5ffd5b506103ab60048036038101906103a69190612901565b610a95565b005b6103c760048036038101906103c29190612ac6565b610d6d565b005b3480156103d4575f5ffd5b506103dd610ea9565b6040516103ea91906127db565b60405180910390f35b3480156103fe575f5ffd5b50610407610f60565b60405161041491906127db565b60405180910390f35b348015610428575f5ffd5b50610431610f84565b60405161043e91906126c2565b60405180910390f35b348015610452575f5ffd5b5061046d60048036038101906104689190612b7d565b611018565b005b34801561047a575f5ffd5b50610483611095565b005b348015610490575f5ffd5b506104ab60048036038101906104a69190612bc8565b61113e565b005b3480156104b8575f5ffd5b506104d360048036038101906104ce919061282f565b611320565b6040516104e091906126c2565b60405180910390f35b3480156104f4575f5ffd5b5061050f600480360381019061050a9190612cf2565b611384565b005b34801561051c575f5ffd5b50610525611587565b60405161053291906127db565b60405180910390f35b348015610546575f5ffd5b5061054f61158d565b60405161055c91906127db565b60405180910390f35b348015610570575f5ffd5b506105796115b1565b60405161058691906127db565b60405180910390f35b34801561059a575f5ffd5b506105a36115b7565b6040516105b091906127db565b60405180910390f35b3480156105c4575f5ffd5b506105df60048036038101906105da919061282f565b6115db565b005b3480156105ec575f5ffd5b506105f56115fc565b6040516106029190612d78565b60405180910390f35b348015610616575f5ffd5b50610631600480360381019061062c9190612b7d565b611616565b005b34801561063e575f5ffd5b506106596004803603810190610654919061286d565b611693565b60405161066691906126c2565b60405180910390f35b34801561067a575f5ffd5b5061068361174d565b6040516106909190612db1565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070b575061070a82611772565b5b9050919050565b5f60fe5f8381526020019081526020015f205f9054906101000a900460ff169050919050565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60655f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6107a78261075d565b6107b0816117db565b6107ba83836117ef565b505050565b6107c76118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90612e4a565b60405180910390fd5b61083e82826118d1565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16036108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661090f6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90612f66565b60405180910390fd5b61096e816119ff565b6109c5815f67ffffffffffffffff81111561098c5761098b6129a2565b5b6040519080825280601f01601f1916602001820160405280156109be5781602001600182028036833780820191505090505b505f611a2d565b50565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610a16816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610a7c575f5ffd5b505af1158015610a8e573d5f5f3e3d5ffd5b5050505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610abf816117db565b5f8603610af8576040517ff45f481800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603610b5d576040517f915bcfe900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf883089898989896040518863ffffffff1660e01b8152600401610bc39796959493929190612fb1565b5f604051808303815f87803b158015610bda575f5ffd5b505af1158015610bec573d5f5f3e3d5ffd5b5050505060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8830896040518463ffffffff1660e01b8152600401610c4e9392919061301e565b6020604051808303815f875af1158015610c6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e919061307d565b5060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68876040518263ffffffff1660e01b8152600401610ce991906130a8565b5f604051808303815f87803b158015610d00575f5ffd5b505af1158015610d12573d5f5f3e3d5ffd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fd140e4b36186a1a884cc163ad7ee8c187ea22a5496df5f4f906c2ebf5d82f39987604051610d5c91906130a8565b60405180910390a250505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610e3a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790612f66565b60405180910390fd5b610e99826119ff565b610ea582826001611a2d565b5050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613131565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d181565b5f60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611013919061307d565b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611042816117db565b5f5f90505b8383905081101561108f576110828484838181106110685761106761314f565b5b905060200201602081019061107d919061286d565b611b97565b8080600101915050611047565b50505050565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d6110bf816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611125575f5ffd5b505af1158015611137573d5f5f3e3d5ffd5b5050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611168816117db565b60fd5485146111b2578460fd546040517f653f4c650000000000000000000000000000000000000000000000000000000081526004016111a992919061317c565b60405180910390fd5b60fe5f8781526020019081526020015f205f9054906101000a900460ff161561121257856040517f4151bb8700000000000000000000000000000000000000000000000000000000815260040161120991906127db565b60405180910390fd5b600160fe5f8881526020019081526020015f205f6101000a81548160ff02191690831515021790555060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e44f0b128486896040518463ffffffff1660e01b8152600401611299939291906131a3565b5f604051808303815f87803b1580156112b0575f5ffd5b505af11580156112c2573d5f5f3e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff1685877f1e058c4f3a13be8a7b8b880554aad8437ae010e0efa514070822351f39616a6887866040516113109291906131d8565b60405180910390a4505050505050565b5f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f60019054906101000a900460ff161590508080156113b4575060015f5f9054906101000a900460ff1660ff16105b806113e157506113c330611de1565b1580156113e0575060015f5f9054906101000a900460ff1660ff16145b5b611420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114179061326f565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff160217905550801561145b5760015f60016101000a81548160ff0219169083151502179055505b8560fb5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460fc5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360fc60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260fd81905550611513611e03565b61151b611e53565b6115275f5f1b836117ef565b801561157f575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161157691906132c6565b60405180910390a15b505050505050565b5f5f1b81565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150881565b60fd5481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6115e48261075d565b6115ed816117db565b6115f783836118d1565b505050565b60fc60149054906101000a900467ffffffffffffffff1681565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611640816117db565b5f5f90505b8383905081101561168d576116808484838181106116665761166561314f565b5b905060200201602081019061167b919061286d565b611ea3565b8080600101915050611645565b50505050565b5f60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16846040518363ffffffff1660e01b81526004016117069291906132df565b602060405180830381865afa158015611721573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611745919061307d565b159050919050565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117ec816117e76118ca565b61207d565b50565b6117f98282611320565b6118c657600160655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061186b6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f33905090565b6118db8282611320565b156119a8575f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061194d6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f6119d87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba101508611a29816117db565b5050565b611a587f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435f1b61210a565b5f015f9054906101000a900460ff1615611a7a57611a7583612113565b611b92565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae257506040513d601f19601f82011682018060405250810190611adf919061331a565b60015b611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906133b5565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613443565b60405180910390fd5b50611b918383836121c9565b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c0757806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611bfe9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611c799291906132df565b602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb8919061307d565b611cf957806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611cf09190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff168360016040518463ffffffff1660e01b8152600401611d6e9392919061347a565b5f604051808303815f87803b158015611d85575f5ffd5b505af1158015611d97573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f28e9b38569d728986e5868b0e113d9a49ee4c47dfc6db29a673e25b3515a56a860405160405180910390a250565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e489061351f565b60405180910390fd5b565b5f60019054906101000a900460ff16611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e989061351f565b60405180910390fd5b565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611f159291906132df565b602060405180830381865afa158015611f30573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f54919061307d565b15611f9657806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611f8d9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff16835f6040518463ffffffff1660e01b815260040161200a9392919061347a565b5f604051808303815f87803b158015612021575f5ffd5b505af1158015612033573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa240927645d1251d97459a96c490f3efd3af585e7b0da4814c92aad8ef6ebbf660405160405180910390a250565b6120878282611320565b6120fd57612094816121f4565b6120a1835f1c6020612221565b6040516020016120b2929190613623565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f49190613694565b60405180910390fd5b5050565b5f819050919050565b5f819050919050565b61211c81611de1565b61215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290613724565b60405180910390fd5b806121877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121d283612456565b5f825111806121de5750805b156121ef576121ed83836124a5565b505b505050565b606061221a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612221565b9050919050565b60605f6002836002612233919061376f565b61223d91906137b0565b67ffffffffffffffff811115612256576122556129a2565b5b6040519080825280601f01601f1916602001820160405280156122885781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106122bf576122be61314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123225761232161314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002612360919061376f565b61236a91906137b0565b90505b6001811115612409577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123ac576123ab61314f565b5b1a60f81b8282815181106123c3576123c261314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080612402906137e3565b905061236d565b505f841461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390613854565b60405180910390fd5b8091505092915050565b61245f81612113565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606124ca8383604051806060016040528060278152602001613935602791396124d2565b905092915050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff16856040516124fb91906138b6565b5f60405180830381855af49150503d805f8114612533576040519150601f19603f3d011682016040523d82523d5f602084013e612538565b606091505b509150915061254986838387612554565b925050509392505050565b606083156125b5575f8351036125ad5761256d85611de1565b6125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a390613916565b60405180910390fd5b5b8290506125c0565b6125bf83836125c8565b5b949350505050565b5f825111156125da5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e9190613694565b60405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61265c81612628565b8114612666575f5ffd5b50565b5f8135905061267781612653565b92915050565b5f6020828403121561269257612691612620565b5b5f61269f84828501612669565b91505092915050565b5f8115159050919050565b6126bc816126a8565b82525050565b5f6020820190506126d55f8301846126b3565b92915050565b5f819050919050565b6126ed816126db565b81146126f7575f5ffd5b50565b5f81359050612708816126e4565b92915050565b5f6020828403121561272357612722612620565b5b5f612730848285016126fa565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61277b61277661277184612739565b612758565b612739565b9050919050565b5f61278c82612761565b9050919050565b5f61279d82612782565b9050919050565b6127ad81612793565b82525050565b5f6020820190506127c65f8301846127a4565b92915050565b6127d5816126db565b82525050565b5f6020820190506127ee5f8301846127cc565b92915050565b5f6127fe82612739565b9050919050565b61280e816127f4565b8114612818575f5ffd5b50565b5f8135905061282981612805565b92915050565b5f5f6040838503121561284557612844612620565b5b5f612852858286016126fa565b92505060206128638582860161281b565b9150509250929050565b5f6020828403121561288257612881612620565b5b5f61288f8482850161281b565b91505092915050565b5f819050919050565b6128aa81612898565b81146128b4575f5ffd5b50565b5f813590506128c5816128a1565b92915050565b5f60ff82169050919050565b6128e0816128cb565b81146128ea575f5ffd5b50565b5f813590506128fb816128d7565b92915050565b5f5f5f5f5f5f60c0878903121561291b5761291a612620565b5b5f61292889828a0161281b565b965050602061293989828a016128b7565b955050604061294a89828a016128b7565b945050606061295b89828a016128ed565b935050608061296c89828a016126fa565b92505060a061297d89828a016126fa565b9150509295509295509295565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129d882612992565b810181811067ffffffffffffffff821117156129f7576129f66129a2565b5b80604052505050565b5f612a09612617565b9050612a1582826129cf565b919050565b5f67ffffffffffffffff821115612a3457612a336129a2565b5b612a3d82612992565b9050602081019050919050565b828183375f83830152505050565b5f612a6a612a6584612a1a565b612a00565b905082815260208101848484011115612a8657612a8561298e565b5b612a91848285612a4a565b509392505050565b5f82601f830112612aad57612aac61298a565b5b8135612abd848260208601612a58565b91505092915050565b5f5f60408385031215612adc57612adb612620565b5b5f612ae98582860161281b565b925050602083013567ffffffffffffffff811115612b0a57612b09612624565b5b612b1685828601612a99565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f83601f840112612b3d57612b3c61298a565b5b8235905067ffffffffffffffff811115612b5a57612b59612b20565b5b602083019150836020820283011115612b7657612b75612b24565b5b9250929050565b5f5f60208385031215612b9357612b92612620565b5b5f83013567ffffffffffffffff811115612bb057612baf612624565b5b612bbc85828601612b28565b92509250509250929050565b5f5f5f5f5f60a08688031215612be157612be0612620565b5b5f612bee888289016126fa565b9550506020612bff888289016126fa565b9450506040612c10888289016128b7565b9350506060612c218882890161281b565b9250506080612c32888289016128b7565b9150509295509295909350565b5f612c49826127f4565b9050919050565b612c5981612c3f565b8114612c63575f5ffd5b50565b5f81359050612c7481612c50565b92915050565b5f612c84826127f4565b9050919050565b612c9481612c7a565b8114612c9e575f5ffd5b50565b5f81359050612caf81612c8b565b92915050565b5f67ffffffffffffffff82169050919050565b612cd181612cb5565b8114612cdb575f5ffd5b50565b5f81359050612cec81612cc8565b92915050565b5f5f5f5f5f60a08688031215612d0b57612d0a612620565b5b5f612d1888828901612c66565b9550506020612d2988828901612ca1565b9450506040612d3a88828901612cde565b9350506060612d4b888289016126fa565b9250506080612d5c8882890161281b565b9150509295509295909350565b612d7281612cb5565b82525050565b5f602082019050612d8b5f830184612d69565b92915050565b5f612d9b82612782565b9050919050565b612dab81612d91565b82525050565b5f602082019050612dc45f830184612da2565b92915050565b5f82825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612e34602f83612dca565b9150612e3f82612dda565b604082019050919050565b5f6020820190508181035f830152612e6181612e28565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b5f612ec2602c83612dca565b9150612ecd82612e68565b604082019050919050565b5f6020820190508181035f830152612eef81612eb6565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b5f612f50602c83612dca565b9150612f5b82612ef6565b604082019050919050565b5f6020820190508181035f830152612f7d81612f44565b9050919050565b612f8d816127f4565b82525050565b612f9c81612898565b82525050565b612fab816128cb565b82525050565b5f60e082019050612fc45f83018a612f84565b612fd16020830189612f84565b612fde6040830188612f93565b612feb6060830187612f93565b612ff86080830186612fa2565b61300560a08301856127cc565b61301260c08301846127cc565b98975050505050505050565b5f6060820190506130315f830186612f84565b61303e6020830185612f84565b61304b6040830184612f93565b949350505050565b61305c816126a8565b8114613066575f5ffd5b50565b5f8151905061307781613053565b92915050565b5f6020828403121561309257613091612620565b5b5f61309f84828501613069565b91505092915050565b5f6020820190506130bb5f830184612f93565b92915050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c5f8201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b5f61311b603883612dca565b9150613126826130c1565b604082019050919050565b5f6020820190508181035f8301526131488161310f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60408201905061318f5f8301856127cc565b61319c60208301846127cc565b9392505050565b5f6060820190506131b65f830186612f84565b6131c36020830185612f93565b6131d060408301846127cc565b949350505050565b5f6040820190506131eb5f830185612f93565b6131f86020830184612f93565b9392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f613259602e83612dca565b9150613264826131ff565b604082019050919050565b5f6020820190508181035f8301526132868161324d565b9050919050565b5f819050919050565b5f6132b06132ab6132a68461328d565b612758565b6128cb565b9050919050565b6132c081613296565b82525050565b5f6020820190506132d95f8301846132b7565b92915050565b5f6040820190506132f25f830185612d69565b6132ff6020830184612f84565b9392505050565b5f81519050613314816126e4565b92915050565b5f6020828403121561332f5761332e612620565b5b5f61333c84828501613306565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e746174695f8201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b5f61339f602e83612dca565b91506133aa82613345565b604082019050919050565b5f6020820190508181035f8301526133cc81613393565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f785f8201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b5f61342d602983612dca565b9150613438826133d3565b604082019050919050565b5f6020820190508181035f83015261345a81613421565b9050919050565b5f6020820190506134745f830184612f84565b92915050565b5f60608201905061348d5f830186612d69565b61349a6020830185612f84565b6134a760408301846126b3565b949350505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f613509602b83612dca565b9150613514826134af565b604082019050919050565b5f6020820190508181035f830152613536816134fd565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f61357b60178361353d565b915061358682613547565b601782019050919050565b5f81519050919050565b8281835e5f83830152505050565b5f6135b382613591565b6135bd818561353d565b93506135cd81856020860161359b565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61360d60118361353d565b9150613618826135d9565b601182019050919050565b5f61362d8261356f565b915061363982856135a9565b915061364482613601565b915061365082846135a9565b91508190509392505050565b5f61366682613591565b6136708185612dca565b935061368081856020860161359b565b61368981612992565b840191505092915050565b5f6020820190508181035f8301526136ac818461365c565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e5f8201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b5f61370e602d83612dca565b9150613719826136b4565b604082019050919050565b5f6020820190508181035f83015261373b81613702565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61377982612898565b915061378483612898565b925082820261379281612898565b915082820484148315176137a9576137a8613742565b5b5092915050565b5f6137ba82612898565b91506137c583612898565b92508282019050808211156137dd576137dc613742565b5b92915050565b5f6137ed82612898565b91505f82036137ff576137fe613742565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61383e602083612dca565b91506138498261380a565b602082019050919050565b5f6020820190508181035f83015261386b81613832565b9050919050565b5f81519050919050565b5f81905092915050565b5f61389082613872565b61389a818561387c565b93506138aa81856020860161359b565b80840191505092915050565b5f6138c18284613886565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f613900601d83612dca565b915061390b826138cc565b602082019050919050565b5f6020820190508181035f83015261392d816138f4565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200b7149a0fe875551868c96b00664223e918c558d3324a88bf0918f9399ccfb0f64736f6c63430008220033","sourceMap":"1297:9335:18:-:0;;;1198:4:7;1155:48;;;;;;;;;2459:53:18;;;;;;;;;;2483:22;:20;;;:22;;:::i;:::-;1297:9335;;5939:280:6;6007:13;;;;;;;;;;;6006:14;5998:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6094:15;6078:31;;:12;;;;;;;;;;;:31;;;6074:139;;6140:15;6125:12;;:30;;;;;;;;;;;;;;;;;;6174:28;6186:15;6174:28;;;;;;:::i;:::-;;;;;;;;6074:139;5939:280::o;7:169:20:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:226::-;322:34;318:1;310:6;306:14;299:58;391:9;386:2;378:6;374:15;367:34;182:226;:::o;414:366::-;556:3;577:67;641:2;636:3;577:67;:::i;:::-;570:74;;653:93;742:3;653:93;:::i;:::-;771:2;766:3;762:12;755:19;;414:366;;;:::o;786:419::-;952:4;990:2;979:9;975:18;967:26;;1039:9;1033:4;1029:20;1025:1;1014:9;1010:17;1003:47;1067:131;1193:4;1067:131;:::i;:::-;1059:139;;786:419;;;:::o;1211:86::-;1246:7;1286:4;1279:5;1275:16;1264:27;;1211:86;;;:::o;1303:112::-;1386:22;1402:5;1386:22;:::i;:::-;1381:3;1374:35;1303:112;;:::o;1421:214::-;1510:4;1548:2;1537:9;1533:18;1525:26;;1561:67;1625:1;1614:9;1610:17;1601:6;1561:67;:::i;:::-;1421:214;;;;:::o;1297:9335:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":null},"runtimeBytecode":{"bytecode":"0x6080604052600436106101c1575f3560e01c80635c975abb116100f6578063b908afa811610094578063ee89ef3a11610063578063ee89ef3a146105e1578063faed47fd1461060b578063fbac395114610633578063fc0c546a1461066f576101c1565b8063b908afa81461053b578063bb4a054314610565578063d53913931461058f578063d547741f146105b9576101c1565b80638fec57dd116100d05780638fec57dd1461048557806391d14854146104ad57806398efe62d146104e9578063a217fddf14610511576101c1565b80635c975abb1461041d5780636abf7081146104475780638456cb591461046f576101c1565b80633659cfe6116101635780634cdce9331161013d5780634cdce933146103855780634f1ef286146103ad57806352d1902d146103c9578063596b1f4d146103f3576101c1565b80633659cfe61461031d578063389ed267146103455780633f4ba83a1461036f576101c1565b8063248a9ca31161019f578063248a9ca314610267578063282c51f3146102a35780632f2ff15d146102cd57806336568abe146102f5576101c1565b806301ffc9a7146101c557806311c16896146102015780631c4dd7d01461023d575b5f5ffd5b3480156101d0575f5ffd5b506101eb60048036038101906101e6919061267d565b610699565b6040516101f891906126c2565b60405180910390f35b34801561020c575f5ffd5b506102276004803603810190610222919061270e565b610712565b60405161023491906126c2565b60405180910390f35b348015610248575f5ffd5b50610251610738565b60405161025e91906127b3565b60405180910390f35b348015610272575f5ffd5b5061028d6004803603810190610288919061270e565b61075d565b60405161029a91906127db565b60405180910390f35b3480156102ae575f5ffd5b506102b761077a565b6040516102c491906127db565b60405180910390f35b3480156102d8575f5ffd5b506102f360048036038101906102ee919061282f565b61079e565b005b348015610300575f5ffd5b5061031b6004803603810190610316919061282f565b6107bf565b005b348015610328575f5ffd5b50610343600480360381019061033e919061286d565b610842565b005b348015610350575f5ffd5b506103596109c8565b60405161036691906127db565b60405180910390f35b34801561037a575f5ffd5b506103836109ec565b005b348015610390575f5ffd5b506103ab60048036038101906103a69190612901565b610a95565b005b6103c760048036038101906103c29190612ac6565b610d6d565b005b3480156103d4575f5ffd5b506103dd610ea9565b6040516103ea91906127db565b60405180910390f35b3480156103fe575f5ffd5b50610407610f60565b60405161041491906127db565b60405180910390f35b348015610428575f5ffd5b50610431610f84565b60405161043e91906126c2565b60405180910390f35b348015610452575f5ffd5b5061046d60048036038101906104689190612b7d565b611018565b005b34801561047a575f5ffd5b50610483611095565b005b348015610490575f5ffd5b506104ab60048036038101906104a69190612bc8565b61113e565b005b3480156104b8575f5ffd5b506104d360048036038101906104ce919061282f565b611320565b6040516104e091906126c2565b60405180910390f35b3480156104f4575f5ffd5b5061050f600480360381019061050a9190612cf2565b611384565b005b34801561051c575f5ffd5b50610525611587565b60405161053291906127db565b60405180910390f35b348015610546575f5ffd5b5061054f61158d565b60405161055c91906127db565b60405180910390f35b348015610570575f5ffd5b506105796115b1565b60405161058691906127db565b60405180910390f35b34801561059a575f5ffd5b506105a36115b7565b6040516105b091906127db565b60405180910390f35b3480156105c4575f5ffd5b506105df60048036038101906105da919061282f565b6115db565b005b3480156105ec575f5ffd5b506105f56115fc565b6040516106029190612d78565b60405180910390f35b348015610616575f5ffd5b50610631600480360381019061062c9190612b7d565b611616565b005b34801561063e575f5ffd5b506106596004803603810190610654919061286d565b611693565b60405161066691906126c2565b60405180910390f35b34801561067a575f5ffd5b5061068361174d565b6040516106909190612db1565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070b575061070a82611772565b5b9050919050565b5f60fe5f8381526020019081526020015f205f9054906101000a900460ff169050919050565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60655f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6107a78261075d565b6107b0816117db565b6107ba83836117ef565b505050565b6107c76118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90612e4a565b60405180910390fd5b61083e82826118d1565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16036108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661090f6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90612f66565b60405180910390fd5b61096e816119ff565b6109c5815f67ffffffffffffffff81111561098c5761098b6129a2565b5b6040519080825280601f01601f1916602001820160405280156109be5781602001600182028036833780820191505090505b505f611a2d565b50565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610a16816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610a7c575f5ffd5b505af1158015610a8e573d5f5f3e3d5ffd5b5050505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610abf816117db565b5f8603610af8576040517ff45f481800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603610b5d576040517f915bcfe900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf883089898989896040518863ffffffff1660e01b8152600401610bc39796959493929190612fb1565b5f604051808303815f87803b158015610bda575f5ffd5b505af1158015610bec573d5f5f3e3d5ffd5b5050505060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8830896040518463ffffffff1660e01b8152600401610c4e9392919061301e565b6020604051808303815f875af1158015610c6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e919061307d565b5060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68876040518263ffffffff1660e01b8152600401610ce991906130a8565b5f604051808303815f87803b158015610d00575f5ffd5b505af1158015610d12573d5f5f3e3d5ffd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fd140e4b36186a1a884cc163ad7ee8c187ea22a5496df5f4f906c2ebf5d82f39987604051610d5c91906130a8565b60405180910390a250505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610e3a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790612f66565b60405180910390fd5b610e99826119ff565b610ea582826001611a2d565b5050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613131565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d181565b5f60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611013919061307d565b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611042816117db565b5f5f90505b8383905081101561108f576110828484838181106110685761106761314f565b5b905060200201602081019061107d919061286d565b611b97565b8080600101915050611047565b50505050565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d6110bf816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611125575f5ffd5b505af1158015611137573d5f5f3e3d5ffd5b5050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611168816117db565b60fd5485146111b2578460fd546040517f653f4c650000000000000000000000000000000000000000000000000000000081526004016111a992919061317c565b60405180910390fd5b60fe5f8781526020019081526020015f205f9054906101000a900460ff161561121257856040517f4151bb8700000000000000000000000000000000000000000000000000000000815260040161120991906127db565b60405180910390fd5b600160fe5f8881526020019081526020015f205f6101000a81548160ff02191690831515021790555060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e44f0b128486896040518463ffffffff1660e01b8152600401611299939291906131a3565b5f604051808303815f87803b1580156112b0575f5ffd5b505af11580156112c2573d5f5f3e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff1685877f1e058c4f3a13be8a7b8b880554aad8437ae010e0efa514070822351f39616a6887866040516113109291906131d8565b60405180910390a4505050505050565b5f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f60019054906101000a900460ff161590508080156113b4575060015f5f9054906101000a900460ff1660ff16105b806113e157506113c330611de1565b1580156113e0575060015f5f9054906101000a900460ff1660ff16145b5b611420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114179061326f565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff160217905550801561145b5760015f60016101000a81548160ff0219169083151502179055505b8560fb5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460fc5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360fc60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260fd81905550611513611e03565b61151b611e53565b6115275f5f1b836117ef565b801561157f575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161157691906132c6565b60405180910390a15b505050505050565b5f5f1b81565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150881565b60fd5481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6115e48261075d565b6115ed816117db565b6115f783836118d1565b505050565b60fc60149054906101000a900467ffffffffffffffff1681565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611640816117db565b5f5f90505b8383905081101561168d576116808484838181106116665761166561314f565b5b905060200201602081019061167b919061286d565b611ea3565b8080600101915050611645565b50505050565b5f60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16846040518363ffffffff1660e01b81526004016117069291906132df565b602060405180830381865afa158015611721573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611745919061307d565b159050919050565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117ec816117e76118ca565b61207d565b50565b6117f98282611320565b6118c657600160655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061186b6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f33905090565b6118db8282611320565b156119a8575f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061194d6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f6119d87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba101508611a29816117db565b5050565b611a587f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435f1b61210a565b5f015f9054906101000a900460ff1615611a7a57611a7583612113565b611b92565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae257506040513d601f19601f82011682018060405250810190611adf919061331a565b60015b611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906133b5565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613443565b60405180910390fd5b50611b918383836121c9565b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c0757806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611bfe9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611c799291906132df565b602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb8919061307d565b611cf957806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611cf09190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff168360016040518463ffffffff1660e01b8152600401611d6e9392919061347a565b5f604051808303815f87803b158015611d85575f5ffd5b505af1158015611d97573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f28e9b38569d728986e5868b0e113d9a49ee4c47dfc6db29a673e25b3515a56a860405160405180910390a250565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e489061351f565b60405180910390fd5b565b5f60019054906101000a900460ff16611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e989061351f565b60405180910390fd5b565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611f159291906132df565b602060405180830381865afa158015611f30573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f54919061307d565b15611f9657806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611f8d9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff16835f6040518463ffffffff1660e01b815260040161200a9392919061347a565b5f604051808303815f87803b158015612021575f5ffd5b505af1158015612033573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa240927645d1251d97459a96c490f3efd3af585e7b0da4814c92aad8ef6ebbf660405160405180910390a250565b6120878282611320565b6120fd57612094816121f4565b6120a1835f1c6020612221565b6040516020016120b2929190613623565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f49190613694565b60405180910390fd5b5050565b5f819050919050565b5f819050919050565b61211c81611de1565b61215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290613724565b60405180910390fd5b806121877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121d283612456565b5f825111806121de5750805b156121ef576121ed83836124a5565b505b505050565b606061221a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612221565b9050919050565b60605f6002836002612233919061376f565b61223d91906137b0565b67ffffffffffffffff811115612256576122556129a2565b5b6040519080825280601f01601f1916602001820160405280156122885781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106122bf576122be61314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123225761232161314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002612360919061376f565b61236a91906137b0565b90505b6001811115612409577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123ac576123ab61314f565b5b1a60f81b8282815181106123c3576123c261314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080612402906137e3565b905061236d565b505f841461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390613854565b60405180910390fd5b8091505092915050565b61245f81612113565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606124ca8383604051806060016040528060278152602001613935602791396124d2565b905092915050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff16856040516124fb91906138b6565b5f60405180830381855af49150503d805f8114612533576040519150601f19603f3d011682016040523d82523d5f602084013e612538565b606091505b509150915061254986838387612554565b925050509392505050565b606083156125b5575f8351036125ad5761256d85611de1565b6125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a390613916565b60405180910390fd5b5b8290506125c0565b6125bf83836125c8565b5b949350505050565b5f825111156125da5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e9190613694565b60405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61265c81612628565b8114612666575f5ffd5b50565b5f8135905061267781612653565b92915050565b5f6020828403121561269257612691612620565b5b5f61269f84828501612669565b91505092915050565b5f8115159050919050565b6126bc816126a8565b82525050565b5f6020820190506126d55f8301846126b3565b92915050565b5f819050919050565b6126ed816126db565b81146126f7575f5ffd5b50565b5f81359050612708816126e4565b92915050565b5f6020828403121561272357612722612620565b5b5f612730848285016126fa565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61277b61277661277184612739565b612758565b612739565b9050919050565b5f61278c82612761565b9050919050565b5f61279d82612782565b9050919050565b6127ad81612793565b82525050565b5f6020820190506127c65f8301846127a4565b92915050565b6127d5816126db565b82525050565b5f6020820190506127ee5f8301846127cc565b92915050565b5f6127fe82612739565b9050919050565b61280e816127f4565b8114612818575f5ffd5b50565b5f8135905061282981612805565b92915050565b5f5f6040838503121561284557612844612620565b5b5f612852858286016126fa565b92505060206128638582860161281b565b9150509250929050565b5f6020828403121561288257612881612620565b5b5f61288f8482850161281b565b91505092915050565b5f819050919050565b6128aa81612898565b81146128b4575f5ffd5b50565b5f813590506128c5816128a1565b92915050565b5f60ff82169050919050565b6128e0816128cb565b81146128ea575f5ffd5b50565b5f813590506128fb816128d7565b92915050565b5f5f5f5f5f5f60c0878903121561291b5761291a612620565b5b5f61292889828a0161281b565b965050602061293989828a016128b7565b955050604061294a89828a016128b7565b945050606061295b89828a016128ed565b935050608061296c89828a016126fa565b92505060a061297d89828a016126fa565b9150509295509295509295565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129d882612992565b810181811067ffffffffffffffff821117156129f7576129f66129a2565b5b80604052505050565b5f612a09612617565b9050612a1582826129cf565b919050565b5f67ffffffffffffffff821115612a3457612a336129a2565b5b612a3d82612992565b9050602081019050919050565b828183375f83830152505050565b5f612a6a612a6584612a1a565b612a00565b905082815260208101848484011115612a8657612a8561298e565b5b612a91848285612a4a565b509392505050565b5f82601f830112612aad57612aac61298a565b5b8135612abd848260208601612a58565b91505092915050565b5f5f60408385031215612adc57612adb612620565b5b5f612ae98582860161281b565b925050602083013567ffffffffffffffff811115612b0a57612b09612624565b5b612b1685828601612a99565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f83601f840112612b3d57612b3c61298a565b5b8235905067ffffffffffffffff811115612b5a57612b59612b20565b5b602083019150836020820283011115612b7657612b75612b24565b5b9250929050565b5f5f60208385031215612b9357612b92612620565b5b5f83013567ffffffffffffffff811115612bb057612baf612624565b5b612bbc85828601612b28565b92509250509250929050565b5f5f5f5f5f60a08688031215612be157612be0612620565b5b5f612bee888289016126fa565b9550506020612bff888289016126fa565b9450506040612c10888289016128b7565b9350506060612c218882890161281b565b9250506080612c32888289016128b7565b9150509295509295909350565b5f612c49826127f4565b9050919050565b612c5981612c3f565b8114612c63575f5ffd5b50565b5f81359050612c7481612c50565b92915050565b5f612c84826127f4565b9050919050565b612c9481612c7a565b8114612c9e575f5ffd5b50565b5f81359050612caf81612c8b565b92915050565b5f67ffffffffffffffff82169050919050565b612cd181612cb5565b8114612cdb575f5ffd5b50565b5f81359050612cec81612cc8565b92915050565b5f5f5f5f5f60a08688031215612d0b57612d0a612620565b5b5f612d1888828901612c66565b9550506020612d2988828901612ca1565b9450506040612d3a88828901612cde565b9350506060612d4b888289016126fa565b9250506080612d5c8882890161281b565b9150509295509295909350565b612d7281612cb5565b82525050565b5f602082019050612d8b5f830184612d69565b92915050565b5f612d9b82612782565b9050919050565b612dab81612d91565b82525050565b5f602082019050612dc45f830184612da2565b92915050565b5f82825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612e34602f83612dca565b9150612e3f82612dda565b604082019050919050565b5f6020820190508181035f830152612e6181612e28565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b5f612ec2602c83612dca565b9150612ecd82612e68565b604082019050919050565b5f6020820190508181035f830152612eef81612eb6565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b5f612f50602c83612dca565b9150612f5b82612ef6565b604082019050919050565b5f6020820190508181035f830152612f7d81612f44565b9050919050565b612f8d816127f4565b82525050565b612f9c81612898565b82525050565b612fab816128cb565b82525050565b5f60e082019050612fc45f83018a612f84565b612fd16020830189612f84565b612fde6040830188612f93565b612feb6060830187612f93565b612ff86080830186612fa2565b61300560a08301856127cc565b61301260c08301846127cc565b98975050505050505050565b5f6060820190506130315f830186612f84565b61303e6020830185612f84565b61304b6040830184612f93565b949350505050565b61305c816126a8565b8114613066575f5ffd5b50565b5f8151905061307781613053565b92915050565b5f6020828403121561309257613091612620565b5b5f61309f84828501613069565b91505092915050565b5f6020820190506130bb5f830184612f93565b92915050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c5f8201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b5f61311b603883612dca565b9150613126826130c1565b604082019050919050565b5f6020820190508181035f8301526131488161310f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60408201905061318f5f8301856127cc565b61319c60208301846127cc565b9392505050565b5f6060820190506131b65f830186612f84565b6131c36020830185612f93565b6131d060408301846127cc565b949350505050565b5f6040820190506131eb5f830185612f93565b6131f86020830184612f93565b9392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f613259602e83612dca565b9150613264826131ff565b604082019050919050565b5f6020820190508181035f8301526132868161324d565b9050919050565b5f819050919050565b5f6132b06132ab6132a68461328d565b612758565b6128cb565b9050919050565b6132c081613296565b82525050565b5f6020820190506132d95f8301846132b7565b92915050565b5f6040820190506132f25f830185612d69565b6132ff6020830184612f84565b9392505050565b5f81519050613314816126e4565b92915050565b5f6020828403121561332f5761332e612620565b5b5f61333c84828501613306565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e746174695f8201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b5f61339f602e83612dca565b91506133aa82613345565b604082019050919050565b5f6020820190508181035f8301526133cc81613393565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f785f8201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b5f61342d602983612dca565b9150613438826133d3565b604082019050919050565b5f6020820190508181035f83015261345a81613421565b9050919050565b5f6020820190506134745f830184612f84565b92915050565b5f60608201905061348d5f830186612d69565b61349a6020830185612f84565b6134a760408301846126b3565b949350505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f613509602b83612dca565b9150613514826134af565b604082019050919050565b5f6020820190508181035f830152613536816134fd565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f61357b60178361353d565b915061358682613547565b601782019050919050565b5f81519050919050565b8281835e5f83830152505050565b5f6135b382613591565b6135bd818561353d565b93506135cd81856020860161359b565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61360d60118361353d565b9150613618826135d9565b601182019050919050565b5f61362d8261356f565b915061363982856135a9565b915061364482613601565b915061365082846135a9565b91508190509392505050565b5f61366682613591565b6136708185612dca565b935061368081856020860161359b565b61368981612992565b840191505092915050565b5f6020820190508181035f8301526136ac818461365c565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e5f8201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b5f61370e602d83612dca565b9150613719826136b4565b604082019050919050565b5f6020820190508181035f83015261373b81613702565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61377982612898565b915061378483612898565b925082820261379281612898565b915082820484148315176137a9576137a8613742565b5b5092915050565b5f6137ba82612898565b91506137c583612898565b92508282019050808211156137dd576137dc613742565b5b92915050565b5f6137ed82612898565b91505f82036137ff576137fe613742565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61383e602083612dca565b91506138498261380a565b602082019050919050565b5f6020820190508181035f83015261386b81613832565b9050919050565b5f81519050919050565b5f81905092915050565b5f61389082613872565b61389a818561387c565b93506138aa81856020860161359b565b80840191505092915050565b5f6138c18284613886565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f613900601d83612dca565b915061390b826138cc565b602082019050919050565b5f6020820190508181035f83015261392d816138f4565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200b7149a0fe875551868c96b00664223e918c558d3324a88bf0918f9399ccfb0f64736f6c63430008220033","sourceMap":"1297:9335:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3050:213:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9822:116:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1609:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4855:129:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2127:62:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5280:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6389:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3408:195:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2269:60:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4270:81;;;;;;;;;;;;;:::i;:::-;;6760:531;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3922:220:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3027:131;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2195:68:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10072:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8654:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4004:77;;;;;;;;;;;;;:::i;:::-;;4879:991;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3350:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3363:456:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2320:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2335:64:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1848:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2059:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5705:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1748:22:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9063:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9471:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1500:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3050:213:0;3135:4;3173:43;3158:58;;;:11;:58;;;;:98;;;;3220:36;3244:11;3220:23;:36::i;:::-;3158:98;3151:105;;3050:213;;;:::o;9822:116:18:-;9882:4;9905:18;:26;9924:6;9905:26;;;;;;;;;;;;;;;;;;;;;9898:33;;9822:116;;;:::o;1609:37::-;;;;;;;;;;;;;:::o;4855:129:0:-;4929:7;4955:6;:12;4962:4;4955:12;;;;;;;;;;;:22;;;4948:29;;4855:129;;;:::o;2127:62:18:-;2165:24;2127:62;:::o;5280:145:0:-;5363:18;5376:4;5363:12;:18::i;:::-;2798:16;2809:4;2798:10;:16::i;:::-;5393:25:::1;5404:4;5410:7;5393:10;:25::i;:::-;5280:145:::0;;;:::o;6389:214::-;6495:12;:10;:12::i;:::-;6484:23;;:7;:23;;;6476:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6570:26;6582:4;6588:7;6570:11;:26::i;:::-;6389:214;;:::o;3408:195:7:-;1764:6;1747:23;;1755:4;1747:23;;;1739:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1861:6;1837:30;;:20;:18;:20::i;:::-;:30;;;1829:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3489:36:::1;3507:17;3489;:36::i;:::-;3535:61;3557:17;3586:1;3576:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3590:5;3535:21;:61::i;:::-;3408:195:::0;:::o;2269:60:18:-;2306:23;2269:60;:::o;4270:81::-;2306:23;2798:16:0;2809:4;2798:10;:16::i;:::-;4329:5:18::1;;;;;;;;;;;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4270:81:::0;:::o;6760:531::-;2165:24;2798:16:0;2809:4;2798:10;:16::i;:::-;6962:1:18::1;6952:6;:11:::0;6948:56:::1;;6972:32;;;;;;;;;;;;;;6948:56;7034:1;7018:18;;:4;:18;;::::0;7014:64:::1;;7045:33;;;;;;;;;;;;;;7014:64;7089:5;;;;;;;;;;;:12;;;7102:4;7116;7123:6;7131:8;7141:1;7144;7147;7089:60;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7159:5;;;;;;;;;;;:18;;;7178:4;7192;7199:6;7159:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7216:5;;;;;;;;;;;:10;;;7227:6;7216:18;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7271:4;7250:34;;;7277:6;7250:34;;;;;;:::i;:::-;;;;;;;;6760:531:::0;;;;;;;:::o;3922:220:7:-;1764:6;1747:23;;1755:4;1747:23;;;1739:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1861:6;1837:30;;:20;:18;:20::i;:::-;:30;;;1829:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;4037:36:::1;4055:17;4037;:36::i;:::-;4083:52;4105:17;4124:4;4130;4083:21;:52::i;:::-;3922:220:::0;;:::o;3027:131::-;3105:7;2199:6;2182:23;;2190:4;2182:23;;;2174:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;1180:66:4::1;3131:20:7;;3124:27;;3027:131:::0;:::o;2195:68:18:-;2236:27;2195:68;:::o;10072:83::-;10111:4;10134:5;;;;;;;;;;;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10127:21;;10072:83;:::o;8654:202::-;2236:27;2798:16:0;2809:4;2798:10;:16::i;:::-;8756:9:18::1;8768:1;8756:13;;8751:99;8775:9;;:16;;8771:1;:20;8751:99;;;8812:27;8826:9;;8836:1;8826:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;8812:13;:27::i;:::-;8793:3;;;;;;;8751:99;;;;8654:202:::0;;;:::o;4004:77::-;2306:23;2798:16:0;2809:4;2798:10;:16::i;:::-;4061:5:18::1;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4004:77:::0;:::o;4879:991::-;2097:24;2798:16:0;2809:4;2798:10;:16::i;:::-;5146:15:18::1;;5126:16;:35;5122:147;;5224:16;5242:15;;5184:74;;;;;;;;;;;;:::i;:::-;;;;;;;;5122:147;5359:18;:35;5378:15;5359:35;;;;;;;;;;;;;;;;;;;;;5355:129;;;5457:15;5417:56;;;;;;;;;;;:::i;:::-;;;;;;;;5355:129;5573:4;5535:18;:35;5554:15;5535:35;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;5680:5;;;;;;;;;;;:18;;;5699:2;5703:6;5711:15;5680:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5842:2;5778:85;;5816:16;5799:15;5778:85;5834:6;5846:16;5778:85;;;;;;;:::i;:::-;;;;;;;;4879:991:::0;;;;;;:::o;3350:145:0:-;3436:4;3459:6;:12;3466:4;3459:12;;;;;;;;;;;:20;;:29;3480:7;3459:29;;;;;;;;;;;;;;;;;;;;;;;;;3452:36;;3350:145;;;;:::o;3363:456:18:-;3279:19:6;3302:13;;;;;;;;;;;3301:14;3279:36;;3347:14;:34;;;;;3380:1;3365:12;;;;;;;;;;;:16;;;3347:34;3346:108;;;;3388:44;3426:4;3388:29;:44::i;:::-;3387:45;:66;;;;;3452:1;3436:12;;;;;;;;;;;:17;;;3387:66;3346:108;3325:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;3551:1;3536:12;;:16;;;;;;;;;;;;;;;;;;3566:14;3562:65;;;3612:4;3596:13;;:20;;;;;;;;;;;;;;;;;;3562:65;3575:6:18::1;3567:5;;:14;;;;;;;;;;;;;;;;;;3608:15;3591:14;;:32;;;;;;;;;;;;;;;;;;3644:9;3633:8;;:20;;;;;;;;;;;;;;;;;;3681:16;3663:15;:34;;;;3708:22;:20;:22::i;:::-;3740:24;:22;:24::i;:::-;3775:37;2365:4:0;3786:18:18;;3806:5;3775:10;:37::i;:::-;3651:14:6::0;3647:99;;;3697:5;3681:13;;:21;;;;;;;;;;;;;;;;;;3721:14;3733:1;3721:14;;;;;;:::i;:::-;;;;;;;;3647:99;3269:483;3363:456:18;;;;;:::o;2320:49:0:-;2365:4;2320:49;;;:::o;2335:64:18:-;2374:25;2335:64;:::o;1848:30::-;;;;:::o;2059:62::-;2097:24;2059:62;:::o;5705:147:0:-;5789:18;5802:4;5789:12;:18::i;:::-;2798:16;2809:4;2798:10;:16::i;:::-;5819:26:::1;5831:4;5837:7;5819:11;:26::i;:::-;5705:147:::0;;;:::o;1748:22:18:-;;;;;;;;;;;;;:::o;9063:206::-;2236:27;2798:16:0;2809:4;2798:10;:16::i;:::-;9167:9:18::1;9179:1;9167:13;;9162:101;9186:9;;:16;;9182:1;:20;9162:101;;;9223:29;9239:9;;9249:1;9239:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;9223:15;:29::i;:::-;9204:3;;;;;;;9162:101;;;;9063:206:::0;;;:::o;9471:134::-;9528:4;9552:14;;;;;;;;;;;:27;;;9580:8;;;;;;;;;;;9590:7;9552:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9551:47;9544:54;;9471:134;;;:::o;1500:19::-;;;;;;;;;;;;;:::o;1081:166:12:-;1166:4;1204:36;1189:51;;;:11;:51;;;;1182:58;;1081:166;;;:::o;3789:103:0:-;3855:30;3866:4;3872:12;:10;:12::i;:::-;3855:10;:30::i;:::-;3789:103;:::o;7938:233::-;8021:22;8029:4;8035:7;8021;:22::i;:::-;8016:149;;8091:4;8059:6;:12;8066:4;8059:12;;;;;;;;;;;:20;;:29;8080:7;8059:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;8141:12;:10;:12::i;:::-;8114:40;;8132:7;8114:40;;8126:4;8114:40;;;;;;;;;;8016:149;7938:233;;:::o;886:96:9:-;939:7;965:10;958:17;;886:96;:::o;8342:234:0:-;8425:22;8433:4;8439:7;8425;:22::i;:::-;8421:149;;;8495:5;8463:6;:12;8470:4;8463:12;;;;;;;;;;;:20;;:29;8484:7;8463:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8546:12;:10;:12::i;:::-;8519:40;;8537:7;8519:40;;8531:4;8519:40;;;;;;;;;;8421:149;8342:234;;:::o;1478:151:4:-;1531:7;1557:59;1180:66;1595:20;;1557:37;:59::i;:::-;:65;;;;;;;;;;;;1550:72;;1478:151;:::o;10260:79:18:-;2374:25;2798:16:0;2809:4;2798:10;:16::i;:::-;10260:79:18;;:::o;2841:944:4:-;3257:53;839:66;3295:14;;3257:37;:53::i;:::-;:59;;;;;;;;;;;;3253:526;;;3332:37;3351:17;3332:18;:37::i;:::-;3253:526;;;3433:17;3404:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3400:302;;3631:56;;;;;;;;;;:::i;:::-;;;;;;;;3400:302;1180:66;3525:20;;3517:4;:28;3509:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;3468:138;3715:53;3733:17;3752:4;3758:9;3715:17;:53::i;:::-;3253:526;2841:944;;;:::o;7437:421:18:-;7518:1;7499:21;;:7;:21;;;7495:106;;7582:7;7543:47;;;;;;;;;;;:::i;:::-;;;;;;;;7495:106;7615:14;;;;;;;;;;;:27;;;7643:8;;;;;;;;;;;7653:7;7615:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7610:132;;7723:7;7684:47;;;;;;;;;;;:::i;:::-;;;;;;;;7610:132;7752:14;;;;;;;;;;;:36;;;7789:8;;;;;;;;;;;7799:7;7808:4;7752:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7843:7;7828:23;;;;;;;;;;;;7437:421;:::o;1423:320:8:-;1483:4;1735:1;1713:7;:19;;;:23;1706:30;;1423:320;;;:::o;2838:65:0:-;5374:13:6;;;;;;;;;;;5366:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2838:65:0:o;2290:67:7:-;5374:13:6;;;;;;;;;;;5366:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2290:67:7:o;8011:310:18:-;8075:14;;;;;;;;;;;:27;;;8103:8;;;;;;;;;;;8113:7;8075:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8071:131;;;8183:7;8144:47;;;;;;;;;;;:::i;:::-;;;;;;;;8071:131;8212:14;;;;;;;;;;;:36;;;8249:8;;;;;;;;;;;8259:7;8268:5;8212:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8306:7;8289:25;;;;;;;;;;;;8011:310;:::o;4173:501:0:-;4261:22;4269:4;4275:7;4261;:22::i;:::-;4256:412;;4444:39;4475:7;4444:30;:39::i;:::-;4554:49;4593:4;4585:13;;4600:2;4554:30;:49::i;:::-;4351:274;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4299:358;;;;;;;;;;;:::i;:::-;;;;;;;;4256:412;4173:501;;:::o;1870:190:10:-;1931:21;2040:4;2030:14;;1870:190;;;:::o;2158:::-;2219:21;2328:4;2318:14;;2158:190;;;:::o;1720:281:4:-;1801:48;1831:17;1801:29;:48::i;:::-;1793:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1977:17;1909:59;1180:66;1947:20;;1909:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;1720:281;:::o;2393:276::-;2501:29;2512:17;2501:10;:29::i;:::-;2558:1;2544:4;:11;:15;:28;;;;2563:9;2544:28;2540:123;;;2588:64;2628:17;2647:4;2588:39;:64::i;:::-;;2540:123;2393:276;;;:::o;2473:149:11:-;2531:13;2563:52;2591:4;2575:22;;376:2;2563:52;;:11;:52::i;:::-;2556:59;;2473:149;;;:::o;1884:437::-;1959:13;1984:19;2029:1;2020:6;2016:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2006:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1984:47;;2041:15;:6;2048:1;2041:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;2066;:6;2073:1;2066:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;2096:9;2121:1;2112:6;2108:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2096:26;;2091:128;2128:1;2124;:5;2091:128;;;2162:8;2179:3;2171:5;:11;2162:21;;;;;;;:::i;:::-;;;;;2150:6;2157:1;2150:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;2207:1;2197:11;;;;;2131:3;;;;:::i;:::-;;;2091:128;;;;2245:1;2236:5;:10;2228:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:6;2293:21;;;1884:437;;;;:::o;2107:152:4:-;2173:37;2192:17;2173:18;:37::i;:::-;2234:17;2225:27;;;;;;;;;;;;2107:152;:::o;6685:198:8:-;6768:12;6799:77;6820:6;6828:4;6799:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;6792:84;;6685:198;;;;:::o;7069:325::-;7210:12;7235;7249:23;7276:6;:19;;7296:4;7276:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7234:67;;;;7318:69;7345:6;7353:7;7362:10;7374:12;7318:26;:69::i;:::-;7311:76;;;;7069:325;;;;;:::o;7682:628::-;7862:12;7890:7;7886:418;;;7938:1;7917:10;:17;:22;7913:286;;8132:18;8143:6;8132:10;:18::i;:::-;8124:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7913:286;8219:10;8212:17;;;;7886:418;8260:33;8268:10;8280:12;8260:7;:33::i;:::-;7682:628;;;;;;;:::o;8832:540::-;9011:1;8991:10;:17;:21;8987:379;;;9219:10;9213:17;9275:15;9262:10;9258:2;9254:19;9247:44;8987:379;9342:12;9335:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:75:20;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:126::-;2246:7;2286:42;2279:5;2275:54;2264:65;;2209:126;;;:::o;2341:60::-;2369:3;2390:5;2383:12;;2341:60;;;:::o;2407:142::-;2457:9;2490:53;2508:34;2517:24;2535:5;2517:24;:::i;:::-;2508:34;:::i;:::-;2490:53;:::i;:::-;2477:66;;2407:142;;;:::o;2555:126::-;2605:9;2638:37;2669:5;2638:37;:::i;:::-;2625:50;;2555:126;;;:::o;2687:150::-;2761:9;2794:37;2825:5;2794:37;:::i;:::-;2781:50;;2687:150;;;:::o;2843:179::-;2954:61;3009:5;2954:61;:::i;:::-;2949:3;2942:74;2843:179;;:::o;3028:270::-;3145:4;3183:2;3172:9;3168:18;3160:26;;3196:95;3288:1;3277:9;3273:17;3264:6;3196:95;:::i;:::-;3028:270;;;;:::o;3304:118::-;3391:24;3409:5;3391:24;:::i;:::-;3386:3;3379:37;3304:118;;:::o;3428:222::-;3521:4;3559:2;3548:9;3544:18;3536:26;;3572:71;3640:1;3629:9;3625:17;3616:6;3572:71;:::i;:::-;3428:222;;;;:::o;3656:96::-;3693:7;3722:24;3740:5;3722:24;:::i;:::-;3711:35;;3656:96;;;:::o;3758:122::-;3831:24;3849:5;3831:24;:::i;:::-;3824:5;3821:35;3811:63;;3870:1;3867;3860:12;3811:63;3758:122;:::o;3886:139::-;3932:5;3970:6;3957:20;3948:29;;3986:33;4013:5;3986:33;:::i;:::-;3886:139;;;;:::o;4031:474::-;4099:6;4107;4156:2;4144:9;4135:7;4131:23;4127:32;4124:119;;;4162:79;;:::i;:::-;4124:119;4282:1;4307:53;4352:7;4343:6;4332:9;4328:22;4307:53;:::i;:::-;4297:63;;4253:117;4409:2;4435:53;4480:7;4471:6;4460:9;4456:22;4435:53;:::i;:::-;4425:63;;4380:118;4031:474;;;;;:::o;4511:329::-;4570:6;4619:2;4607:9;4598:7;4594:23;4590:32;4587:119;;;4625:79;;:::i;:::-;4587:119;4745:1;4770:53;4815:7;4806:6;4795:9;4791:22;4770:53;:::i;:::-;4760:63;;4716:117;4511:329;;;;:::o;4846:77::-;4883:7;4912:5;4901:16;;4846:77;;;:::o;4929:122::-;5002:24;5020:5;5002:24;:::i;:::-;4995:5;4992:35;4982:63;;5041:1;5038;5031:12;4982:63;4929:122;:::o;5057:139::-;5103:5;5141:6;5128:20;5119:29;;5157:33;5184:5;5157:33;:::i;:::-;5057:139;;;;:::o;5202:86::-;5237:7;5277:4;5270:5;5266:16;5255:27;;5202:86;;;:::o;5294:118::-;5365:22;5381:5;5365:22;:::i;:::-;5358:5;5355:33;5345:61;;5402:1;5399;5392:12;5345:61;5294:118;:::o;5418:135::-;5462:5;5500:6;5487:20;5478:29;;5516:31;5541:5;5516:31;:::i;:::-;5418:135;;;;:::o;5559:1053::-;5661:6;5669;5677;5685;5693;5701;5750:3;5738:9;5729:7;5725:23;5721:33;5718:120;;;5757:79;;:::i;:::-;5718:120;5877:1;5902:53;5947:7;5938:6;5927:9;5923:22;5902:53;:::i;:::-;5892:63;;5848:117;6004:2;6030:53;6075:7;6066:6;6055:9;6051:22;6030:53;:::i;:::-;6020:63;;5975:118;6132:2;6158:53;6203:7;6194:6;6183:9;6179:22;6158:53;:::i;:::-;6148:63;;6103:118;6260:2;6286:51;6329:7;6320:6;6309:9;6305:22;6286:51;:::i;:::-;6276:61;;6231:116;6386:3;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6357:119;6515:3;6542:53;6587:7;6578:6;6567:9;6563:22;6542:53;:::i;:::-;6532:63;;6486:119;5559:1053;;;;;;;;:::o;6618:117::-;6727:1;6724;6717:12;6741:117;6850:1;6847;6840:12;6864:102;6905:6;6956:2;6952:7;6947:2;6940:5;6936:14;6932:28;6922:38;;6864:102;;;:::o;6972:180::-;7020:77;7017:1;7010:88;7117:4;7114:1;7107:15;7141:4;7138:1;7131:15;7158:281;7241:27;7263:4;7241:27;:::i;:::-;7233:6;7229:40;7371:6;7359:10;7356:22;7335:18;7323:10;7320:34;7317:62;7314:88;;;7382:18;;:::i;:::-;7314:88;7422:10;7418:2;7411:22;7201:238;7158:281;;:::o;7445:129::-;7479:6;7506:20;;:::i;:::-;7496:30;;7535:33;7563:4;7555:6;7535:33;:::i;:::-;7445:129;;;:::o;7580:307::-;7641:4;7731:18;7723:6;7720:30;7717:56;;;7753:18;;:::i;:::-;7717:56;7791:29;7813:6;7791:29;:::i;:::-;7783:37;;7875:4;7869;7865:15;7857:23;;7580:307;;;:::o;7893:148::-;7991:6;7986:3;7981;7968:30;8032:1;8023:6;8018:3;8014:16;8007:27;7893:148;;;:::o;8047:423::-;8124:5;8149:65;8165:48;8206:6;8165:48;:::i;:::-;8149:65;:::i;:::-;8140:74;;8237:6;8230:5;8223:21;8275:4;8268:5;8264:16;8313:3;8304:6;8299:3;8295:16;8292:25;8289:112;;;8320:79;;:::i;:::-;8289:112;8410:54;8457:6;8452:3;8447;8410:54;:::i;:::-;8130:340;8047:423;;;;;:::o;8489:338::-;8544:5;8593:3;8586:4;8578:6;8574:17;8570:27;8560:122;;8601:79;;:::i;:::-;8560:122;8718:6;8705:20;8743:78;8817:3;8809:6;8802:4;8794:6;8790:17;8743:78;:::i;:::-;8734:87;;8550:277;8489:338;;;;:::o;8833:652::-;8910:6;8918;8967:2;8955:9;8946:7;8942:23;8938:32;8935:119;;;8973:79;;:::i;:::-;8935:119;9093:1;9118:53;9163:7;9154:6;9143:9;9139:22;9118:53;:::i;:::-;9108:63;;9064:117;9248:2;9237:9;9233:18;9220:32;9279:18;9271:6;9268:30;9265:117;;;9301:79;;:::i;:::-;9265:117;9406:62;9460:7;9451:6;9440:9;9436:22;9406:62;:::i;:::-;9396:72;;9191:287;8833:652;;;;;:::o;9491:117::-;9600:1;9597;9590:12;9614:117;9723:1;9720;9713:12;9754:568;9827:8;9837:6;9887:3;9880:4;9872:6;9868:17;9864:27;9854:122;;9895:79;;:::i;:::-;9854:122;10008:6;9995:20;9985:30;;10038:18;10030:6;10027:30;10024:117;;;10060:79;;:::i;:::-;10024:117;10174:4;10166:6;10162:17;10150:29;;10228:3;10220:4;10212:6;10208:17;10198:8;10194:32;10191:41;10188:128;;;10235:79;;:::i;:::-;10188:128;9754:568;;;;;:::o;10328:559::-;10414:6;10422;10471:2;10459:9;10450:7;10446:23;10442:32;10439:119;;;10477:79;;:::i;:::-;10439:119;10625:1;10614:9;10610:17;10597:31;10655:18;10647:6;10644:30;10641:117;;;10677:79;;:::i;:::-;10641:117;10790:80;10862:7;10853:6;10842:9;10838:22;10790:80;:::i;:::-;10772:98;;;;10568:312;10328:559;;;;;:::o;10893:911::-;10988:6;10996;11004;11012;11020;11069:3;11057:9;11048:7;11044:23;11040:33;11037:120;;;11076:79;;:::i;:::-;11037:120;11196:1;11221:53;11266:7;11257:6;11246:9;11242:22;11221:53;:::i;:::-;11211:63;;11167:117;11323:2;11349:53;11394:7;11385:6;11374:9;11370:22;11349:53;:::i;:::-;11339:63;;11294:118;11451:2;11477:53;11522:7;11513:6;11502:9;11498:22;11477:53;:::i;:::-;11467:63;;11422:118;11579:2;11605:53;11650:7;11641:6;11630:9;11626:22;11605:53;:::i;:::-;11595:63;;11550:118;11707:3;11734:53;11779:7;11770:6;11759:9;11755:22;11734:53;:::i;:::-;11724:63;;11678:119;10893:911;;;;;;;;:::o;11810:111::-;11862:7;11891:24;11909:5;11891:24;:::i;:::-;11880:35;;11810:111;;;:::o;11927:152::-;12015:39;12048:5;12015:39;:::i;:::-;12008:5;12005:50;11995:78;;12069:1;12066;12059:12;11995:78;11927:152;:::o;12085:169::-;12146:5;12184:6;12171:20;12162:29;;12200:48;12242:5;12200:48;:::i;:::-;12085:169;;;;:::o;12260:120::-;12321:7;12350:24;12368:5;12350:24;:::i;:::-;12339:35;;12260:120;;;:::o;12386:170::-;12483:48;12525:5;12483:48;:::i;:::-;12476:5;12473:59;12463:87;;12546:1;12543;12536:12;12463:87;12386:170;:::o;12562:187::-;12632:5;12670:6;12657:20;12648:29;;12686:57;12737:5;12686:57;:::i;:::-;12562:187;;;;:::o;12755:101::-;12791:7;12831:18;12824:5;12820:30;12809:41;;12755:101;;;:::o;12862:120::-;12934:23;12951:5;12934:23;:::i;:::-;12927:5;12924:34;12914:62;;12972:1;12969;12962:12;12914:62;12862:120;:::o;12988:137::-;13033:5;13071:6;13058:20;13049:29;;13087:32;13113:5;13087:32;:::i;:::-;12988:137;;;;:::o;13131:987::-;13264:6;13272;13280;13288;13296;13345:3;13333:9;13324:7;13320:23;13316:33;13313:120;;;13352:79;;:::i;:::-;13313:120;13472:1;13497:68;13557:7;13548:6;13537:9;13533:22;13497:68;:::i;:::-;13487:78;;13443:132;13614:2;13640:77;13709:7;13700:6;13689:9;13685:22;13640:77;:::i;:::-;13630:87;;13585:142;13766:2;13792:52;13836:7;13827:6;13816:9;13812:22;13792:52;:::i;:::-;13782:62;;13737:117;13893:2;13919:53;13964:7;13955:6;13944:9;13940:22;13919:53;:::i;:::-;13909:63;;13864:118;14021:3;14048:53;14093:7;14084:6;14073:9;14069:22;14048:53;:::i;:::-;14038:63;;13992:119;13131:987;;;;;;;;:::o;14124:115::-;14209:23;14226:5;14209:23;:::i;:::-;14204:3;14197:36;14124:115;;:::o;14245:218::-;14336:4;14374:2;14363:9;14359:18;14351:26;;14387:69;14453:1;14442:9;14438:17;14429:6;14387:69;:::i;:::-;14245:218;;;;:::o;14469:141::-;14534:9;14567:37;14598:5;14567:37;:::i;:::-;14554:50;;14469:141;;;:::o;14616:161::-;14718:52;14764:5;14718:52;:::i;:::-;14713:3;14706:65;14616:161;;:::o;14783:252::-;14891:4;14929:2;14918:9;14914:18;14906:26;;14942:86;15025:1;15014:9;15010:17;15001:6;14942:86;:::i;:::-;14783:252;;;;:::o;15041:169::-;15125:11;15159:6;15154:3;15147:19;15199:4;15194:3;15190:14;15175:29;;15041:169;;;;:::o;15216:234::-;15356:34;15352:1;15344:6;15340:14;15333:58;15425:17;15420:2;15412:6;15408:15;15401:42;15216:234;:::o;15456:366::-;15598:3;15619:67;15683:2;15678:3;15619:67;:::i;:::-;15612:74;;15695:93;15784:3;15695:93;:::i;:::-;15813:2;15808:3;15804:12;15797:19;;15456:366;;;:::o;15828:419::-;15994:4;16032:2;16021:9;16017:18;16009:26;;16081:9;16075:4;16071:20;16067:1;16056:9;16052:17;16045:47;16109:131;16235:4;16109:131;:::i;:::-;16101:139;;15828:419;;;:::o;16253:231::-;16393:34;16389:1;16381:6;16377:14;16370:58;16462:14;16457:2;16449:6;16445:15;16438:39;16253:231;:::o;16490:366::-;16632:3;16653:67;16717:2;16712:3;16653:67;:::i;:::-;16646:74;;16729:93;16818:3;16729:93;:::i;:::-;16847:2;16842:3;16838:12;16831:19;;16490:366;;;:::o;16862:419::-;17028:4;17066:2;17055:9;17051:18;17043:26;;17115:9;17109:4;17105:20;17101:1;17090:9;17086:17;17079:47;17143:131;17269:4;17143:131;:::i;:::-;17135:139;;16862:419;;;:::o;17287:231::-;17427:34;17423:1;17415:6;17411:14;17404:58;17496:14;17491:2;17483:6;17479:15;17472:39;17287:231;:::o;17524:366::-;17666:3;17687:67;17751:2;17746:3;17687:67;:::i;:::-;17680:74;;17763:93;17852:3;17763:93;:::i;:::-;17881:2;17876:3;17872:12;17865:19;;17524:366;;;:::o;17896:419::-;18062:4;18100:2;18089:9;18085:18;18077:26;;18149:9;18143:4;18139:20;18135:1;18124:9;18120:17;18113:47;18177:131;18303:4;18177:131;:::i;:::-;18169:139;;17896:419;;;:::o;18321:118::-;18408:24;18426:5;18408:24;:::i;:::-;18403:3;18396:37;18321:118;;:::o;18445:::-;18532:24;18550:5;18532:24;:::i;:::-;18527:3;18520:37;18445:118;;:::o;18569:112::-;18652:22;18668:5;18652:22;:::i;:::-;18647:3;18640:35;18569:112;;:::o;18687:878::-;18944:4;18982:3;18971:9;18967:19;18959:27;;18996:71;19064:1;19053:9;19049:17;19040:6;18996:71;:::i;:::-;19077:72;19145:2;19134:9;19130:18;19121:6;19077:72;:::i;:::-;19159;19227:2;19216:9;19212:18;19203:6;19159:72;:::i;:::-;19241;19309:2;19298:9;19294:18;19285:6;19241:72;:::i;:::-;19323:69;19387:3;19376:9;19372:19;19363:6;19323:69;:::i;:::-;19402:73;19470:3;19459:9;19455:19;19446:6;19402:73;:::i;:::-;19485;19553:3;19542:9;19538:19;19529:6;19485:73;:::i;:::-;18687:878;;;;;;;;;;:::o;19571:442::-;19720:4;19758:2;19747:9;19743:18;19735:26;;19771:71;19839:1;19828:9;19824:17;19815:6;19771:71;:::i;:::-;19852:72;19920:2;19909:9;19905:18;19896:6;19852:72;:::i;:::-;19934;20002:2;19991:9;19987:18;19978:6;19934:72;:::i;:::-;19571:442;;;;;;:::o;20019:116::-;20089:21;20104:5;20089:21;:::i;:::-;20082:5;20079:32;20069:60;;20125:1;20122;20115:12;20069:60;20019:116;:::o;20141:137::-;20195:5;20226:6;20220:13;20211:22;;20242:30;20266:5;20242:30;:::i;:::-;20141:137;;;;:::o;20284:345::-;20351:6;20400:2;20388:9;20379:7;20375:23;20371:32;20368:119;;;20406:79;;:::i;:::-;20368:119;20526:1;20551:61;20604:7;20595:6;20584:9;20580:22;20551:61;:::i;:::-;20541:71;;20497:125;20284:345;;;;:::o;20635:222::-;20728:4;20766:2;20755:9;20751:18;20743:26;;20779:71;20847:1;20836:9;20832:17;20823:6;20779:71;:::i;:::-;20635:222;;;;:::o;20863:243::-;21003:34;20999:1;20991:6;20987:14;20980:58;21072:26;21067:2;21059:6;21055:15;21048:51;20863:243;:::o;21112:366::-;21254:3;21275:67;21339:2;21334:3;21275:67;:::i;:::-;21268:74;;21351:93;21440:3;21351:93;:::i;:::-;21469:2;21464:3;21460:12;21453:19;;21112:366;;;:::o;21484:419::-;21650:4;21688:2;21677:9;21673:18;21665:26;;21737:9;21731:4;21727:20;21723:1;21712:9;21708:17;21701:47;21765:131;21891:4;21765:131;:::i;:::-;21757:139;;21484:419;;;:::o;21909:180::-;21957:77;21954:1;21947:88;22054:4;22051:1;22044:15;22078:4;22075:1;22068:15;22095:332;22216:4;22254:2;22243:9;22239:18;22231:26;;22267:71;22335:1;22324:9;22320:17;22311:6;22267:71;:::i;:::-;22348:72;22416:2;22405:9;22401:18;22392:6;22348:72;:::i;:::-;22095:332;;;;;:::o;22433:442::-;22582:4;22620:2;22609:9;22605:18;22597:26;;22633:71;22701:1;22690:9;22686:17;22677:6;22633:71;:::i;:::-;22714:72;22782:2;22771:9;22767:18;22758:6;22714:72;:::i;:::-;22796;22864:2;22853:9;22849:18;22840:6;22796:72;:::i;:::-;22433:442;;;;;;:::o;22881:332::-;23002:4;23040:2;23029:9;23025:18;23017:26;;23053:71;23121:1;23110:9;23106:17;23097:6;23053:71;:::i;:::-;23134:72;23202:2;23191:9;23187:18;23178:6;23134:72;:::i;:::-;22881:332;;;;;:::o;23219:233::-;23359:34;23355:1;23347:6;23343:14;23336:58;23428:16;23423:2;23415:6;23411:15;23404:41;23219:233;:::o;23458:366::-;23600:3;23621:67;23685:2;23680:3;23621:67;:::i;:::-;23614:74;;23697:93;23786:3;23697:93;:::i;:::-;23815:2;23810:3;23806:12;23799:19;;23458:366;;;:::o;23830:419::-;23996:4;24034:2;24023:9;24019:18;24011:26;;24083:9;24077:4;24073:20;24069:1;24058:9;24054:17;24047:47;24111:131;24237:4;24111:131;:::i;:::-;24103:139;;23830:419;;;:::o;24255:85::-;24300:7;24329:5;24318:16;;24255:85;;;:::o;24346:154::-;24402:9;24435:59;24451:42;24460:32;24486:5;24460:32;:::i;:::-;24451:42;:::i;:::-;24435:59;:::i;:::-;24422:72;;24346:154;;;:::o;24506:143::-;24599:43;24636:5;24599:43;:::i;:::-;24594:3;24587:56;24506:143;;:::o;24655:234::-;24754:4;24792:2;24781:9;24777:18;24769:26;;24805:77;24879:1;24868:9;24864:17;24855:6;24805:77;:::i;:::-;24655:234;;;;:::o;24895:328::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25065:69;25131:1;25120:9;25116:17;25107:6;25065:69;:::i;:::-;25144:72;25212:2;25201:9;25197:18;25188:6;25144:72;:::i;:::-;24895:328;;;;;:::o;25229:143::-;25286:5;25317:6;25311:13;25302:22;;25333:33;25360:5;25333:33;:::i;:::-;25229:143;;;;:::o;25378:351::-;25448:6;25497:2;25485:9;25476:7;25472:23;25468:32;25465:119;;;25503:79;;:::i;:::-;25465:119;25623:1;25648:64;25704:7;25695:6;25684:9;25680:22;25648:64;:::i;:::-;25638:74;;25594:128;25378:351;;;;:::o;25735:233::-;25875:34;25871:1;25863:6;25859:14;25852:58;25944:16;25939:2;25931:6;25927:15;25920:41;25735:233;:::o;25974:366::-;26116:3;26137:67;26201:2;26196:3;26137:67;:::i;:::-;26130:74;;26213:93;26302:3;26213:93;:::i;:::-;26331:2;26326:3;26322:12;26315:19;;25974:366;;;:::o;26346:419::-;26512:4;26550:2;26539:9;26535:18;26527:26;;26599:9;26593:4;26589:20;26585:1;26574:9;26570:17;26563:47;26627:131;26753:4;26627:131;:::i;:::-;26619:139;;26346:419;;;:::o;26771:228::-;26911:34;26907:1;26899:6;26895:14;26888:58;26980:11;26975:2;26967:6;26963:15;26956:36;26771:228;:::o;27005:366::-;27147:3;27168:67;27232:2;27227:3;27168:67;:::i;:::-;27161:74;;27244:93;27333:3;27244:93;:::i;:::-;27362:2;27357:3;27353:12;27346:19;;27005:366;;;:::o;27377:419::-;27543:4;27581:2;27570:9;27566:18;27558:26;;27630:9;27624:4;27620:20;27616:1;27605:9;27601:17;27594:47;27658:131;27784:4;27658:131;:::i;:::-;27650:139;;27377:419;;;:::o;27802:222::-;27895:4;27933:2;27922:9;27918:18;27910:26;;27946:71;28014:1;28003:9;27999:17;27990:6;27946:71;:::i;:::-;27802:222;;;;:::o;28030:426::-;28171:4;28209:2;28198:9;28194:18;28186:26;;28222:69;28288:1;28277:9;28273:17;28264:6;28222:69;:::i;:::-;28301:72;28369:2;28358:9;28354:18;28345:6;28301:72;:::i;:::-;28383:66;28445:2;28434:9;28430:18;28421:6;28383:66;:::i;:::-;28030:426;;;;;;:::o;28462:230::-;28602:34;28598:1;28590:6;28586:14;28579:58;28671:13;28666:2;28658:6;28654:15;28647:38;28462:230;:::o;28698:366::-;28840:3;28861:67;28925:2;28920:3;28861:67;:::i;:::-;28854:74;;28937:93;29026:3;28937:93;:::i;:::-;29055:2;29050:3;29046:12;29039:19;;28698:366;;;:::o;29070:419::-;29236:4;29274:2;29263:9;29259:18;29251:26;;29323:9;29317:4;29313:20;29309:1;29298:9;29294:17;29287:47;29351:131;29477:4;29351:131;:::i;:::-;29343:139;;29070:419;;;:::o;29495:148::-;29597:11;29634:3;29619:18;;29495:148;;;;:::o;29649:173::-;29789:25;29785:1;29777:6;29773:14;29766:49;29649:173;:::o;29828:402::-;29988:3;30009:85;30091:2;30086:3;30009:85;:::i;:::-;30002:92;;30103:93;30192:3;30103:93;:::i;:::-;30221:2;30216:3;30212:12;30205:19;;29828:402;;;:::o;30236:99::-;30288:6;30322:5;30316:12;30306:22;;30236:99;;;:::o;30341:139::-;30430:6;30425:3;30420;30414:23;30471:1;30462:6;30457:3;30453:16;30446:27;30341:139;;;:::o;30486:390::-;30592:3;30620:39;30653:5;30620:39;:::i;:::-;30675:89;30757:6;30752:3;30675:89;:::i;:::-;30668:96;;30773:65;30831:6;30826:3;30819:4;30812:5;30808:16;30773:65;:::i;:::-;30863:6;30858:3;30854:16;30847:23;;30596:280;30486:390;;;;:::o;30882:167::-;31022:19;31018:1;31010:6;31006:14;30999:43;30882:167;:::o;31055:402::-;31215:3;31236:85;31318:2;31313:3;31236:85;:::i;:::-;31229:92;;31330:93;31419:3;31330:93;:::i;:::-;31448:2;31443:3;31439:12;31432:19;;31055:402;;;:::o;31463:967::-;31845:3;31867:148;32011:3;31867:148;:::i;:::-;31860:155;;32032:95;32123:3;32114:6;32032:95;:::i;:::-;32025:102;;32144:148;32288:3;32144:148;:::i;:::-;32137:155;;32309:95;32400:3;32391:6;32309:95;:::i;:::-;32302:102;;32421:3;32414:10;;31463:967;;;;;:::o;32436:377::-;32524:3;32552:39;32585:5;32552:39;:::i;:::-;32607:71;32671:6;32666:3;32607:71;:::i;:::-;32600:78;;32687:65;32745:6;32740:3;32733:4;32726:5;32722:16;32687:65;:::i;:::-;32777:29;32799:6;32777:29;:::i;:::-;32772:3;32768:39;32761:46;;32528:285;32436:377;;;;:::o;32819:313::-;32932:4;32970:2;32959:9;32955:18;32947:26;;33019:9;33013:4;33009:20;33005:1;32994:9;32990:17;32983:47;33047:78;33120:4;33111:6;33047:78;:::i;:::-;33039:86;;32819:313;;;;:::o;33138:232::-;33278:34;33274:1;33266:6;33262:14;33255:58;33347:15;33342:2;33334:6;33330:15;33323:40;33138:232;:::o;33376:366::-;33518:3;33539:67;33603:2;33598:3;33539:67;:::i;:::-;33532:74;;33615:93;33704:3;33615:93;:::i;:::-;33733:2;33728:3;33724:12;33717:19;;33376:366;;;:::o;33748:419::-;33914:4;33952:2;33941:9;33937:18;33929:26;;34001:9;33995:4;33991:20;33987:1;33976:9;33972:17;33965:47;34029:131;34155:4;34029:131;:::i;:::-;34021:139;;33748:419;;;:::o;34173:180::-;34221:77;34218:1;34211:88;34318:4;34315:1;34308:15;34342:4;34339:1;34332:15;34359:410;34399:7;34422:20;34440:1;34422:20;:::i;:::-;34417:25;;34456:20;34474:1;34456:20;:::i;:::-;34451:25;;34511:1;34508;34504:9;34533:30;34551:11;34533:30;:::i;:::-;34522:41;;34712:1;34703:7;34699:15;34696:1;34693:22;34673:1;34666:9;34646:83;34623:139;;34742:18;;:::i;:::-;34623:139;34407:362;34359:410;;;;:::o;34775:191::-;34815:3;34834:20;34852:1;34834:20;:::i;:::-;34829:25;;34868:20;34886:1;34868:20;:::i;:::-;34863:25;;34911:1;34908;34904:9;34897:16;;34932:3;34929:1;34926:10;34923:36;;;34939:18;;:::i;:::-;34923:36;34775:191;;;;:::o;34972:171::-;35011:3;35034:24;35052:5;35034:24;:::i;:::-;35025:33;;35080:4;35073:5;35070:15;35067:41;;35088:18;;:::i;:::-;35067:41;35135:1;35128:5;35124:13;35117:20;;34972:171;;;:::o;35149:182::-;35289:34;35285:1;35277:6;35273:14;35266:58;35149:182;:::o;35337:366::-;35479:3;35500:67;35564:2;35559:3;35500:67;:::i;:::-;35493:74;;35576:93;35665:3;35576:93;:::i;:::-;35694:2;35689:3;35685:12;35678:19;;35337:366;;;:::o;35709:419::-;35875:4;35913:2;35902:9;35898:18;35890:26;;35962:9;35956:4;35952:20;35948:1;35937:9;35933:17;35926:47;35990:131;36116:4;35990:131;:::i;:::-;35982:139;;35709:419;;;:::o;36134:98::-;36185:6;36219:5;36213:12;36203:22;;36134:98;;;:::o;36238:147::-;36339:11;36376:3;36361:18;;36238:147;;;;:::o;36391:386::-;36495:3;36523:38;36555:5;36523:38;:::i;:::-;36577:88;36658:6;36653:3;36577:88;:::i;:::-;36570:95;;36674:65;36732:6;36727:3;36720:4;36713:5;36709:16;36674:65;:::i;:::-;36764:6;36759:3;36755:16;36748:23;;36499:278;36391:386;;;;:::o;36783:271::-;36913:3;36935:93;37024:3;37015:6;36935:93;:::i;:::-;36928:100;;37045:3;37038:10;;36783:271;;;;:::o;37060:179::-;37200:31;37196:1;37188:6;37184:14;37177:55;37060:179;:::o;37245:366::-;37387:3;37408:67;37472:2;37467:3;37408:67;:::i;:::-;37401:74;;37484:93;37573:3;37484:93;:::i;:::-;37602:2;37597:3;37593:12;37586:19;;37245:366;;;:::o;37617:419::-;37783:4;37821:2;37810:9;37806:18;37798:26;;37870:9;37864:4;37860:20;37856:1;37845:9;37841:17;37834:47;37898:131;38024:4;37898:131;:::i;:::-;37890:139;;37617:419;;;:::o","linkReferences":{},"immutableReferences":{"964":[{"length":32,"start":2116},{"length":32,"start":2258},{"length":32,"start":3439},{"length":32,"start":3581},{"length":32,"start":3756}]},"cborAuxdata":null},"compilation":{"compiler":"solc","compilerVersion":"0.8.34+commit.80d5c536","language":"Solidity","name":"bridgedBRLVRouter","fullyQualifiedName":"src/bridgedBRLVRouter.sol:bridgedBRLVRouter","compilerSettings":{"remappings":["@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/","@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.6/","forge-std-1.16.0/=dependencies/forge-std-1.16.0/","tempo-std-0.1.6/=dependencies/tempo-std-0.1.6/","@openzeppelin-contracts-4.9.6/=dependencies/@openzeppelin-contracts-4.9.6/","@openzeppelin-contracts-upgradeable-4.9.6/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"osaka","viaIR":false,"libraries":{}}},"deployment":{"chainId":"4217","address":"0x3b3f2e2aa07460a9ba95ffd06ad9597398bbbab7","transactionHash":null,"blockNumber":null,"transactionIndex":null,"deployer":null},"stdJsonInput":{"language":"Solidity","sources":{"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/AccessControlUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControlUpgradeable.sol\";\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../utils/StringsUpgradeable.sol\";\nimport \"../utils/introspection/ERC165Upgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\n    struct RoleData {\n        mapping(address => bool) members;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with a standardized message including the required role.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     *\n     * _Available since v4.1._\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    function __AccessControl_init() internal onlyInitializing {\n    }\n\n    function __AccessControl_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n        return _roles[role].members[account];\n    }\n\n    /**\n     * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n     * Overriding this function changes the behavior of the {onlyRole} modifier.\n     *\n     * Format of the revert message is described in {_checkRole}.\n     *\n     * _Available since v4.6._\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Revert with a standard message if `account` is missing `role`.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"AccessControl: account \",\n                        StringsUpgradeable.toHexString(account),\n                        \" is missing role \",\n                        StringsUpgradeable.toHexString(uint256(role), 32)\n                    )\n                )\n            );\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address account) public virtual override {\n        require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event. Note that unlike {grantRole}, this function doesn't perform any\n     * checks on the calling account.\n     *\n     * May emit a {RoleGranted} event.\n     *\n     * [WARNING]\n     * ====\n     * This function should only be called from the constructor when setting\n     * up the initial roles for the system.\n     *\n     * Using this function in any other way is effectively circumventing the admin\n     * system imposed by {AccessControl}.\n     * ====\n     *\n     * NOTE: This function is deprecated in favor of {_grantRole}.\n     */\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual {\n        if (!hasRole(role, account)) {\n            _roles[role].members[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual {\n        if (hasRole(role, account)) {\n            _roles[role].members[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/IAccessControlUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControlUpgradeable {\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted signaling this.\n     *\n     * _Available since v3.1._\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {AccessControl-_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     */\n    function renounceRole(bytes32 role, address account) external;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/IERC1967Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967Upgradeable {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/draft-IERC1822Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822ProxiableUpgradeable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeaconUpgradeable.sol\";\nimport \"../../interfaces/IERC1967Upgradeable.sol\";\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/StorageSlotUpgradeable.sol\";\nimport {Initializable} from \"../utils/Initializable.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n */\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\n    // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    function __ERC1967Upgrade_init() internal onlyInitializing {\n    }\n\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        require(AddressUpgradeable.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Perform implementation upgrade\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeTo(address newImplementation) internal {\n        _setImplementation(newImplementation);\n        emit Upgraded(newImplementation);\n    }\n\n    /**\n     * @dev Perform implementation upgrade with additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(newImplementation, data);\n        }\n    }\n\n    /**\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\n        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\n            _setImplementation(newImplementation);\n        } else {\n            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n                require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n            } catch {\n                revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n            }\n            _upgradeToAndCall(newImplementation, data, forceCall);\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {AdminChanged} event.\n     */\n    function _changeAdmin(address newAdmin) internal {\n        emit AdminChanged(_getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n     */\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        require(AddressUpgradeable.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n    }\n\n    /**\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n     *\n     * Emits a {BeaconUpgraded} event.\n     */\n    function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/beacon/IBeaconUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeaconUpgradeable {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {BeaconProxy} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../ERC1967/ERC1967UpgradeUpgradeable.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n    address private immutable __self = address(this);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        require(address(this) != __self, \"Function must be called through delegatecall\");\n        require(_getImplementation() == __self, \"Function must be called through active proxy\");\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n        return _IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeTo(address newImplementation) public virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data, true);\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeTo} and {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal override onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StorageSlotUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlotUpgradeable {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := store.slot\n        }\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StringsUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\nimport \"./math/SignedMathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = MathUpgradeable.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMathUpgradeable.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/ERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n    function __ERC165_init() internal onlyInitializing {\n    }\n\n    function __ERC165_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/IERC165Upgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/MathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/SignedMathUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMathUpgradeable {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},"dependencies/tempo-std-0.1.6/src/interfaces/ITIP20.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\n/// @title The interface for TIP-20 compliant tokens\n/// @notice A token standard that extends ERC-20 with additional features including transfer policies, memo support, and pause functionality\ninterface ITIP20 {\n    /// @notice Error when attempting an operation while the contract is paused.\n    error ContractPaused();\n\n    /// @notice Error when the spender has insufficient allowance for the requested transfer.\n    error InsufficientAllowance();\n\n    /// @notice Error when an account has insufficient balance for the requested operation.\n    error InsufficientBalance(uint256 currentBalance, uint256 expectedBalance, address);\n    error InvalidAmount();\n\n    /// @notice Error when an invalid currency identifier is provided.\n    error InvalidCurrency();\n    error InvalidQuoteToken();\n    error InvalidBaseToken();\n    error InvalidToken();\n    error InvalidTransferPolicyId();\n\n    /// @notice Error when attempting to transfer to an invalid recipient address.\n    error InvalidRecipient();\n    error InvalidSupplyCap();\n    error NoOptedInSupply();\n\n    /// @notice Error when a transfer is blocked by the current transfer policy.\n    error PolicyForbids();\n\n    /// @notice Error when attempting to burn from a protected address.\n    error ProtectedAddress();\n    error SupplyCapExceeded();\n\n    /// @notice Emitted when an allowance is set between owner and spender.\n    /// @param owner The address that owns the tokens.\n    /// @param spender The address that is approved to spend the tokens.\n    /// @param amount The amount of tokens approved for spending.\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n    /// @notice Emitted when tokens are burned.\n    /// @param from The address from which tokens were burned.\n    /// @param amount The amount of tokens burned.\n    event Burn(address indexed from, uint256 amount);\n\n    /// @notice Emitted when tokens are forcibly burned from a blocked account.\n    /// @param from The address from which tokens were forcibly burned.\n    /// @param amount The amount of tokens burned.\n    event BurnBlocked(address indexed from, uint256 amount);\n\n    /// @notice Emitted when tokens are minted.\n    /// @param to The address that received the newly minted tokens.\n    /// @param amount The amount of tokens minted.\n    event Mint(address indexed to, uint256 amount);\n    event NextQuoteTokenSet(address indexed updater, ITIP20 indexed nextQuoteToken);\n\n    /// @notice Emitted when the contract's pause state changes.\n    /// @param updater The address that initiated the pause state change.\n    /// @param isPaused The new pause state of the contract.\n    event PauseStateUpdate(address indexed updater, bool isPaused);\n    event QuoteTokenUpdate(address indexed updater, ITIP20 indexed newQuoteToken);\n    event RewardRecipientSet(address indexed holder, address indexed recipient);\n    event RewardDistributed(address indexed funder, uint256 amount);\n\n    /// @notice Emitted when the supply cap is updated.\n    /// @param updater The address that initiated the supply cap update.\n    /// @param newSupplyCap The new maximum supply limit for the token.\n    event SupplyCapUpdate(address indexed updater, uint256 indexed newSupplyCap);\n\n    /// @notice Emitted when tokens are transferred.\n    /// @param from The address tokens were transferred from.\n    /// @param to The address tokens were transferred to.\n    /// @param amount The amount of tokens transferred.\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    /// @notice Emitted when the transfer policy is updated.\n    /// @param updater The address that initiated the policy update.\n    /// @param newPolicyId The new policy identifier that will govern transfers.\n    event TransferPolicyUpdate(address indexed updater, uint64 indexed newPolicyId);\n\n    /// @notice Emitted when tokens are transferred with an attached memo.\n    /// @param from The address tokens were transferred from.\n    /// @param to The address tokens were transferred to.\n    /// @param amount The amount of tokens transferred.\n    /// @param memo The memo attached to the transfer.\n    event TransferWithMemo(address indexed from, address indexed to, uint256 amount, bytes32 indexed memo);\n\n    /// @notice Returns the role identifier for burning tokens from blocked accounts.\n    /// @return The burn blocked role identifier.\n    function BURN_BLOCKED_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the role identifier for issuing tokens.\n    /// @return The issuer role identifier.\n    function ISSUER_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the role identifier for pausing the contract.\n    /// @return The pause role identifier.\n    function PAUSE_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the role identifier for unpausing the contract.\n    /// @return The unpause role identifier.\n    function UNPAUSE_ROLE() external view returns (bytes32);\n\n    /// @notice Returns the amount of tokens that spender is allowed to spend on behalf of owner.\n    /// @param owner The address that owns the tokens.\n    /// @param spender The address that is approved to spend the tokens.\n    /// @return The allowance amount.\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Returns the token balance of a specific account.\n    /// @param account The address to query the balance of.\n    /// @return The token balance of the account.\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Burns tokens from the caller's balance.\n    /// @param amount The amount of tokens to burn.\n    function burn(uint256 amount) external;\n\n    /// @notice Burns tokens from a blocked account (admin function).\n    /// @param from The address to burn tokens from.\n    /// @param amount The amount of tokens to burn.\n    function burnBlocked(address from, uint256 amount) external;\n\n    /// @notice Burns tokens from the caller's balance with an attached memo.\n    /// @param amount The amount of tokens to burn.\n    /// @param memo The memo to attach to the burn operation.\n    function burnWithMemo(uint256 amount, bytes32 memo) external;\n\n    /// @notice Changes the transfer policy identifier.\n    /// @param newPolicyId The new policy identifier to set.\n    function changeTransferPolicyId(uint64 newPolicyId) external;\n\n    function claimRewards() external returns (uint256 maxAmount);\n\n    function completeQuoteTokenUpdate() external;\n\n    function currency() external view returns (string memory);\n\n    function decimals() external pure returns (uint8);\n\n    function globalRewardPerToken() external view returns (uint256);\n\n    /// @notice Mints new tokens to a specified address.\n    /// @param to The address to mint tokens to.\n    /// @param amount The amount of tokens to mint.\n    function mint(address to, uint256 amount) external;\n\n    /// @notice Mints new tokens to a specified address with an attached memo.\n    /// @param to The address to mint tokens to.\n    /// @param amount The amount of tokens to mint.\n    /// @param memo The memo to attach to the mint operation.\n    function mintWithMemo(address to, uint256 amount, bytes32 memo) external;\n\n    function name() external view returns (string memory);\n\n    function nextQuoteToken() external view returns (ITIP20);\n\n    function optedInSupply() external view returns (uint128);\n\n    /// @notice Pauses the contract, preventing transfers and other operations.\n    function pause() external;\n\n    /// @notice Returns whether the contract is currently paused.\n    /// @return True if the contract is paused, false otherwise.\n    function paused() external view returns (bool);\n\n    function quoteToken() external view returns (ITIP20);\n\n    function setNextQuoteToken(ITIP20 newQuoteToken) external;\n\n    function setRewardRecipient(address newRewardRecipient) external;\n\n    function setSupplyCap(uint256 newSupplyCap) external;\n\n    function distributeReward(uint256 amount) external;\n\n    /// @notice Returns the maximum supply cap for the token.\n    /// @return The supply cap amount.\n    function supplyCap() external view returns (uint256);\n\n    function symbol() external view returns (string memory);\n\n    function systemTransferFrom(address from, address to, uint256 amount) external returns (bool);\n\n    /// @notice Returns the total token supply.\n    /// @return The total amount of tokens in circulation.\n    function totalSupply() external view returns (uint256);\n\n    /// @notice Transfers tokens from caller to another address.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @return success True if the transfer was successful.\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    function transferFeePostTx(address to, uint256 refund, uint256 actualUsed) external;\n\n    function transferFeePreTx(address from, uint256 amount) external;\n\n    /// @notice Transfers tokens from one address to another using allowance.\n    /// @param from The address to transfer tokens from.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @return success True if the transfer was successful.\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n\n    /// @notice Transfers tokens from one address to another with a memo using allowance.\n    /// @param from The address to transfer tokens from.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @param memo The memo to attach to the transfer.\n    /// @return success True if the transfer was successful.\n    function transferFromWithMemo(address from, address to, uint256 amount, bytes32 memo) external returns (bool);\n\n    /// @notice Returns the current transfer policy identifier.\n    /// @return The active transfer policy ID.\n    function transferPolicyId() external view returns (uint64);\n\n    /// @notice Transfers tokens with an attached memo.\n    /// @param to The address to transfer tokens to.\n    /// @param amount The amount of tokens to transfer.\n    /// @param memo The memo to attach to the transfer.\n    function transferWithMemo(address to, uint256 amount, bytes32 memo) external;\n\n    /// @notice Unpauses the contract, allowing transfers and other operations to resume.\n    function unpause() external;\n\n    function userRewardInfo(address)\n        external\n        view\n        returns (address rewardRecipient, uint256 rewardPerToken, uint256 rewardBalance);\n\n    /// @notice Calculates the pending claimable rewards for an account without modifying state.\n    /// @dev Returns the total pending claimable reward amount, including stored balance and newly accrued rewards.\n    /// @param account The address to query pending rewards for.\n    /// @return The total pending claimable reward amount.\n    function getPendingRewards(address account) external view returns (uint256);\n\n    // EIP-2612 Permit (TIP-1004)\n\n    /// @notice The permit signature has expired (block.timestamp > deadline)\n    error PermitExpired();\n\n    /// @notice The permit signature is invalid (wrong signer, malformed, or zero address recovered)\n    error InvalidSignature();\n\n    /// @notice Approves `spender` to spend `value` tokens on behalf of `owner` via a signed permit\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n        external;\n\n    /// @notice Returns the current nonce for an address\n    function nonces(address owner) external view returns (uint256);\n\n    /// @notice Returns the EIP-712 domain separator for this token\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"dependencies/tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\n/// @title The interface for TIP-403 transfer policy registry\n/// @notice Registry for managing transfer policies that control which addresses can send or receive tokens\ninterface ITIP403Registry {\n    /// @notice Policy types available for transfer restrictions\n    /// @param WHITELIST Only addresses on the whitelist are authorized for transfers\n    /// @param BLACKLIST All addresses except those on the blacklist are authorized for transfers\n    /// @param COMPOUND TIP-1015: Compound policy referencing three simple policies\n    enum PolicyType {\n        WHITELIST,\n        BLACKLIST,\n        COMPOUND\n    }\n\n    /// @notice Data structure containing policy configuration\n    /// @param policyType The type of policy (whitelist or blacklist)\n    /// @param admin The address authorized to modify this policy\n    struct PolicyData {\n        PolicyType policyType;\n        address admin;\n    }\n\n    /// @notice Error when caller lacks authorization to perform the requested action\n    error Unauthorized();\n\n    /// @notice Error when querying a policy that does not exist\n    error PolicyNotFound();\n\n    /// @notice TIP-1015: Error when a compound policy references a non-simple policy\n    error PolicyNotSimple();\n\n    /// @notice Error when attempting to operate on a policy with incompatible type\n    error IncompatiblePolicyType();\n\n    /// @notice Error when policy has an invalid type\n    error InvalidPolicyType();\n\n    /// @notice TIP-1022 virtual addresses cannot be used as literal policy members\n    error VirtualAddressNotAllowed();\n\n    /// @notice Emitted when a policy's admin is updated\n    /// @param policyId The ID of the policy that was updated\n    /// @param updater The address that performed the update\n    /// @param admin The new admin address for the policy\n    event PolicyAdminUpdated(uint64 indexed policyId, address indexed updater, address indexed admin);\n\n    /// @notice Emitted when a new policy is created\n    /// @param policyId The ID of the newly created policy\n    /// @param updater The address that created the policy\n    /// @param policyType The type of policy that was created\n    event PolicyCreated(uint64 indexed policyId, address indexed updater, PolicyType policyType);\n\n    /// @notice Emitted when a whitelist policy is modified\n    /// @param policyId The ID of the whitelist policy that was updated\n    /// @param updater The address that performed the update\n    /// @param account The account whose whitelist status was changed\n    /// @param allowed Whether the account is now allowed (true) or not (false)\n    event WhitelistUpdated(uint64 indexed policyId, address indexed updater, address indexed account, bool allowed);\n\n    /// @notice Emitted when a blacklist policy is modified\n    /// @param policyId The ID of the blacklist policy that was updated\n    /// @param updater The address that performed the update\n    /// @param account The account whose blacklist status was changed\n    /// @param restricted Whether the account is now restricted (true) or not (false)\n    event BlacklistUpdated(uint64 indexed policyId, address indexed updater, address indexed account, bool restricted);\n\n    /// @notice Returns the current policy ID counter\n    /// @return The next policy ID that will be assigned to a newly created policy\n    function policyIdCounter() external view returns (uint64);\n\n    /// @notice Returns whether a policy exists\n    /// @param policyId The ID of the policy to check\n    /// @return True if the policy exists, false otherwise\n    function policyExists(uint64 policyId) external view returns (bool);\n\n    /// @notice Returns the policy data for a given policy ID\n    /// @param policyId The ID of the policy to query\n    /// @return policyType The type of the policy (whitelist or blacklist)\n    /// @return admin The admin address of the policy\n    function policyData(uint64 policyId) external view returns (PolicyType policyType, address admin);\n\n    /// @notice Creates a new transfer policy without initial accounts\n    /// @param admin The address to be assigned as the admin of the new policy\n    /// @param policyType The type of policy to create (whitelist or blacklist)\n    /// @return newPolicyId The ID of the newly created policy\n    function createPolicy(address admin, PolicyType policyType) external returns (uint64 newPolicyId);\n\n    /// @notice Creates a new transfer policy with initial accounts\n    /// @param admin The address to be assigned as the admin of the new policy\n    /// @param policyType The type of policy to create (whitelist or blacklist)\n    /// @param accounts The initial accounts to add to the policy list\n    /// @return newPolicyId The ID of the newly created policy\n    function createPolicyWithAccounts(address admin, PolicyType policyType, address[] calldata accounts)\n        external\n        returns (uint64 newPolicyId);\n\n    /// @notice Updates the admin address for an existing policy\n    /// @param policyId The ID of the policy to update\n    /// @param admin The new admin address for the policy\n    function setPolicyAdmin(uint64 policyId, address admin) external;\n\n    /// @notice Modifies the whitelist status of an account for a whitelist policy\n    /// @param policyId The ID of the whitelist policy to modify\n    /// @param account The account to update\n    /// @param allowed Whether to allow (true) or disallow (false) the account\n    function modifyPolicyWhitelist(uint64 policyId, address account, bool allowed) external;\n\n    /// @notice Modifies the blacklist status of an account for a blacklist policy\n    /// @param policyId The ID of the blacklist policy to modify\n    /// @param account The account to update\n    /// @param restricted Whether to restrict (true) or unrestrict (false) the account\n    function modifyPolicyBlacklist(uint64 policyId, address account, bool restricted) external;\n\n    /// @notice Checks if a user is authorized under a specific policy\n    /// @param policyId The ID of the policy to check against\n    /// @param user The address to check authorization for\n    /// @return True if the user is authorized, false otherwise\n    function isAuthorized(uint64 policyId, address user) external view returns (bool);\n\n    // =========================================================================\n    //                      TIP-1015: Compound Policies\n    // =========================================================================\n\n    /// @notice TIP-1015: Emitted when a new compound policy is created\n    event CompoundPolicyCreated(\n        uint64 indexed policyId,\n        address indexed creator,\n        uint64 senderPolicyId,\n        uint64 recipientPolicyId,\n        uint64 mintRecipientPolicyId\n    );\n\n    /// @notice TIP-1015: Creates a new immutable compound policy\n    /// @param senderPolicyId Policy ID to check for transfer senders\n    /// @param recipientPolicyId Policy ID to check for transfer recipients\n    /// @param mintRecipientPolicyId Policy ID to check for mint recipients\n    /// @return newPolicyId ID of the newly created compound policy\n    function createCompoundPolicy(uint64 senderPolicyId, uint64 recipientPolicyId, uint64 mintRecipientPolicyId)\n        external\n        returns (uint64 newPolicyId);\n\n    /// @notice TIP-1015: Checks if a user is authorized as a sender\n    /// @param policyId Policy ID to check against\n    /// @param user Address to check\n    /// @return True if authorized to send\n    function isAuthorizedSender(uint64 policyId, address user) external view returns (bool);\n\n    /// @notice TIP-1015: Checks if a user is authorized as a recipient\n    /// @param policyId Policy ID to check against\n    /// @param user Address to check\n    /// @return True if authorized to receive\n    function isAuthorizedRecipient(uint64 policyId, address user) external view returns (bool);\n\n    /// @notice TIP-1015: Checks if a user is authorized as a mint recipient\n    /// @param policyId Policy ID to check against\n    /// @param user Address to check\n    /// @return True if authorized to receive mints\n    function isAuthorizedMintRecipient(uint64 policyId, address user) external view returns (bool);\n\n    /// @notice TIP-1015: Returns the constituent policy IDs for a compound policy\n    /// @param policyId ID of the compound policy to query\n    /// @return senderPolicyId Policy ID for sender checks\n    /// @return recipientPolicyId Policy ID for recipient checks\n    /// @return mintRecipientPolicyId Policy ID for mint recipient checks\n    function compoundPolicyData(uint64 policyId)\n        external\n        view\n        returns (uint64 senderPolicyId, uint64 recipientPolicyId, uint64 mintRecipientPolicyId);\n}\n"},"src/bridgedBRLVRouter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {AccessControlUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\";\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {ITIP20} from \"tempo-std-0.1.6/src/interfaces/ITIP20.sol\";\nimport {ITIP403Registry} from \"tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol\";\nimport {IBridgedBRLVRouter} from \"./interfaces/IBridgedBRLVRouter.sol\";\n\n/**\n * @title bridgedBRLVRouter\n * @notice Cross-chain router for the bridgedBRLV TIP-20.\n * @dev The user-facing token is a TIP-20 instance named \"bridgedBRLV\", deployed via the TIP-20\n * factory. This router handles inbound (canonical → Tempo mint) and outbound (Tempo → canonical\n * burn) operations, plus admin-side blocklist and pause management. It must hold ISSUER_ROLE,\n * PAUSE_ROLE, and UNPAUSE_ROLE on the TIP-20; the burn flow uses EIP-2612 permit + transferFrom +\n * self-burn, requiring no privileged TIP-20 role on that path. User-side ERC-20 operations\n * (transfer, balanceOf, approve, permit) happen on the TIP-20 directly.\n * @custom:security-contact security@crowndigital.xyz\n */\ncontract bridgedBRLVRouter is Initializable, AccessControlUpgradeable, UUPSUpgradeable, IBridgedBRLVRouter {\n    // The TIP-20 instance backing the bridgedBRLV token (created via the TIP-20 factory)\n    ITIP20 public token;\n\n    // The TIP-403 policy registry precompile that owns the BLACKLIST policy below\n    ITIP403Registry public policyRegistry;\n\n    // The BLACKLIST policy ID this contract administers; referenced by token.transferPolicyId\n    uint64 public policyId;\n\n    // Canonical domain identifier — required to match on every mint\n    bytes32 public canonicalDomain;\n\n    // Mapping of processed canonical transactions (replay protection), keyed by txHash\n    mapping(bytes32 => bool) private _processedTxHashes;\n\n    // Access control roles\n    bytes32 public constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\n    bytes32 public constant BURNER_ROLE = keccak256(\"BURNER_ROLE\");\n    bytes32 public constant BLOCKLIST_ROLE = keccak256(\"BLOCKLIST_ROLE\");\n    bytes32 public constant PAUSE_ROLE = keccak256(\"PAUSE_ROLE\");\n    bytes32 public constant UPGRADE_ROLE = keccak256(\"UPGRADE_ROLE\");\n\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor() {\n        _disableInitializers();\n    }\n\n    /**\n     * @notice Initializes the bridgedBRLVRouter. Called once via the ERC1967 proxy at deploy time.\n     * @dev The deployer must have already created the TIP-20 instance via the factory, created a BLACKLIST\n     * policy in the TIP-403 registry, and wired the TIP-20's transferPolicyId to that policy. Post-deploy\n     * steps (transferring policy admin to this contract, granting TIP-20 roles, granting operational roles)\n     * are performed by the deploy script.\n     * @param token_ The TIP-20 instance backing the bridgedBRLV token.\n     * @param policyRegistry_ The TIP-403 policy registry precompile.\n     * @param policyId_ The BLACKLIST policy ID this router administers.\n     * @param canonicalDomain_ The domain identifier of the canonical chain.\n     * @param owner The address that will receive DEFAULT_ADMIN_ROLE.\n     */\n    function initialize(\n        ITIP20 token_,\n        ITIP403Registry policyRegistry_,\n        uint64 policyId_,\n        bytes32 canonicalDomain_,\n        address owner\n    ) external initializer {\n        token = token_;\n        policyRegistry = policyRegistry_;\n        policyId = policyId_;\n        canonicalDomain = canonicalDomain_;\n\n        __AccessControl_init();\n        __UUPSUpgradeable_init();\n\n        _grantRole(DEFAULT_ADMIN_ROLE, owner);\n    }\n\n    /**\n     * @notice Pauses transfers on the underlying TIP-20.\n     * @dev Only callable by accounts with PAUSE_ROLE. This contract must hold PAUSE_ROLE on the TIP-20.\n     */\n    function pause() external onlyRole(PAUSE_ROLE) {\n        token.pause();\n    }\n\n    /**\n     * @notice Unpauses transfers on the underlying TIP-20.\n     * @dev Only callable by accounts with PAUSE_ROLE. This contract must hold UNPAUSE_ROLE on the TIP-20.\n     */\n    function unpause() external onlyRole(PAUSE_ROLE) {\n        token.unpause();\n    }\n\n    /**\n     * @notice Mints tokens via the TIP-20 instance from a canonical chain transaction.\n     * @dev Only callable by accounts with MINTER_ROLE (typically the relayer).\n     * @param canonicalTxHash The transaction hash from the canonical chain.\n     * @param canonicalDomain_ The domain identifier of the canonical chain.\n     * @param amount The amount of tokens to mint.\n     * @param to The recipient address.\n     * @param rewardMultiplier The reward multiplier at the time of mint on canonical chain.\n     */\n    function mint(\n        bytes32 canonicalTxHash,\n        bytes32 canonicalDomain_,\n        uint256 amount,\n        address to,\n        uint256 rewardMultiplier\n    ) external onlyRole(MINTER_ROLE) {\n        // Validate canonical domain\n        if (canonicalDomain_ != canonicalDomain) {\n            revert BridgedBRLVRouterInvalidCanonicalDomain(canonicalDomain_, canonicalDomain);\n        }\n\n        // Check for replay attack — entries are keyed by canonicalTxHash\n        if (_processedTxHashes[canonicalTxHash]) {\n            revert BridgedBRLVRouterTxHashAlreadyProcessed(canonicalTxHash);\n        }\n\n        // Mark transaction as processed\n        _processedTxHashes[canonicalTxHash] = true;\n\n        // Mint tokens to recipient via TIP-20 (canonical tx hash carried as on-chain memo)\n        token.mintWithMemo(to, amount, canonicalTxHash);\n\n        // Emit event for tracking\n        emit BridgedMintCompleted(canonicalTxHash, canonicalDomain_, amount, to, rewardMultiplier);\n    }\n\n    /**\n     * @notice Burns `amount` tokens from `from` via permit + transferFrom + self-burn, signaling a\n     *         bridge-out request to the canonical chain.\n     * @dev Only callable by accounts with BURNER_ROLE (the relayer). Caller must supply an EIP-2612\n     *      permit signed by `from` authorizing this router to spend `amount`. Blocked accounts\n     *      cannot bridge out — TIP-403 rejects the `transferFrom`. Compliance burns of sanctioned\n     *      balances are handled outside this router via TIP-20 `burnBlocked` operated by whoever\n     *      holds `BURN_BLOCKED_ROLE`.\n     * @param from The token holder whose balance is being burned.\n     * @param amount The amount of tokens to burn.\n     * @param deadline EIP-2612 permit deadline.\n     * @param v Permit signature v.\n     * @param r Permit signature r.\n     * @param s Permit signature s.\n     */\n    function burn(\n        address from,\n        uint256 amount,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external onlyRole(BURNER_ROLE) {\n        if (amount == 0) revert BridgedBRLVRouterInvalidAmount();\n        if (from == address(0)) revert BridgedBRLVRouterInvalidAddress();\n\n        token.permit(from, address(this), amount, deadline, v, r, s);\n        token.transferFrom(from, address(this), amount);\n        token.burn(amount);\n\n        emit BridgedBurnRequested(from, amount);\n    }\n\n    /**\n     * @dev Private function to add an account to the TIP-403 BLACKLIST policy.\n     * @param account The account to block.\n     */\n    function _blockAccount(address account) private {\n        if (account == address(0)) {\n            revert BridgedBRLVRouterInvalidBlockedAccount(account);\n        }\n        if (!policyRegistry.isAuthorized(policyId, account)) {\n            revert BridgedBRLVRouterInvalidBlockedAccount(account);\n        }\n\n        policyRegistry.modifyPolicyBlacklist(policyId, account, true);\n        emit AccountBlocked(account);\n    }\n\n    /**\n     * @dev Private function to remove an account from the TIP-403 BLACKLIST policy.\n     * @param account The account to unblock.\n     */\n    function _unblockAccount(address account) private {\n        if (policyRegistry.isAuthorized(policyId, account)) {\n            revert BridgedBRLVRouterInvalidBlockedAccount(account);\n        }\n\n        policyRegistry.modifyPolicyBlacklist(policyId, account, false);\n        emit AccountUnblocked(account);\n    }\n\n    /**\n     * @notice Blocks multiple accounts via the TIP-403 BLACKLIST policy.\n     * @dev Only callable by accounts with BLOCKLIST_ROLE. Blocked accounts are rejected by the TIP-20\n     * precompile on subsequent transfers (with TIP-20's native PolicyForbids error).\n     * @param addresses The addresses to block.\n     */\n    function blockAccounts(address[] calldata addresses) external onlyRole(BLOCKLIST_ROLE) {\n        for (uint256 i = 0; i < addresses.length; i++) {\n            _blockAccount(addresses[i]);\n        }\n    }\n\n    /**\n     * @notice Unblocks multiple accounts via the TIP-403 BLACKLIST policy.\n     * @dev Only callable by accounts with BLOCKLIST_ROLE.\n     * @param addresses The addresses to unblock.\n     */\n    function unblockAccounts(address[] calldata addresses) external onlyRole(BLOCKLIST_ROLE) {\n        for (uint256 i = 0; i < addresses.length; i++) {\n            _unblockAccount(addresses[i]);\n        }\n    }\n\n    /**\n     * @notice Checks if an account is on the TIP-403 BLACKLIST policy.\n     * @param account The account to check.\n     * @return True if the account is blocked, false otherwise.\n     */\n    function isBlocked(address account) public view returns (bool) {\n        return !policyRegistry.isAuthorized(policyId, account);\n    }\n\n    /**\n     * @notice Checks if a canonical txHash has been processed by mint.\n     * @param txHash The transaction hash to check.\n     * @return True if the txHash has been processed, false otherwise.\n     */\n    function isProcessed(bytes32 txHash) external view returns (bool) {\n        return _processedTxHashes[txHash];\n    }\n\n    /**\n     * @notice Returns true if the underlying TIP-20 is paused.\n     * @return True if paused, false otherwise.\n     */\n    function paused() public view returns (bool) {\n        return token.paused();\n    }\n\n    /**\n     * @dev Ensures that only accounts with UPGRADE_ROLE can upgrade the contract.\n     */\n    function _authorizeUpgrade(address) internal override onlyRole(UPGRADE_ROLE) {}\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[44] private __gap;\n}\n"},"src/interfaces/IBridgedBRLVRouter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\nimport {ITIP20} from \"tempo-std-0.1.6/src/interfaces/ITIP20.sol\";\nimport {ITIP403Registry} from \"tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol\";\n\n/**\n * @title IBridgedBRLVRouter Interface\n * @notice Cross-chain router for the bridgedBRLV TIP-20. Handles inbound (mint from canonical) and\n *         outbound (burn requesting canonical release) operations, along with admin-side blocklist\n *         and pause management. The user-facing token is a TIP-20 instance deployed via the factory;\n *         this router holds the privileged roles on that instance and admins a TIP-403 BLACKLIST\n *         policy referenced by the TIP-20's transferPolicyId.\n * @custom:security-contact security@crowndigital.xyz\n */\ninterface IBridgedBRLVRouter {\n    // Events\n\n    /**\n     * @notice Emitted when tokens are minted from a canonical chain transaction.\n     * @param canonicalTxHash The transaction hash from the canonical chain.\n     * @param canonicalDomain The domain identifier of the canonical chain.\n     * @param amount The amount of tokens minted.\n     * @param to The recipient address.\n     * @param rewardMultiplier The reward multiplier at the time of mint on canonical chain.\n     */\n    event BridgedMintCompleted(\n        bytes32 indexed canonicalTxHash,\n        bytes32 indexed canonicalDomain,\n        uint256 amount,\n        address indexed to,\n        uint256 rewardMultiplier\n    );\n\n    /**\n     * @notice Emitted when tokens are burned, requesting a burn on the canonical chain.\n     * @param from The address whose tokens were burned.\n     * @param amount The amount of tokens burned.\n     */\n    event BridgedBurnRequested(address indexed from, uint256 amount);\n\n    /**\n     * @notice Emitted when an account is added to the TIP-403 blacklist policy.\n     */\n    event AccountBlocked(address indexed account);\n\n    /**\n     * @notice Emitted when an account is removed from the TIP-403 blacklist policy.\n     */\n    event AccountUnblocked(address indexed account);\n\n    // Errors\n\n    error BridgedBRLVRouterInvalidCanonicalDomain(bytes32 provided, bytes32 expected);\n    error BridgedBRLVRouterTxHashAlreadyProcessed(bytes32 txHash);\n    error BridgedBRLVRouterInvalidBlockedAccount(address account);\n    error BridgedBRLVRouterInvalidAmount();\n    error BridgedBRLVRouterInvalidAddress();\n\n    // Router functions\n\n    /**\n     * @notice Mints tokens via the TIP-20 instance from a canonical chain transaction.\n     * @dev Only callable by accounts with MINTER_ROLE. Calls `tip20.mintWithMemo(to, amount, canonicalTxHash)`.\n     */\n    function mint(\n        bytes32 canonicalTxHash,\n        bytes32 canonicalDomain_,\n        uint256 amount,\n        address to,\n        uint256 rewardMultiplier\n    ) external;\n\n    /**\n     * @notice Burns `amount` tokens from `from` via permit + transferFrom + self-burn, signaling a\n     *         bridge-out request to the canonical chain.\n     * @dev Only callable by accounts with BURNER_ROLE (the relayer). Caller must supply an EIP-2612\n     *      permit signed by `from` authorizing this router to spend `amount`. The router calls\n     *      `tip20.permit(from, address(this), amount, deadline, v, r, s)`, then\n     *      `tip20.transferFrom(from, address(this), amount)`, then `tip20.burn(amount)`. No\n     *      privileged TIP-20 role is needed for this path. Blocked accounts cannot bridge out —\n     *      `transferFrom` is rejected by the TIP-403 policy. Compliance burns of sanctioned balances\n     *      are handled outside the router via TIP-20 `burnBlocked` operated by whoever holds\n     *      `BURN_BLOCKED_ROLE`.\n     */\n    function burn(\n        address from,\n        uint256 amount,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    // Blocklist (TIP-403 BLACKLIST policy)\n\n    function blockAccounts(address[] calldata addresses) external;\n    function unblockAccounts(address[] calldata addresses) external;\n    function isBlocked(address account) external view returns (bool);\n\n    // Pause forwarding\n\n    function pause() external;\n    function unpause() external;\n    function paused() external view returns (bool);\n\n    // Views\n\n    function canonicalDomain() external view returns (bytes32);\n    function isProcessed(bytes32 txHash) external view returns (bool);\n    function token() external view returns (ITIP20);\n    function policyRegistry() external view returns (ITIP403Registry);\n    function policyId() external view returns (uint64);\n}\n"}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/","@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.6/","forge-std-1.16.0/=dependencies/forge-std-1.16.0/","tempo-std-0.1.6/=dependencies/tempo-std-0.1.6/","@openzeppelin-contracts-4.9.6/=dependencies/@openzeppelin-contracts-4.9.6/","@openzeppelin-contracts-upgradeable-4.9.6/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"osaka","viaIR":false,"libraries":{}}},"stdJsonOutput":{"contracts":{"src/bridgedBRLVRouter.sol":{"bridgedBRLVRouter":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BridgedBRLVRouterInvalidAddress","type":"error"},{"inputs":[],"name":"BridgedBRLVRouterInvalidAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"BridgedBRLVRouterInvalidBlockedAccount","type":"error"},{"inputs":[{"internalType":"bytes32","name":"provided","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"BridgedBRLVRouterInvalidCanonicalDomain","type":"error"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"BridgedBRLVRouterTxHashAlreadyProcessed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountBlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountUnblocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgedBurnRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"canonicalTxHash","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"canonicalDomain","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardMultiplier","type":"uint256"}],"name":"BridgedMintCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BLOCKLIST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalDomain","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITIP20","name":"token_","type":"address"},{"internalType":"contract ITIP403Registry","name":"policyRegistry_","type":"address"},{"internalType":"uint64","name":"policyId_","type":"uint64"},{"internalType":"bytes32","name":"canonicalDomain_","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"isProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"canonicalTxHash","type":"bytes32"},{"internalType":"bytes32","name":"canonicalDomain_","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"rewardMultiplier","type":"uint256"}],"name":"mint","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":"policyId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policyRegistry","outputs":[{"internalType":"contract ITIP403Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"token","outputs":[{"internalType":"contract ITIP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"metadata":"{\"compiler\":{\"version\":\"0.8.34+commit.80d5c536\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BridgedBRLVRouterInvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BridgedBRLVRouterInvalidAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"BridgedBRLVRouterInvalidBlockedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"provided\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"BridgedBRLVRouterInvalidCanonicalDomain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"}],\"name\":\"BridgedBRLVRouterTxHashAlreadyProcessed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AccountBlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AccountUnblocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BridgedBurnRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"canonicalTxHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"canonicalDomain\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardMultiplier\",\"type\":\"uint256\"}],\"name\":\"BridgedMintCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKLIST_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURNER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"blockAccounts\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canonicalDomain\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITIP20\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"contract ITIP403Registry\",\"name\":\"policyRegistry_\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"policyId_\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"canonicalDomain_\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isBlocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"}],\"name\":\"isProcessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"canonicalTxHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"canonicalDomain_\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"rewardMultiplier\",\"type\":\"uint256\"}],\"name\":\"mint\",\"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\":\"policyId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"policyRegistry\",\"outputs\":[{\"internalType\":\"contract ITIP403Registry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"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\":\"token\",\"outputs\":[{\"internalType\":\"contract ITIP20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"unblockAccounts\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"security@crowndigital.xyz\",\"details\":\"The user-facing token is a TIP-20 instance named \\\"bridgedBRLV\\\", deployed via the TIP-20 factory. This router handles inbound (canonical \\u2192 Tempo mint) and outbound (Tempo \\u2192 canonical burn) operations, plus admin-side blocklist and pause management. It must hold ISSUER_ROLE, PAUSE_ROLE, and UNPAUSE_ROLE on the TIP-20; the burn flow uses EIP-2612 permit + transferFrom + self-burn, requiring no privileged TIP-20 role on that path. User-side ERC-20 operations (transfer, balanceOf, approve, permit) happen on the TIP-20 directly.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"BridgedBurnRequested(address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens burned.\",\"from\":\"The address whose tokens were burned.\"}},\"BridgedMintCompleted(bytes32,bytes32,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens minted.\",\"canonicalDomain\":\"The domain identifier of the canonical chain.\",\"canonicalTxHash\":\"The transaction hash from the canonical chain.\",\"rewardMultiplier\":\"The reward multiplier at the time of mint on canonical chain.\",\"to\":\"The recipient address.\"}},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"blockAccounts(address[])\":{\"details\":\"Only callable by accounts with BLOCKLIST_ROLE. Blocked accounts are rejected by the TIP-20 precompile on subsequent transfers (with TIP-20's native PolicyForbids error).\",\"params\":{\"addresses\":\"The addresses to block.\"}},\"burn(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Only callable by accounts with BURNER_ROLE (the relayer). Caller must supply an EIP-2612      permit signed by `from` authorizing this router to spend `amount`. Blocked accounts      cannot bridge out \\u2014 TIP-403 rejects the `transferFrom`. Compliance burns of sanctioned      balances are handled outside this router via TIP-20 `burnBlocked` operated by whoever      holds `BURN_BLOCKED_ROLE`.\",\"params\":{\"amount\":\"The amount of tokens to burn.\",\"deadline\":\"EIP-2612 permit deadline.\",\"from\":\"The token holder whose balance is being burned.\",\"r\":\"Permit signature r.\",\"s\":\"Permit signature s.\",\"v\":\"Permit signature v.\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"initialize(address,address,uint64,bytes32,address)\":{\"details\":\"The deployer must have already created the TIP-20 instance via the factory, created a BLACKLIST policy in the TIP-403 registry, and wired the TIP-20's transferPolicyId to that policy. Post-deploy steps (transferring policy admin to this contract, granting TIP-20 roles, granting operational roles) are performed by the deploy script.\",\"params\":{\"canonicalDomain_\":\"The domain identifier of the canonical chain.\",\"owner\":\"The address that will receive DEFAULT_ADMIN_ROLE.\",\"policyId_\":\"The BLACKLIST policy ID this router administers.\",\"policyRegistry_\":\"The TIP-403 policy registry precompile.\",\"token_\":\"The TIP-20 instance backing the bridgedBRLV token.\"}},\"isBlocked(address)\":{\"params\":{\"account\":\"The account to check.\"},\"returns\":{\"_0\":\"True if the account is blocked, false otherwise.\"}},\"isProcessed(bytes32)\":{\"params\":{\"txHash\":\"The transaction hash to check.\"},\"returns\":{\"_0\":\"True if the txHash has been processed, false otherwise.\"}},\"mint(bytes32,bytes32,uint256,address,uint256)\":{\"details\":\"Only callable by accounts with MINTER_ROLE (typically the relayer).\",\"params\":{\"amount\":\"The amount of tokens to mint.\",\"canonicalDomain_\":\"The domain identifier of the canonical chain.\",\"canonicalTxHash\":\"The transaction hash from the canonical chain.\",\"rewardMultiplier\":\"The reward multiplier at the time of mint on canonical chain.\",\"to\":\"The recipient address.\"}},\"pause()\":{\"details\":\"Only callable by accounts with PAUSE_ROLE. This contract must hold PAUSE_ROLE on the TIP-20.\"},\"paused()\":{\"returns\":{\"_0\":\"True if paused, false otherwise.\"}},\"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.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"unblockAccounts(address[])\":{\"details\":\"Only callable by accounts with BLOCKLIST_ROLE.\",\"params\":{\"addresses\":\"The addresses to unblock.\"}},\"unpause()\":{\"details\":\"Only callable by accounts with PAUSE_ROLE. This contract must hold UNPAUSE_ROLE on the TIP-20.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"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\":\"This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\"}},\"title\":\"bridgedBRLVRouter\",\"version\":1},\"userdoc\":{\"events\":{\"AccountBlocked(address)\":{\"notice\":\"Emitted when an account is added to the TIP-403 blacklist policy.\"},\"AccountUnblocked(address)\":{\"notice\":\"Emitted when an account is removed from the TIP-403 blacklist policy.\"},\"BridgedBurnRequested(address,uint256)\":{\"notice\":\"Emitted when tokens are burned, requesting a burn on the canonical chain.\"},\"BridgedMintCompleted(bytes32,bytes32,uint256,address,uint256)\":{\"notice\":\"Emitted when tokens are minted from a canonical chain transaction.\"}},\"kind\":\"user\",\"methods\":{\"blockAccounts(address[])\":{\"notice\":\"Blocks multiple accounts via the TIP-403 BLACKLIST policy.\"},\"burn(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Burns `amount` tokens from `from` via permit + transferFrom + self-burn, signaling a         bridge-out request to the canonical chain.\"},\"initialize(address,address,uint64,bytes32,address)\":{\"notice\":\"Initializes the bridgedBRLVRouter. Called once via the ERC1967 proxy at deploy time.\"},\"isBlocked(address)\":{\"notice\":\"Checks if an account is on the TIP-403 BLACKLIST policy.\"},\"isProcessed(bytes32)\":{\"notice\":\"Checks if a canonical txHash has been processed by mint.\"},\"mint(bytes32,bytes32,uint256,address,uint256)\":{\"notice\":\"Mints tokens via the TIP-20 instance from a canonical chain transaction.\"},\"pause()\":{\"notice\":\"Pauses transfers on the underlying TIP-20.\"},\"paused()\":{\"notice\":\"Returns true if the underlying TIP-20 is paused.\"},\"unblockAccounts(address[])\":{\"notice\":\"Unblocks multiple accounts via the TIP-403 BLACKLIST policy.\"},\"unpause()\":{\"notice\":\"Unpauses transfers on the underlying TIP-20.\"}},\"notice\":\"Cross-chain router for the bridgedBRLV TIP-20.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/bridgedBRLVRouter.sol\":\"bridgedBRLVRouter\"},\"evmVersion\":\"osaka\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin-contracts-4.9.6/=dependencies/@openzeppelin-contracts-4.9.6/\",\":@openzeppelin-contracts-upgradeable-4.9.6/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/\",\":@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/\",\":@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.6/\",\":forge-std-1.16.0/=dependencies/forge-std-1.16.0/\",\":tempo-std-0.1.6/=dependencies/tempo-std-0.1.6/\"]},\"sources\":{\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/AccessControlUpgradeable.sol\":{\"keccak256\":\"0xc8710577334e8d0799ae2b2a731b1924a7bddd64319da9787ddd2dc69bdd1ce5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b83b7afa4d2372da3ba5402fb10860a105c35d79812c60dc61007be2afc17618\",\"dweb:/ipfs/QmYX9xPmbNVSKXrepKiUZiG5oL3SdzFp9a4kqspxX1sEUx\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/access/IAccessControlUpgradeable.sol\":{\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://740cf4dc535e3082560cf5a031473029f322690fc8037fe9d5e3a8bef42e757c\",\"dweb:/ipfs/QmTQxFdfxcaueQa23VX34wAPqzruZbkzyeN58tZK2yav2b\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/IERC1967Upgradeable.sol\":{\"keccak256\":\"0x47d6e06872b12e72c79d1b5eb55842f860b5fb1207b2317c2358d2766b950a7b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ac55bf6f92fc7b90c6d79d346163a0a02bd5c648c7fede08b20e5da96d4ae2a0\",\"dweb:/ipfs/QmQoSrHhka35iKDK5iyNt8cuXXS5ANXVPjLhfsJjktB8V9\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/interfaces/draft-IERC1822Upgradeable.sol\":{\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://496bd9b3df2455d571018c09f0c6badd29713fdeb907c6aa09d8d28cb603f053\",\"dweb:/ipfs/QmXdJDyYs6WMwMh21dez2BYPxhSUaUYFMDtVNcn2cgFR79\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"keccak256\":\"0x7795808e3899c805254e3ae58074b20f799b466e3f43e057e47bedee5fb771f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://319853a2a682f3f72411507242669ef5e76e0ad3457be53102439709ee8948f0\",\"dweb:/ipfs/QmRtm4Ese9u4jfxXyuWPXLwzenwFotuQjAWV7rXtZTB1E9\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/beacon/IBeaconUpgradeable.sol\":{\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4dbfe1a3b3b3fb64294ce41fd2ad362e7b7012208117864f42c1a67620a6d5c1\",\"dweb:/ipfs/QmVMU5tWt7zBQMmf5cpMX8UMHV86T3kFeTxBTBjFqVWfoJ\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0xefb41f5c1a00249b7a99f0782f8c557865605426a3fb6e5fe9ae334293ae4f33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://90def55e5782595aabc13f57780c02d3613e5226f20ce6c1709503a63fdeb58f\",\"dweb:/ipfs/Qmb5vcymmNEZUJMaHmYxnhvGJDEsGMae4YjcHwkA74jy99\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95\",\"dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StorageSlotUpgradeable.sol\":{\"keccak256\":\"0x07ac95acad040f1fb1f6120dd0aa5f702db69446e95f82613721879d30de0908\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a9df9de7b5da1d1bd3d4b6c073d0174bc4211db60e794a321c8cb5d4eae34685\",\"dweb:/ipfs/QmWe49zj65jayrCe9jZpoWhYUZ1RiwSxyU2s7SBZnMztVy\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0xb96dc79b65b7c37937919dcdb356a969ce0aa2e8338322bf4dc027a3c9c9a7eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f8613145881436fc0480fff22da4868d611e2b0c0c3da083334eb4362ce1945a\",\"dweb:/ipfs/QmPqpP3YeRbBdTJRe6Gv2eGsUaANf4J6RwTNRW36iYahfV\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0xd90d7723512df65ae417adaf0801042940f0dabd60039ceeaffe34aa5b238da1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1b13befeb3413749292f9fb229de1c7a509a5ce2c8047d9094fc004ca9d3af89\",\"dweb:/ipfs/QmRzJ2hZSwRtMejHUZAYTPRKgZsnfb112Fno9Jf3EiDfwA\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0x2bc0007987c229ae7624eb29be6a9b84f6a6a5872f76248b15208b131ea41c4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2b2835c737d073ef8b82a4cc246495a9740f43e7ff2cf130906b2449ff9bfb91\",\"dweb:/ipfs/QmSCWfNoSvvTN57ic7o1RW6NqSxxGAqbBTnLKc7QHe27qB\"]},\"dependencies/@openzeppelin-contracts-upgradeable-4.9.6/utils/math/SignedMathUpgradeable.sol\":{\"keccak256\":\"0x88f6b7bba3ee33eeb741f9a0f5bc98b6e6e352d0fe4905377bb328590f84095a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88ace2d60f265752f18903d839910be4e4e104340b2957678585b812447825d4\",\"dweb:/ipfs/QmXFkNxMc3AAGzhs2wUEZyErWQjsvoTGyYjuU5oZkFki5Z\"]},\"dependencies/tempo-std-0.1.6/src/interfaces/ITIP20.sol\":{\"keccak256\":\"0xf553c9b00766125fb93cd8920588bb5429d96af1a23b797511c66a533c7a98d5\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b514d1884b58d40d65bcf40217e8a90f099def388e114f316b10cb72c261db69\",\"dweb:/ipfs/QmS6eDUTGayPHRomh43rBfruGeaps5oZxh1vQGQG59juxH\"]},\"dependencies/tempo-std-0.1.6/src/interfaces/ITIP403Registry.sol\":{\"keccak256\":\"0xeb7d50bd3987ac2a71fbdbc8e391666d7ecf3c2ce25617dda2c36fe97fabe597\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://91caa2b888c7a92f56fac58648a62792edbeb3b4fe6f3c9bf4aa54e207f6f5e5\",\"dweb:/ipfs/Qmf5jZnRitrRxAQram8CeGFfTrZbNmCtrW1sckNxWq1TzU\"]},\"src/bridgedBRLVRouter.sol\":{\"keccak256\":\"0x40864eb4b838f703c0288168a92139707fb50cdada42b174fdc37374254dba8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://433c1a5f6a05cbc7a75bee69ff027de1161c41956940d637efbdb314666b946a\",\"dweb:/ipfs/QmNY2ZuuyXZoHW3a3i1mEqx8PkYvS9gwERbbYEeeABcS1B\"]},\"src/interfaces/IBridgedBRLVRouter.sol\":{\"keccak256\":\"0xe8224cb7a7dcb7f155ff7e1f7bc8a18cd989b66699f90971b6dc7deecc708126\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3430c7b2381106619f02c4bab62df494400dd64ac43a48fa560920ed19cd0109\",\"dweb:/ipfs/QmULS3MYBVHsvDK8qFMyV49gcY2wgpDgHqGWqFHzRB3tMT\"]}},\"version\":1}","evm":{"bytecode":{"object":"0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610042575f5ffd5b5061005161005660201b60201c565b6101e6565b5f60019054906101000a900460ff16156100a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161009c90610194565b60405180910390fd5b60ff80165f5f9054906101000a900460ff1660ff16146101125760ff5f5f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff60405161010991906101cd565b60405180910390a15b565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f61017e602783610114565b915061018982610124565b604082019050919050565b5f6020820190508181035f8301526101ab81610172565b9050919050565b5f60ff82169050919050565b6101c7816101b2565b82525050565b5f6020820190506101e05f8301846101be565b92915050565b60805161399161021a5f395f8181610844015281816108d201528181610d6f01528181610dfd0152610eac01526139915ff3fe6080604052600436106101c1575f3560e01c80635c975abb116100f6578063b908afa811610094578063ee89ef3a11610063578063ee89ef3a146105e1578063faed47fd1461060b578063fbac395114610633578063fc0c546a1461066f576101c1565b8063b908afa81461053b578063bb4a054314610565578063d53913931461058f578063d547741f146105b9576101c1565b80638fec57dd116100d05780638fec57dd1461048557806391d14854146104ad57806398efe62d146104e9578063a217fddf14610511576101c1565b80635c975abb1461041d5780636abf7081146104475780638456cb591461046f576101c1565b80633659cfe6116101635780634cdce9331161013d5780634cdce933146103855780634f1ef286146103ad57806352d1902d146103c9578063596b1f4d146103f3576101c1565b80633659cfe61461031d578063389ed267146103455780633f4ba83a1461036f576101c1565b8063248a9ca31161019f578063248a9ca314610267578063282c51f3146102a35780632f2ff15d146102cd57806336568abe146102f5576101c1565b806301ffc9a7146101c557806311c16896146102015780631c4dd7d01461023d575b5f5ffd5b3480156101d0575f5ffd5b506101eb60048036038101906101e6919061267d565b610699565b6040516101f891906126c2565b60405180910390f35b34801561020c575f5ffd5b506102276004803603810190610222919061270e565b610712565b60405161023491906126c2565b60405180910390f35b348015610248575f5ffd5b50610251610738565b60405161025e91906127b3565b60405180910390f35b348015610272575f5ffd5b5061028d6004803603810190610288919061270e565b61075d565b60405161029a91906127db565b60405180910390f35b3480156102ae575f5ffd5b506102b761077a565b6040516102c491906127db565b60405180910390f35b3480156102d8575f5ffd5b506102f360048036038101906102ee919061282f565b61079e565b005b348015610300575f5ffd5b5061031b6004803603810190610316919061282f565b6107bf565b005b348015610328575f5ffd5b50610343600480360381019061033e919061286d565b610842565b005b348015610350575f5ffd5b506103596109c8565b60405161036691906127db565b60405180910390f35b34801561037a575f5ffd5b506103836109ec565b005b348015610390575f5ffd5b506103ab60048036038101906103a69190612901565b610a95565b005b6103c760048036038101906103c29190612ac6565b610d6d565b005b3480156103d4575f5ffd5b506103dd610ea9565b6040516103ea91906127db565b60405180910390f35b3480156103fe575f5ffd5b50610407610f60565b60405161041491906127db565b60405180910390f35b348015610428575f5ffd5b50610431610f84565b60405161043e91906126c2565b60405180910390f35b348015610452575f5ffd5b5061046d60048036038101906104689190612b7d565b611018565b005b34801561047a575f5ffd5b50610483611095565b005b348015610490575f5ffd5b506104ab60048036038101906104a69190612bc8565b61113e565b005b3480156104b8575f5ffd5b506104d360048036038101906104ce919061282f565b611320565b6040516104e091906126c2565b60405180910390f35b3480156104f4575f5ffd5b5061050f600480360381019061050a9190612cf2565b611384565b005b34801561051c575f5ffd5b50610525611587565b60405161053291906127db565b60405180910390f35b348015610546575f5ffd5b5061054f61158d565b60405161055c91906127db565b60405180910390f35b348015610570575f5ffd5b506105796115b1565b60405161058691906127db565b60405180910390f35b34801561059a575f5ffd5b506105a36115b7565b6040516105b091906127db565b60405180910390f35b3480156105c4575f5ffd5b506105df60048036038101906105da919061282f565b6115db565b005b3480156105ec575f5ffd5b506105f56115fc565b6040516106029190612d78565b60405180910390f35b348015610616575f5ffd5b50610631600480360381019061062c9190612b7d565b611616565b005b34801561063e575f5ffd5b506106596004803603810190610654919061286d565b611693565b60405161066691906126c2565b60405180910390f35b34801561067a575f5ffd5b5061068361174d565b6040516106909190612db1565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070b575061070a82611772565b5b9050919050565b5f60fe5f8381526020019081526020015f205f9054906101000a900460ff169050919050565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60655f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6107a78261075d565b6107b0816117db565b6107ba83836117ef565b505050565b6107c76118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90612e4a565b60405180910390fd5b61083e82826118d1565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16036108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661090f6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90612f66565b60405180910390fd5b61096e816119ff565b6109c5815f67ffffffffffffffff81111561098c5761098b6129a2565b5b6040519080825280601f01601f1916602001820160405280156109be5781602001600182028036833780820191505090505b505f611a2d565b50565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610a16816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610a7c575f5ffd5b505af1158015610a8e573d5f5f3e3d5ffd5b5050505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610abf816117db565b5f8603610af8576040517ff45f481800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603610b5d576040517f915bcfe900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf883089898989896040518863ffffffff1660e01b8152600401610bc39796959493929190612fb1565b5f604051808303815f87803b158015610bda575f5ffd5b505af1158015610bec573d5f5f3e3d5ffd5b5050505060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8830896040518463ffffffff1660e01b8152600401610c4e9392919061301e565b6020604051808303815f875af1158015610c6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e919061307d565b5060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68876040518263ffffffff1660e01b8152600401610ce991906130a8565b5f604051808303815f87803b158015610d00575f5ffd5b505af1158015610d12573d5f5f3e3d5ffd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fd140e4b36186a1a884cc163ad7ee8c187ea22a5496df5f4f906c2ebf5d82f39987604051610d5c91906130a8565b60405180910390a250505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610e3a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790612f66565b60405180910390fd5b610e99826119ff565b610ea582826001611a2d565b5050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613131565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d181565b5f60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611013919061307d565b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611042816117db565b5f5f90505b8383905081101561108f576110828484838181106110685761106761314f565b5b905060200201602081019061107d919061286d565b611b97565b8080600101915050611047565b50505050565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d6110bf816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611125575f5ffd5b505af1158015611137573d5f5f3e3d5ffd5b5050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611168816117db565b60fd5485146111b2578460fd546040517f653f4c650000000000000000000000000000000000000000000000000000000081526004016111a992919061317c565b60405180910390fd5b60fe5f8781526020019081526020015f205f9054906101000a900460ff161561121257856040517f4151bb8700000000000000000000000000000000000000000000000000000000815260040161120991906127db565b60405180910390fd5b600160fe5f8881526020019081526020015f205f6101000a81548160ff02191690831515021790555060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e44f0b128486896040518463ffffffff1660e01b8152600401611299939291906131a3565b5f604051808303815f87803b1580156112b0575f5ffd5b505af11580156112c2573d5f5f3e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff1685877f1e058c4f3a13be8a7b8b880554aad8437ae010e0efa514070822351f39616a6887866040516113109291906131d8565b60405180910390a4505050505050565b5f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f60019054906101000a900460ff161590508080156113b4575060015f5f9054906101000a900460ff1660ff16105b806113e157506113c330611de1565b1580156113e0575060015f5f9054906101000a900460ff1660ff16145b5b611420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114179061326f565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff160217905550801561145b5760015f60016101000a81548160ff0219169083151502179055505b8560fb5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460fc5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360fc60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260fd81905550611513611e03565b61151b611e53565b6115275f5f1b836117ef565b801561157f575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161157691906132c6565b60405180910390a15b505050505050565b5f5f1b81565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150881565b60fd5481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6115e48261075d565b6115ed816117db565b6115f783836118d1565b505050565b60fc60149054906101000a900467ffffffffffffffff1681565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611640816117db565b5f5f90505b8383905081101561168d576116808484838181106116665761166561314f565b5b905060200201602081019061167b919061286d565b611ea3565b8080600101915050611645565b50505050565b5f60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16846040518363ffffffff1660e01b81526004016117069291906132df565b602060405180830381865afa158015611721573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611745919061307d565b159050919050565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117ec816117e76118ca565b61207d565b50565b6117f98282611320565b6118c657600160655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061186b6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f33905090565b6118db8282611320565b156119a8575f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061194d6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f6119d87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba101508611a29816117db565b5050565b611a587f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435f1b61210a565b5f015f9054906101000a900460ff1615611a7a57611a7583612113565b611b92565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae257506040513d601f19601f82011682018060405250810190611adf919061331a565b60015b611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906133b5565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613443565b60405180910390fd5b50611b918383836121c9565b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c0757806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611bfe9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611c799291906132df565b602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb8919061307d565b611cf957806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611cf09190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff168360016040518463ffffffff1660e01b8152600401611d6e9392919061347a565b5f604051808303815f87803b158015611d85575f5ffd5b505af1158015611d97573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f28e9b38569d728986e5868b0e113d9a49ee4c47dfc6db29a673e25b3515a56a860405160405180910390a250565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e489061351f565b60405180910390fd5b565b5f60019054906101000a900460ff16611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e989061351f565b60405180910390fd5b565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611f159291906132df565b602060405180830381865afa158015611f30573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f54919061307d565b15611f9657806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611f8d9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff16835f6040518463ffffffff1660e01b815260040161200a9392919061347a565b5f604051808303815f87803b158015612021575f5ffd5b505af1158015612033573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa240927645d1251d97459a96c490f3efd3af585e7b0da4814c92aad8ef6ebbf660405160405180910390a250565b6120878282611320565b6120fd57612094816121f4565b6120a1835f1c6020612221565b6040516020016120b2929190613623565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f49190613694565b60405180910390fd5b5050565b5f819050919050565b5f819050919050565b61211c81611de1565b61215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290613724565b60405180910390fd5b806121877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121d283612456565b5f825111806121de5750805b156121ef576121ed83836124a5565b505b505050565b606061221a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612221565b9050919050565b60605f6002836002612233919061376f565b61223d91906137b0565b67ffffffffffffffff811115612256576122556129a2565b5b6040519080825280601f01601f1916602001820160405280156122885781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106122bf576122be61314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123225761232161314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002612360919061376f565b61236a91906137b0565b90505b6001811115612409577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123ac576123ab61314f565b5b1a60f81b8282815181106123c3576123c261314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080612402906137e3565b905061236d565b505f841461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390613854565b60405180910390fd5b8091505092915050565b61245f81612113565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606124ca8383604051806060016040528060278152602001613935602791396124d2565b905092915050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff16856040516124fb91906138b6565b5f60405180830381855af49150503d805f8114612533576040519150601f19603f3d011682016040523d82523d5f602084013e612538565b606091505b509150915061254986838387612554565b925050509392505050565b606083156125b5575f8351036125ad5761256d85611de1565b6125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a390613916565b60405180910390fd5b5b8290506125c0565b6125bf83836125c8565b5b949350505050565b5f825111156125da5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e9190613694565b60405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61265c81612628565b8114612666575f5ffd5b50565b5f8135905061267781612653565b92915050565b5f6020828403121561269257612691612620565b5b5f61269f84828501612669565b91505092915050565b5f8115159050919050565b6126bc816126a8565b82525050565b5f6020820190506126d55f8301846126b3565b92915050565b5f819050919050565b6126ed816126db565b81146126f7575f5ffd5b50565b5f81359050612708816126e4565b92915050565b5f6020828403121561272357612722612620565b5b5f612730848285016126fa565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61277b61277661277184612739565b612758565b612739565b9050919050565b5f61278c82612761565b9050919050565b5f61279d82612782565b9050919050565b6127ad81612793565b82525050565b5f6020820190506127c65f8301846127a4565b92915050565b6127d5816126db565b82525050565b5f6020820190506127ee5f8301846127cc565b92915050565b5f6127fe82612739565b9050919050565b61280e816127f4565b8114612818575f5ffd5b50565b5f8135905061282981612805565b92915050565b5f5f6040838503121561284557612844612620565b5b5f612852858286016126fa565b92505060206128638582860161281b565b9150509250929050565b5f6020828403121561288257612881612620565b5b5f61288f8482850161281b565b91505092915050565b5f819050919050565b6128aa81612898565b81146128b4575f5ffd5b50565b5f813590506128c5816128a1565b92915050565b5f60ff82169050919050565b6128e0816128cb565b81146128ea575f5ffd5b50565b5f813590506128fb816128d7565b92915050565b5f5f5f5f5f5f60c0878903121561291b5761291a612620565b5b5f61292889828a0161281b565b965050602061293989828a016128b7565b955050604061294a89828a016128b7565b945050606061295b89828a016128ed565b935050608061296c89828a016126fa565b92505060a061297d89828a016126fa565b9150509295509295509295565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129d882612992565b810181811067ffffffffffffffff821117156129f7576129f66129a2565b5b80604052505050565b5f612a09612617565b9050612a1582826129cf565b919050565b5f67ffffffffffffffff821115612a3457612a336129a2565b5b612a3d82612992565b9050602081019050919050565b828183375f83830152505050565b5f612a6a612a6584612a1a565b612a00565b905082815260208101848484011115612a8657612a8561298e565b5b612a91848285612a4a565b509392505050565b5f82601f830112612aad57612aac61298a565b5b8135612abd848260208601612a58565b91505092915050565b5f5f60408385031215612adc57612adb612620565b5b5f612ae98582860161281b565b925050602083013567ffffffffffffffff811115612b0a57612b09612624565b5b612b1685828601612a99565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f83601f840112612b3d57612b3c61298a565b5b8235905067ffffffffffffffff811115612b5a57612b59612b20565b5b602083019150836020820283011115612b7657612b75612b24565b5b9250929050565b5f5f60208385031215612b9357612b92612620565b5b5f83013567ffffffffffffffff811115612bb057612baf612624565b5b612bbc85828601612b28565b92509250509250929050565b5f5f5f5f5f60a08688031215612be157612be0612620565b5b5f612bee888289016126fa565b9550506020612bff888289016126fa565b9450506040612c10888289016128b7565b9350506060612c218882890161281b565b9250506080612c32888289016128b7565b9150509295509295909350565b5f612c49826127f4565b9050919050565b612c5981612c3f565b8114612c63575f5ffd5b50565b5f81359050612c7481612c50565b92915050565b5f612c84826127f4565b9050919050565b612c9481612c7a565b8114612c9e575f5ffd5b50565b5f81359050612caf81612c8b565b92915050565b5f67ffffffffffffffff82169050919050565b612cd181612cb5565b8114612cdb575f5ffd5b50565b5f81359050612cec81612cc8565b92915050565b5f5f5f5f5f60a08688031215612d0b57612d0a612620565b5b5f612d1888828901612c66565b9550506020612d2988828901612ca1565b9450506040612d3a88828901612cde565b9350506060612d4b888289016126fa565b9250506080612d5c8882890161281b565b9150509295509295909350565b612d7281612cb5565b82525050565b5f602082019050612d8b5f830184612d69565b92915050565b5f612d9b82612782565b9050919050565b612dab81612d91565b82525050565b5f602082019050612dc45f830184612da2565b92915050565b5f82825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612e34602f83612dca565b9150612e3f82612dda565b604082019050919050565b5f6020820190508181035f830152612e6181612e28565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b5f612ec2602c83612dca565b9150612ecd82612e68565b604082019050919050565b5f6020820190508181035f830152612eef81612eb6565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b5f612f50602c83612dca565b9150612f5b82612ef6565b604082019050919050565b5f6020820190508181035f830152612f7d81612f44565b9050919050565b612f8d816127f4565b82525050565b612f9c81612898565b82525050565b612fab816128cb565b82525050565b5f60e082019050612fc45f83018a612f84565b612fd16020830189612f84565b612fde6040830188612f93565b612feb6060830187612f93565b612ff86080830186612fa2565b61300560a08301856127cc565b61301260c08301846127cc565b98975050505050505050565b5f6060820190506130315f830186612f84565b61303e6020830185612f84565b61304b6040830184612f93565b949350505050565b61305c816126a8565b8114613066575f5ffd5b50565b5f8151905061307781613053565b92915050565b5f6020828403121561309257613091612620565b5b5f61309f84828501613069565b91505092915050565b5f6020820190506130bb5f830184612f93565b92915050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c5f8201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b5f61311b603883612dca565b9150613126826130c1565b604082019050919050565b5f6020820190508181035f8301526131488161310f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60408201905061318f5f8301856127cc565b61319c60208301846127cc565b9392505050565b5f6060820190506131b65f830186612f84565b6131c36020830185612f93565b6131d060408301846127cc565b949350505050565b5f6040820190506131eb5f830185612f93565b6131f86020830184612f93565b9392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f613259602e83612dca565b9150613264826131ff565b604082019050919050565b5f6020820190508181035f8301526132868161324d565b9050919050565b5f819050919050565b5f6132b06132ab6132a68461328d565b612758565b6128cb565b9050919050565b6132c081613296565b82525050565b5f6020820190506132d95f8301846132b7565b92915050565b5f6040820190506132f25f830185612d69565b6132ff6020830184612f84565b9392505050565b5f81519050613314816126e4565b92915050565b5f6020828403121561332f5761332e612620565b5b5f61333c84828501613306565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e746174695f8201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b5f61339f602e83612dca565b91506133aa82613345565b604082019050919050565b5f6020820190508181035f8301526133cc81613393565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f785f8201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b5f61342d602983612dca565b9150613438826133d3565b604082019050919050565b5f6020820190508181035f83015261345a81613421565b9050919050565b5f6020820190506134745f830184612f84565b92915050565b5f60608201905061348d5f830186612d69565b61349a6020830185612f84565b6134a760408301846126b3565b949350505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f613509602b83612dca565b9150613514826134af565b604082019050919050565b5f6020820190508181035f830152613536816134fd565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f61357b60178361353d565b915061358682613547565b601782019050919050565b5f81519050919050565b8281835e5f83830152505050565b5f6135b382613591565b6135bd818561353d565b93506135cd81856020860161359b565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61360d60118361353d565b9150613618826135d9565b601182019050919050565b5f61362d8261356f565b915061363982856135a9565b915061364482613601565b915061365082846135a9565b91508190509392505050565b5f61366682613591565b6136708185612dca565b935061368081856020860161359b565b61368981612992565b840191505092915050565b5f6020820190508181035f8301526136ac818461365c565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e5f8201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b5f61370e602d83612dca565b9150613719826136b4565b604082019050919050565b5f6020820190508181035f83015261373b81613702565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61377982612898565b915061378483612898565b925082820261379281612898565b915082820484148315176137a9576137a8613742565b5b5092915050565b5f6137ba82612898565b91506137c583612898565b92508282019050808211156137dd576137dc613742565b5b92915050565b5f6137ed82612898565b91505f82036137ff576137fe613742565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61383e602083612dca565b91506138498261380a565b602082019050919050565b5f6020820190508181035f83015261386b81613832565b9050919050565b5f81519050919050565b5f81905092915050565b5f61389082613872565b61389a818561387c565b93506138aa81856020860161359b565b80840191505092915050565b5f6138c18284613886565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f613900601d83612dca565b915061390b826138cc565b602082019050919050565b5f6020820190508181035f83015261392d816138f4565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200b7149a0fe875551868c96b00664223e918c558d3324a88bf0918f9399ccfb0f64736f6c63430008220033","sourceMap":"1297:9335:18:-:0;;;1198:4:7;1155:48;;;;;;;;;2459:53:18;;;;;;;;;;2483:22;:20;;;:22;;:::i;:::-;1297:9335;;5939:280:6;6007:13;;;;;;;;;;;6006:14;5998:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6094:15;6078:31;;:12;;;;;;;;;;;:31;;;6074:139;;6140:15;6125:12;;:30;;;;;;;;;;;;;;;;;;6174:28;6186:15;6174:28;;;;;;:::i;:::-;;;;;;;;6074:139;5939:280::o;7:169:20:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:226::-;322:34;318:1;310:6;306:14;299:58;391:9;386:2;378:6;374:15;367:34;182:226;:::o;414:366::-;556:3;577:67;641:2;636:3;577:67;:::i;:::-;570:74;;653:93;742:3;653:93;:::i;:::-;771:2;766:3;762:12;755:19;;414:366;;;:::o;786:419::-;952:4;990:2;979:9;975:18;967:26;;1039:9;1033:4;1029:20;1025:1;1014:9;1010:17;1003:47;1067:131;1193:4;1067:131;:::i;:::-;1059:139;;786:419;;;:::o;1211:86::-;1246:7;1286:4;1279:5;1275:16;1264:27;;1211:86;;;:::o;1303:112::-;1386:22;1402:5;1386:22;:::i;:::-;1381:3;1374:35;1303:112;;:::o;1421:214::-;1510:4;1548:2;1537:9;1533:18;1525:26;;1561:67;1625:1;1614:9;1610:17;1601:6;1561:67;:::i;:::-;1421:214;;;;:::o;1297:9335:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101c1575f3560e01c80635c975abb116100f6578063b908afa811610094578063ee89ef3a11610063578063ee89ef3a146105e1578063faed47fd1461060b578063fbac395114610633578063fc0c546a1461066f576101c1565b8063b908afa81461053b578063bb4a054314610565578063d53913931461058f578063d547741f146105b9576101c1565b80638fec57dd116100d05780638fec57dd1461048557806391d14854146104ad57806398efe62d146104e9578063a217fddf14610511576101c1565b80635c975abb1461041d5780636abf7081146104475780638456cb591461046f576101c1565b80633659cfe6116101635780634cdce9331161013d5780634cdce933146103855780634f1ef286146103ad57806352d1902d146103c9578063596b1f4d146103f3576101c1565b80633659cfe61461031d578063389ed267146103455780633f4ba83a1461036f576101c1565b8063248a9ca31161019f578063248a9ca314610267578063282c51f3146102a35780632f2ff15d146102cd57806336568abe146102f5576101c1565b806301ffc9a7146101c557806311c16896146102015780631c4dd7d01461023d575b5f5ffd5b3480156101d0575f5ffd5b506101eb60048036038101906101e6919061267d565b610699565b6040516101f891906126c2565b60405180910390f35b34801561020c575f5ffd5b506102276004803603810190610222919061270e565b610712565b60405161023491906126c2565b60405180910390f35b348015610248575f5ffd5b50610251610738565b60405161025e91906127b3565b60405180910390f35b348015610272575f5ffd5b5061028d6004803603810190610288919061270e565b61075d565b60405161029a91906127db565b60405180910390f35b3480156102ae575f5ffd5b506102b761077a565b6040516102c491906127db565b60405180910390f35b3480156102d8575f5ffd5b506102f360048036038101906102ee919061282f565b61079e565b005b348015610300575f5ffd5b5061031b6004803603810190610316919061282f565b6107bf565b005b348015610328575f5ffd5b50610343600480360381019061033e919061286d565b610842565b005b348015610350575f5ffd5b506103596109c8565b60405161036691906127db565b60405180910390f35b34801561037a575f5ffd5b506103836109ec565b005b348015610390575f5ffd5b506103ab60048036038101906103a69190612901565b610a95565b005b6103c760048036038101906103c29190612ac6565b610d6d565b005b3480156103d4575f5ffd5b506103dd610ea9565b6040516103ea91906127db565b60405180910390f35b3480156103fe575f5ffd5b50610407610f60565b60405161041491906127db565b60405180910390f35b348015610428575f5ffd5b50610431610f84565b60405161043e91906126c2565b60405180910390f35b348015610452575f5ffd5b5061046d60048036038101906104689190612b7d565b611018565b005b34801561047a575f5ffd5b50610483611095565b005b348015610490575f5ffd5b506104ab60048036038101906104a69190612bc8565b61113e565b005b3480156104b8575f5ffd5b506104d360048036038101906104ce919061282f565b611320565b6040516104e091906126c2565b60405180910390f35b3480156104f4575f5ffd5b5061050f600480360381019061050a9190612cf2565b611384565b005b34801561051c575f5ffd5b50610525611587565b60405161053291906127db565b60405180910390f35b348015610546575f5ffd5b5061054f61158d565b60405161055c91906127db565b60405180910390f35b348015610570575f5ffd5b506105796115b1565b60405161058691906127db565b60405180910390f35b34801561059a575f5ffd5b506105a36115b7565b6040516105b091906127db565b60405180910390f35b3480156105c4575f5ffd5b506105df60048036038101906105da919061282f565b6115db565b005b3480156105ec575f5ffd5b506105f56115fc565b6040516106029190612d78565b60405180910390f35b348015610616575f5ffd5b50610631600480360381019061062c9190612b7d565b611616565b005b34801561063e575f5ffd5b506106596004803603810190610654919061286d565b611693565b60405161066691906126c2565b60405180910390f35b34801561067a575f5ffd5b5061068361174d565b6040516106909190612db1565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070b575061070a82611772565b5b9050919050565b5f60fe5f8381526020019081526020015f205f9054906101000a900460ff169050919050565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60655f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6107a78261075d565b6107b0816117db565b6107ba83836117ef565b505050565b6107c76118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90612e4a565b60405180910390fd5b61083e82826118d1565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16036108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661090f6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90612f66565b60405180910390fd5b61096e816119ff565b6109c5815f67ffffffffffffffff81111561098c5761098b6129a2565b5b6040519080825280601f01601f1916602001820160405280156109be5781602001600182028036833780820191505090505b505f611a2d565b50565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610a16816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610a7c575f5ffd5b505af1158015610a8e573d5f5f3e3d5ffd5b5050505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610abf816117db565b5f8603610af8576040517ff45f481800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603610b5d576040517f915bcfe900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf883089898989896040518863ffffffff1660e01b8152600401610bc39796959493929190612fb1565b5f604051808303815f87803b158015610bda575f5ffd5b505af1158015610bec573d5f5f3e3d5ffd5b5050505060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8830896040518463ffffffff1660e01b8152600401610c4e9392919061301e565b6020604051808303815f875af1158015610c6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e919061307d565b5060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68876040518263ffffffff1660e01b8152600401610ce991906130a8565b5f604051808303815f87803b158015610d00575f5ffd5b505af1158015610d12573d5f5f3e3d5ffd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fd140e4b36186a1a884cc163ad7ee8c187ea22a5496df5f4f906c2ebf5d82f39987604051610d5c91906130a8565b60405180910390a250505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290612ed8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610e3a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790612f66565b60405180910390fd5b610e99826119ff565b610ea582826001611a2d565b5050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613131565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d181565b5f60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611013919061307d565b905090565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611042816117db565b5f5f90505b8383905081101561108f576110828484838181106110685761106761314f565b5b905060200201602081019061107d919061286d565b611b97565b8080600101915050611047565b50505050565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d6110bf816117db565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611125575f5ffd5b505af1158015611137573d5f5f3e3d5ffd5b5050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611168816117db565b60fd5485146111b2578460fd546040517f653f4c650000000000000000000000000000000000000000000000000000000081526004016111a992919061317c565b60405180910390fd5b60fe5f8781526020019081526020015f205f9054906101000a900460ff161561121257856040517f4151bb8700000000000000000000000000000000000000000000000000000000815260040161120991906127db565b60405180910390fd5b600160fe5f8881526020019081526020015f205f6101000a81548160ff02191690831515021790555060fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e44f0b128486896040518463ffffffff1660e01b8152600401611299939291906131a3565b5f604051808303815f87803b1580156112b0575f5ffd5b505af11580156112c2573d5f5f3e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff1685877f1e058c4f3a13be8a7b8b880554aad8437ae010e0efa514070822351f39616a6887866040516113109291906131d8565b60405180910390a4505050505050565b5f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f60019054906101000a900460ff161590508080156113b4575060015f5f9054906101000a900460ff1660ff16105b806113e157506113c330611de1565b1580156113e0575060015f5f9054906101000a900460ff1660ff16145b5b611420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114179061326f565b60405180910390fd5b60015f5f6101000a81548160ff021916908360ff160217905550801561145b5760015f60016101000a81548160ff0219169083151502179055505b8560fb5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460fc5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360fc60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260fd81905550611513611e03565b61151b611e53565b6115275f5f1b836117ef565b801561157f575f5f60016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161157691906132c6565b60405180910390a15b505050505050565b5f5f1b81565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150881565b60fd5481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6115e48261075d565b6115ed816117db565b6115f783836118d1565b505050565b60fc60149054906101000a900467ffffffffffffffff1681565b7fdef752f6ad59be9880423e079755189539de01983d091b3c097e4742fd9916d1611640816117db565b5f5f90505b8383905081101561168d576116808484838181106116665761166561314f565b5b905060200201602081019061167b919061286d565b611ea3565b8080600101915050611645565b50505050565b5f60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16846040518363ffffffff1660e01b81526004016117069291906132df565b602060405180830381865afa158015611721573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611745919061307d565b159050919050565b60fb5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6117ec816117e76118ca565b61207d565b50565b6117f98282611320565b6118c657600160655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061186b6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f33905090565b6118db8282611320565b156119a8575f60655f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061194d6118ca565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f6119d87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba101508611a29816117db565b5050565b611a587f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435f1b61210a565b5f015f9054906101000a900460ff1615611a7a57611a7583612113565b611b92565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae257506040513d601f19601f82011682018060405250810190611adf919061331a565b60015b611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906133b5565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613443565b60405180910390fd5b50611b918383836121c9565b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c0757806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611bfe9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611c799291906132df565b602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb8919061307d565b611cf957806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611cf09190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff168360016040518463ffffffff1660e01b8152600401611d6e9392919061347a565b5f604051808303815f87803b158015611d85575f5ffd5b505af1158015611d97573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f28e9b38569d728986e5868b0e113d9a49ee4c47dfc6db29a673e25b3515a56a860405160405180910390a250565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f60019054906101000a900460ff16611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e489061351f565b60405180910390fd5b565b5f60019054906101000a900460ff16611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e989061351f565b60405180910390fd5b565b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a1179e60fc60149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401611f159291906132df565b602060405180830381865afa158015611f30573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f54919061307d565b15611f9657806040517f93dcb7c1000000000000000000000000000000000000000000000000000000008152600401611f8d9190613461565b60405180910390fd5b60fc5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c62b27d460fc60149054906101000a900467ffffffffffffffff16835f6040518463ffffffff1660e01b815260040161200a9392919061347a565b5f604051808303815f87803b158015612021575f5ffd5b505af1158015612033573d5f5f3e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa240927645d1251d97459a96c490f3efd3af585e7b0da4814c92aad8ef6ebbf660405160405180910390a250565b6120878282611320565b6120fd57612094816121f4565b6120a1835f1c6020612221565b6040516020016120b2929190613623565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f49190613694565b60405180910390fd5b5050565b5f819050919050565b5f819050919050565b61211c81611de1565b61215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290613724565b60405180910390fd5b806121877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612101565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121d283612456565b5f825111806121de5750805b156121ef576121ed83836124a5565b505b505050565b606061221a8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612221565b9050919050565b60605f6002836002612233919061376f565b61223d91906137b0565b67ffffffffffffffff811115612256576122556129a2565b5b6040519080825280601f01601f1916602001820160405280156122885781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106122bf576122be61314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123225761232161314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002612360919061376f565b61236a91906137b0565b90505b6001811115612409577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123ac576123ab61314f565b5b1a60f81b8282815181106123c3576123c261314f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080612402906137e3565b905061236d565b505f841461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390613854565b60405180910390fd5b8091505092915050565b61245f81612113565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606124ca8383604051806060016040528060278152602001613935602791396124d2565b905092915050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff16856040516124fb91906138b6565b5f60405180830381855af49150503d805f8114612533576040519150601f19603f3d011682016040523d82523d5f602084013e612538565b606091505b509150915061254986838387612554565b925050509392505050565b606083156125b5575f8351036125ad5761256d85611de1565b6125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a390613916565b60405180910390fd5b5b8290506125c0565b6125bf83836125c8565b5b949350505050565b5f825111156125da5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e9190613694565b60405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61265c81612628565b8114612666575f5ffd5b50565b5f8135905061267781612653565b92915050565b5f6020828403121561269257612691612620565b5b5f61269f84828501612669565b91505092915050565b5f8115159050919050565b6126bc816126a8565b82525050565b5f6020820190506126d55f8301846126b3565b92915050565b5f819050919050565b6126ed816126db565b81146126f7575f5ffd5b50565b5f81359050612708816126e4565b92915050565b5f6020828403121561272357612722612620565b5b5f612730848285016126fa565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61277b61277661277184612739565b612758565b612739565b9050919050565b5f61278c82612761565b9050919050565b5f61279d82612782565b9050919050565b6127ad81612793565b82525050565b5f6020820190506127c65f8301846127a4565b92915050565b6127d5816126db565b82525050565b5f6020820190506127ee5f8301846127cc565b92915050565b5f6127fe82612739565b9050919050565b61280e816127f4565b8114612818575f5ffd5b50565b5f8135905061282981612805565b92915050565b5f5f6040838503121561284557612844612620565b5b5f612852858286016126fa565b92505060206128638582860161281b565b9150509250929050565b5f6020828403121561288257612881612620565b5b5f61288f8482850161281b565b91505092915050565b5f819050919050565b6128aa81612898565b81146128b4575f5ffd5b50565b5f813590506128c5816128a1565b92915050565b5f60ff82169050919050565b6128e0816128cb565b81146128ea575f5ffd5b50565b5f813590506128fb816128d7565b92915050565b5f5f5f5f5f5f60c0878903121561291b5761291a612620565b5b5f61292889828a0161281b565b965050602061293989828a016128b7565b955050604061294a89828a016128b7565b945050606061295b89828a016128ed565b935050608061296c89828a016126fa565b92505060a061297d89828a016126fa565b9150509295509295509295565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129d882612992565b810181811067ffffffffffffffff821117156129f7576129f66129a2565b5b80604052505050565b5f612a09612617565b9050612a1582826129cf565b919050565b5f67ffffffffffffffff821115612a3457612a336129a2565b5b612a3d82612992565b9050602081019050919050565b828183375f83830152505050565b5f612a6a612a6584612a1a565b612a00565b905082815260208101848484011115612a8657612a8561298e565b5b612a91848285612a4a565b509392505050565b5f82601f830112612aad57612aac61298a565b5b8135612abd848260208601612a58565b91505092915050565b5f5f60408385031215612adc57612adb612620565b5b5f612ae98582860161281b565b925050602083013567ffffffffffffffff811115612b0a57612b09612624565b5b612b1685828601612a99565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f83601f840112612b3d57612b3c61298a565b5b8235905067ffffffffffffffff811115612b5a57612b59612b20565b5b602083019150836020820283011115612b7657612b75612b24565b5b9250929050565b5f5f60208385031215612b9357612b92612620565b5b5f83013567ffffffffffffffff811115612bb057612baf612624565b5b612bbc85828601612b28565b92509250509250929050565b5f5f5f5f5f60a08688031215612be157612be0612620565b5b5f612bee888289016126fa565b9550506020612bff888289016126fa565b9450506040612c10888289016128b7565b9350506060612c218882890161281b565b9250506080612c32888289016128b7565b9150509295509295909350565b5f612c49826127f4565b9050919050565b612c5981612c3f565b8114612c63575f5ffd5b50565b5f81359050612c7481612c50565b92915050565b5f612c84826127f4565b9050919050565b612c9481612c7a565b8114612c9e575f5ffd5b50565b5f81359050612caf81612c8b565b92915050565b5f67ffffffffffffffff82169050919050565b612cd181612cb5565b8114612cdb575f5ffd5b50565b5f81359050612cec81612cc8565b92915050565b5f5f5f5f5f60a08688031215612d0b57612d0a612620565b5b5f612d1888828901612c66565b9550506020612d2988828901612ca1565b9450506040612d3a88828901612cde565b9350506060612d4b888289016126fa565b9250506080612d5c8882890161281b565b9150509295509295909350565b612d7281612cb5565b82525050565b5f602082019050612d8b5f830184612d69565b92915050565b5f612d9b82612782565b9050919050565b612dab81612d91565b82525050565b5f602082019050612dc45f830184612da2565b92915050565b5f82825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612e34602f83612dca565b9150612e3f82612dda565b604082019050919050565b5f6020820190508181035f830152612e6181612e28565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b5f612ec2602c83612dca565b9150612ecd82612e68565b604082019050919050565b5f6020820190508181035f830152612eef81612eb6565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f756768205f8201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b5f612f50602c83612dca565b9150612f5b82612ef6565b604082019050919050565b5f6020820190508181035f830152612f7d81612f44565b9050919050565b612f8d816127f4565b82525050565b612f9c81612898565b82525050565b612fab816128cb565b82525050565b5f60e082019050612fc45f83018a612f84565b612fd16020830189612f84565b612fde6040830188612f93565b612feb6060830187612f93565b612ff86080830186612fa2565b61300560a08301856127cc565b61301260c08301846127cc565b98975050505050505050565b5f6060820190506130315f830186612f84565b61303e6020830185612f84565b61304b6040830184612f93565b949350505050565b61305c816126a8565b8114613066575f5ffd5b50565b5f8151905061307781613053565b92915050565b5f6020828403121561309257613091612620565b5b5f61309f84828501613069565b91505092915050565b5f6020820190506130bb5f830184612f93565b92915050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c5f8201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b5f61311b603883612dca565b9150613126826130c1565b604082019050919050565b5f6020820190508181035f8301526131488161310f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60408201905061318f5f8301856127cc565b61319c60208301846127cc565b9392505050565b5f6060820190506131b65f830186612f84565b6131c36020830185612f93565b6131d060408301846127cc565b949350505050565b5f6040820190506131eb5f830185612f93565b6131f86020830184612f93565b9392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f613259602e83612dca565b9150613264826131ff565b604082019050919050565b5f6020820190508181035f8301526132868161324d565b9050919050565b5f819050919050565b5f6132b06132ab6132a68461328d565b612758565b6128cb565b9050919050565b6132c081613296565b82525050565b5f6020820190506132d95f8301846132b7565b92915050565b5f6040820190506132f25f830185612d69565b6132ff6020830184612f84565b9392505050565b5f81519050613314816126e4565b92915050565b5f6020828403121561332f5761332e612620565b5b5f61333c84828501613306565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e746174695f8201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b5f61339f602e83612dca565b91506133aa82613345565b604082019050919050565b5f6020820190508181035f8301526133cc81613393565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f785f8201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b5f61342d602983612dca565b9150613438826133d3565b604082019050919050565b5f6020820190508181035f83015261345a81613421565b9050919050565b5f6020820190506134745f830184612f84565b92915050565b5f60608201905061348d5f830186612d69565b61349a6020830185612f84565b6134a760408301846126b3565b949350505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420695f8201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b5f613509602b83612dca565b9150613514826134af565b604082019050919050565b5f6020820190508181035f830152613536816134fd565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f61357b60178361353d565b915061358682613547565b601782019050919050565b5f81519050919050565b8281835e5f83830152505050565b5f6135b382613591565b6135bd818561353d565b93506135cd81856020860161359b565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61360d60118361353d565b9150613618826135d9565b601182019050919050565b5f61362d8261356f565b915061363982856135a9565b915061364482613601565b915061365082846135a9565b91508190509392505050565b5f61366682613591565b6136708185612dca565b935061368081856020860161359b565b61368981612992565b840191505092915050565b5f6020820190508181035f8301526136ac818461365c565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e5f8201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b5f61370e602d83612dca565b9150613719826136b4565b604082019050919050565b5f6020820190508181035f83015261373b81613702565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61377982612898565b915061378483612898565b925082820261379281612898565b915082820484148315176137a9576137a8613742565b5b5092915050565b5f6137ba82612898565b91506137c583612898565b92508282019050808211156137dd576137dc613742565b5b92915050565b5f6137ed82612898565b91505f82036137ff576137fe613742565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61383e602083612dca565b91506138498261380a565b602082019050919050565b5f6020820190508181035f83015261386b81613832565b9050919050565b5f81519050919050565b5f81905092915050565b5f61389082613872565b61389a818561387c565b93506138aa81856020860161359b565b80840191505092915050565b5f6138c18284613886565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f613900601d83612dca565b915061390b826138cc565b602082019050919050565b5f6020820190508181035f83015261392d816138f4565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200b7149a0fe875551868c96b00664223e918c558d3324a88bf0918f9399ccfb0f64736f6c63430008220033","sourceMap":"1297:9335:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3050:213:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9822:116:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1609:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4855:129:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2127:62:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5280:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6389:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3408:195:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2269:60:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4270:81;;;;;;;;;;;;;:::i;:::-;;6760:531;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3922:220:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3027:131;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2195:68:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10072:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8654:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4004:77;;;;;;;;;;;;;:::i;:::-;;4879:991;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3350:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3363:456:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2320:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2335:64:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1848:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2059:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5705:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1748:22:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9063:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9471:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1500:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3050:213:0;3135:4;3173:43;3158:58;;;:11;:58;;;;:98;;;;3220:36;3244:11;3220:23;:36::i;:::-;3158:98;3151:105;;3050:213;;;:::o;9822:116:18:-;9882:4;9905:18;:26;9924:6;9905:26;;;;;;;;;;;;;;;;;;;;;9898:33;;9822:116;;;:::o;1609:37::-;;;;;;;;;;;;;:::o;4855:129:0:-;4929:7;4955:6;:12;4962:4;4955:12;;;;;;;;;;;:22;;;4948:29;;4855:129;;;:::o;2127:62:18:-;2165:24;2127:62;:::o;5280:145:0:-;5363:18;5376:4;5363:12;:18::i;:::-;2798:16;2809:4;2798:10;:16::i;:::-;5393:25:::1;5404:4;5410:7;5393:10;:25::i;:::-;5280:145:::0;;;:::o;6389:214::-;6495:12;:10;:12::i;:::-;6484:23;;:7;:23;;;6476:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6570:26;6582:4;6588:7;6570:11;:26::i;:::-;6389:214;;:::o;3408:195:7:-;1764:6;1747:23;;1755:4;1747:23;;;1739:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1861:6;1837:30;;:20;:18;:20::i;:::-;:30;;;1829:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3489:36:::1;3507:17;3489;:36::i;:::-;3535:61;3557:17;3586:1;3576:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3590:5;3535:21;:61::i;:::-;3408:195:::0;:::o;2269:60:18:-;2306:23;2269:60;:::o;4270:81::-;2306:23;2798:16:0;2809:4;2798:10;:16::i;:::-;4329:5:18::1;;;;;;;;;;;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4270:81:::0;:::o;6760:531::-;2165:24;2798:16:0;2809:4;2798:10;:16::i;:::-;6962:1:18::1;6952:6;:11:::0;6948:56:::1;;6972:32;;;;;;;;;;;;;;6948:56;7034:1;7018:18;;:4;:18;;::::0;7014:64:::1;;7045:33;;;;;;;;;;;;;;7014:64;7089:5;;;;;;;;;;;:12;;;7102:4;7116;7123:6;7131:8;7141:1;7144;7147;7089:60;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7159:5;;;;;;;;;;;:18;;;7178:4;7192;7199:6;7159:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7216:5;;;;;;;;;;;:10;;;7227:6;7216:18;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7271:4;7250:34;;;7277:6;7250:34;;;;;;:::i;:::-;;;;;;;;6760:531:::0;;;;;;;:::o;3922:220:7:-;1764:6;1747:23;;1755:4;1747:23;;;1739:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1861:6;1837:30;;:20;:18;:20::i;:::-;:30;;;1829:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;4037:36:::1;4055:17;4037;:36::i;:::-;4083:52;4105:17;4124:4;4130;4083:21;:52::i;:::-;3922:220:::0;;:::o;3027:131::-;3105:7;2199:6;2182:23;;2190:4;2182:23;;;2174:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;1180:66:4::1;3131:20:7;;3124:27;;3027:131:::0;:::o;2195:68:18:-;2236:27;2195:68;:::o;10072:83::-;10111:4;10134:5;;;;;;;;;;;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10127:21;;10072:83;:::o;8654:202::-;2236:27;2798:16:0;2809:4;2798:10;:16::i;:::-;8756:9:18::1;8768:1;8756:13;;8751:99;8775:9;;:16;;8771:1;:20;8751:99;;;8812:27;8826:9;;8836:1;8826:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;8812:13;:27::i;:::-;8793:3;;;;;;;8751:99;;;;8654:202:::0;;;:::o;4004:77::-;2306:23;2798:16:0;2809:4;2798:10;:16::i;:::-;4061:5:18::1;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4004:77:::0;:::o;4879:991::-;2097:24;2798:16:0;2809:4;2798:10;:16::i;:::-;5146:15:18::1;;5126:16;:35;5122:147;;5224:16;5242:15;;5184:74;;;;;;;;;;;;:::i;:::-;;;;;;;;5122:147;5359:18;:35;5378:15;5359:35;;;;;;;;;;;;;;;;;;;;;5355:129;;;5457:15;5417:56;;;;;;;;;;;:::i;:::-;;;;;;;;5355:129;5573:4;5535:18;:35;5554:15;5535:35;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;5680:5;;;;;;;;;;;:18;;;5699:2;5703:6;5711:15;5680:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5842:2;5778:85;;5816:16;5799:15;5778:85;5834:6;5846:16;5778:85;;;;;;;:::i;:::-;;;;;;;;4879:991:::0;;;;;;:::o;3350:145:0:-;3436:4;3459:6;:12;3466:4;3459:12;;;;;;;;;;;:20;;:29;3480:7;3459:29;;;;;;;;;;;;;;;;;;;;;;;;;3452:36;;3350:145;;;;:::o;3363:456:18:-;3279:19:6;3302:13;;;;;;;;;;;3301:14;3279:36;;3347:14;:34;;;;;3380:1;3365:12;;;;;;;;;;;:16;;;3347:34;3346:108;;;;3388:44;3426:4;3388:29;:44::i;:::-;3387:45;:66;;;;;3452:1;3436:12;;;;;;;;;;;:17;;;3387:66;3346:108;3325:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;3551:1;3536:12;;:16;;;;;;;;;;;;;;;;;;3566:14;3562:65;;;3612:4;3596:13;;:20;;;;;;;;;;;;;;;;;;3562:65;3575:6:18::1;3567:5;;:14;;;;;;;;;;;;;;;;;;3608:15;3591:14;;:32;;;;;;;;;;;;;;;;;;3644:9;3633:8;;:20;;;;;;;;;;;;;;;;;;3681:16;3663:15;:34;;;;3708:22;:20;:22::i;:::-;3740:24;:22;:24::i;:::-;3775:37;2365:4:0;3786:18:18;;3806:5;3775:10;:37::i;:::-;3651:14:6::0;3647:99;;;3697:5;3681:13;;:21;;;;;;;;;;;;;;;;;;3721:14;3733:1;3721:14;;;;;;:::i;:::-;;;;;;;;3647:99;3269:483;3363:456:18;;;;;:::o;2320:49:0:-;2365:4;2320:49;;;:::o;2335:64:18:-;2374:25;2335:64;:::o;1848:30::-;;;;:::o;2059:62::-;2097:24;2059:62;:::o;5705:147:0:-;5789:18;5802:4;5789:12;:18::i;:::-;2798:16;2809:4;2798:10;:16::i;:::-;5819:26:::1;5831:4;5837:7;5819:11;:26::i;:::-;5705:147:::0;;;:::o;1748:22:18:-;;;;;;;;;;;;;:::o;9063:206::-;2236:27;2798:16:0;2809:4;2798:10;:16::i;:::-;9167:9:18::1;9179:1;9167:13;;9162:101;9186:9;;:16;;9182:1;:20;9162:101;;;9223:29;9239:9;;9249:1;9239:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;9223:15;:29::i;:::-;9204:3;;;;;;;9162:101;;;;9063:206:::0;;;:::o;9471:134::-;9528:4;9552:14;;;;;;;;;;;:27;;;9580:8;;;;;;;;;;;9590:7;9552:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9551:47;9544:54;;9471:134;;;:::o;1500:19::-;;;;;;;;;;;;;:::o;1081:166:12:-;1166:4;1204:36;1189:51;;;:11;:51;;;;1182:58;;1081:166;;;:::o;3789:103:0:-;3855:30;3866:4;3872:12;:10;:12::i;:::-;3855:10;:30::i;:::-;3789:103;:::o;7938:233::-;8021:22;8029:4;8035:7;8021;:22::i;:::-;8016:149;;8091:4;8059:6;:12;8066:4;8059:12;;;;;;;;;;;:20;;:29;8080:7;8059:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;8141:12;:10;:12::i;:::-;8114:40;;8132:7;8114:40;;8126:4;8114:40;;;;;;;;;;8016:149;7938:233;;:::o;886:96:9:-;939:7;965:10;958:17;;886:96;:::o;8342:234:0:-;8425:22;8433:4;8439:7;8425;:22::i;:::-;8421:149;;;8495:5;8463:6;:12;8470:4;8463:12;;;;;;;;;;;:20;;:29;8484:7;8463:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8546:12;:10;:12::i;:::-;8519:40;;8537:7;8519:40;;8531:4;8519:40;;;;;;;;;;8421:149;8342:234;;:::o;1478:151:4:-;1531:7;1557:59;1180:66;1595:20;;1557:37;:59::i;:::-;:65;;;;;;;;;;;;1550:72;;1478:151;:::o;10260:79:18:-;2374:25;2798:16:0;2809:4;2798:10;:16::i;:::-;10260:79:18;;:::o;2841:944:4:-;3257:53;839:66;3295:14;;3257:37;:53::i;:::-;:59;;;;;;;;;;;;3253:526;;;3332:37;3351:17;3332:18;:37::i;:::-;3253:526;;;3433:17;3404:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3400:302;;3631:56;;;;;;;;;;:::i;:::-;;;;;;;;3400:302;1180:66;3525:20;;3517:4;:28;3509:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;3468:138;3715:53;3733:17;3752:4;3758:9;3715:17;:53::i;:::-;3253:526;2841:944;;;:::o;7437:421:18:-;7518:1;7499:21;;:7;:21;;;7495:106;;7582:7;7543:47;;;;;;;;;;;:::i;:::-;;;;;;;;7495:106;7615:14;;;;;;;;;;;:27;;;7643:8;;;;;;;;;;;7653:7;7615:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7610:132;;7723:7;7684:47;;;;;;;;;;;:::i;:::-;;;;;;;;7610:132;7752:14;;;;;;;;;;;:36;;;7789:8;;;;;;;;;;;7799:7;7808:4;7752:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7843:7;7828:23;;;;;;;;;;;;7437:421;:::o;1423:320:8:-;1483:4;1735:1;1713:7;:19;;;:23;1706:30;;1423:320;;;:::o;2838:65:0:-;5374:13:6;;;;;;;;;;;5366:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2838:65:0:o;2290:67:7:-;5374:13:6;;;;;;;;;;;5366:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2290:67:7:o;8011:310:18:-;8075:14;;;;;;;;;;;:27;;;8103:8;;;;;;;;;;;8113:7;8075:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8071:131;;;8183:7;8144:47;;;;;;;;;;;:::i;:::-;;;;;;;;8071:131;8212:14;;;;;;;;;;;:36;;;8249:8;;;;;;;;;;;8259:7;8268:5;8212:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8306:7;8289:25;;;;;;;;;;;;8011:310;:::o;4173:501:0:-;4261:22;4269:4;4275:7;4261;:22::i;:::-;4256:412;;4444:39;4475:7;4444:30;:39::i;:::-;4554:49;4593:4;4585:13;;4600:2;4554:30;:49::i;:::-;4351:274;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4299:358;;;;;;;;;;;:::i;:::-;;;;;;;;4256:412;4173:501;;:::o;1870:190:10:-;1931:21;2040:4;2030:14;;1870:190;;;:::o;2158:::-;2219:21;2328:4;2318:14;;2158:190;;;:::o;1720:281:4:-;1801:48;1831:17;1801:29;:48::i;:::-;1793:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1977:17;1909:59;1180:66;1947:20;;1909:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;1720:281;:::o;2393:276::-;2501:29;2512:17;2501:10;:29::i;:::-;2558:1;2544:4;:11;:15;:28;;;;2563:9;2544:28;2540:123;;;2588:64;2628:17;2647:4;2588:39;:64::i;:::-;;2540:123;2393:276;;;:::o;2473:149:11:-;2531:13;2563:52;2591:4;2575:22;;376:2;2563:52;;:11;:52::i;:::-;2556:59;;2473:149;;;:::o;1884:437::-;1959:13;1984:19;2029:1;2020:6;2016:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2006:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1984:47;;2041:15;:6;2048:1;2041:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;2066;:6;2073:1;2066:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;2096:9;2121:1;2112:6;2108:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2096:26;;2091:128;2128:1;2124;:5;2091:128;;;2162:8;2179:3;2171:5;:11;2162:21;;;;;;;:::i;:::-;;;;;2150:6;2157:1;2150:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;2207:1;2197:11;;;;;2131:3;;;;:::i;:::-;;;2091:128;;;;2245:1;2236:5;:10;2228:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:6;2293:21;;;1884:437;;;;:::o;2107:152:4:-;2173:37;2192:17;2173:18;:37::i;:::-;2234:17;2225:27;;;;;;;;;;;;2107:152;:::o;6685:198:8:-;6768:12;6799:77;6820:6;6828:4;6799:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;6792:84;;6685:198;;;;:::o;7069:325::-;7210:12;7235;7249:23;7276:6;:19;;7296:4;7276:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7234:67;;;;7318:69;7345:6;7353:7;7362:10;7374:12;7318:26;:69::i;:::-;7311:76;;;;7069:325;;;;;:::o;7682:628::-;7862:12;7890:7;7886:418;;;7938:1;7917:10;:17;:22;7913:286;;8132:18;8143:6;8132:10;:18::i;:::-;8124:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7913:286;8219:10;8212:17;;;;7886:418;8260:33;8268:10;8280:12;8260:7;:33::i;:::-;7682:628;;;;;;;:::o;8832:540::-;9011:1;8991:10;:17;:21;8987:379;;;9219:10;9213:17;9275:15;9262:10;9258:2;9254:19;9247:44;8987:379;9342:12;9335:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:75:20;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:126::-;2246:7;2286:42;2279:5;2275:54;2264:65;;2209:126;;;:::o;2341:60::-;2369:3;2390:5;2383:12;;2341:60;;;:::o;2407:142::-;2457:9;2490:53;2508:34;2517:24;2535:5;2517:24;:::i;:::-;2508:34;:::i;:::-;2490:53;:::i;:::-;2477:66;;2407:142;;;:::o;2555:126::-;2605:9;2638:37;2669:5;2638:37;:::i;:::-;2625:50;;2555:126;;;:::o;2687:150::-;2761:9;2794:37;2825:5;2794:37;:::i;:::-;2781:50;;2687:150;;;:::o;2843:179::-;2954:61;3009:5;2954:61;:::i;:::-;2949:3;2942:74;2843:179;;:::o;3028:270::-;3145:4;3183:2;3172:9;3168:18;3160:26;;3196:95;3288:1;3277:9;3273:17;3264:6;3196:95;:::i;:::-;3028:270;;;;:::o;3304:118::-;3391:24;3409:5;3391:24;:::i;:::-;3386:3;3379:37;3304:118;;:::o;3428:222::-;3521:4;3559:2;3548:9;3544:18;3536:26;;3572:71;3640:1;3629:9;3625:17;3616:6;3572:71;:::i;:::-;3428:222;;;;:::o;3656:96::-;3693:7;3722:24;3740:5;3722:24;:::i;:::-;3711:35;;3656:96;;;:::o;3758:122::-;3831:24;3849:5;3831:24;:::i;:::-;3824:5;3821:35;3811:63;;3870:1;3867;3860:12;3811:63;3758:122;:::o;3886:139::-;3932:5;3970:6;3957:20;3948:29;;3986:33;4013:5;3986:33;:::i;:::-;3886:139;;;;:::o;4031:474::-;4099:6;4107;4156:2;4144:9;4135:7;4131:23;4127:32;4124:119;;;4162:79;;:::i;:::-;4124:119;4282:1;4307:53;4352:7;4343:6;4332:9;4328:22;4307:53;:::i;:::-;4297:63;;4253:117;4409:2;4435:53;4480:7;4471:6;4460:9;4456:22;4435:53;:::i;:::-;4425:63;;4380:118;4031:474;;;;;:::o;4511:329::-;4570:6;4619:2;4607:9;4598:7;4594:23;4590:32;4587:119;;;4625:79;;:::i;:::-;4587:119;4745:1;4770:53;4815:7;4806:6;4795:9;4791:22;4770:53;:::i;:::-;4760:63;;4716:117;4511:329;;;;:::o;4846:77::-;4883:7;4912:5;4901:16;;4846:77;;;:::o;4929:122::-;5002:24;5020:5;5002:24;:::i;:::-;4995:5;4992:35;4982:63;;5041:1;5038;5031:12;4982:63;4929:122;:::o;5057:139::-;5103:5;5141:6;5128:20;5119:29;;5157:33;5184:5;5157:33;:::i;:::-;5057:139;;;;:::o;5202:86::-;5237:7;5277:4;5270:5;5266:16;5255:27;;5202:86;;;:::o;5294:118::-;5365:22;5381:5;5365:22;:::i;:::-;5358:5;5355:33;5345:61;;5402:1;5399;5392:12;5345:61;5294:118;:::o;5418:135::-;5462:5;5500:6;5487:20;5478:29;;5516:31;5541:5;5516:31;:::i;:::-;5418:135;;;;:::o;5559:1053::-;5661:6;5669;5677;5685;5693;5701;5750:3;5738:9;5729:7;5725:23;5721:33;5718:120;;;5757:79;;:::i;:::-;5718:120;5877:1;5902:53;5947:7;5938:6;5927:9;5923:22;5902:53;:::i;:::-;5892:63;;5848:117;6004:2;6030:53;6075:7;6066:6;6055:9;6051:22;6030:53;:::i;:::-;6020:63;;5975:118;6132:2;6158:53;6203:7;6194:6;6183:9;6179:22;6158:53;:::i;:::-;6148:63;;6103:118;6260:2;6286:51;6329:7;6320:6;6309:9;6305:22;6286:51;:::i;:::-;6276:61;;6231:116;6386:3;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6357:119;6515:3;6542:53;6587:7;6578:6;6567:9;6563:22;6542:53;:::i;:::-;6532:63;;6486:119;5559:1053;;;;;;;;:::o;6618:117::-;6727:1;6724;6717:12;6741:117;6850:1;6847;6840:12;6864:102;6905:6;6956:2;6952:7;6947:2;6940:5;6936:14;6932:28;6922:38;;6864:102;;;:::o;6972:180::-;7020:77;7017:1;7010:88;7117:4;7114:1;7107:15;7141:4;7138:1;7131:15;7158:281;7241:27;7263:4;7241:27;:::i;:::-;7233:6;7229:40;7371:6;7359:10;7356:22;7335:18;7323:10;7320:34;7317:62;7314:88;;;7382:18;;:::i;:::-;7314:88;7422:10;7418:2;7411:22;7201:238;7158:281;;:::o;7445:129::-;7479:6;7506:20;;:::i;:::-;7496:30;;7535:33;7563:4;7555:6;7535:33;:::i;:::-;7445:129;;;:::o;7580:307::-;7641:4;7731:18;7723:6;7720:30;7717:56;;;7753:18;;:::i;:::-;7717:56;7791:29;7813:6;7791:29;:::i;:::-;7783:37;;7875:4;7869;7865:15;7857:23;;7580:307;;;:::o;7893:148::-;7991:6;7986:3;7981;7968:30;8032:1;8023:6;8018:3;8014:16;8007:27;7893:148;;;:::o;8047:423::-;8124:5;8149:65;8165:48;8206:6;8165:48;:::i;:::-;8149:65;:::i;:::-;8140:74;;8237:6;8230:5;8223:21;8275:4;8268:5;8264:16;8313:3;8304:6;8299:3;8295:16;8292:25;8289:112;;;8320:79;;:::i;:::-;8289:112;8410:54;8457:6;8452:3;8447;8410:54;:::i;:::-;8130:340;8047:423;;;;;:::o;8489:338::-;8544:5;8593:3;8586:4;8578:6;8574:17;8570:27;8560:122;;8601:79;;:::i;:::-;8560:122;8718:6;8705:20;8743:78;8817:3;8809:6;8802:4;8794:6;8790:17;8743:78;:::i;:::-;8734:87;;8550:277;8489:338;;;;:::o;8833:652::-;8910:6;8918;8967:2;8955:9;8946:7;8942:23;8938:32;8935:119;;;8973:79;;:::i;:::-;8935:119;9093:1;9118:53;9163:7;9154:6;9143:9;9139:22;9118:53;:::i;:::-;9108:63;;9064:117;9248:2;9237:9;9233:18;9220:32;9279:18;9271:6;9268:30;9265:117;;;9301:79;;:::i;:::-;9265:117;9406:62;9460:7;9451:6;9440:9;9436:22;9406:62;:::i;:::-;9396:72;;9191:287;8833:652;;;;;:::o;9491:117::-;9600:1;9597;9590:12;9614:117;9723:1;9720;9713:12;9754:568;9827:8;9837:6;9887:3;9880:4;9872:6;9868:17;9864:27;9854:122;;9895:79;;:::i;:::-;9854:122;10008:6;9995:20;9985:30;;10038:18;10030:6;10027:30;10024:117;;;10060:79;;:::i;:::-;10024:117;10174:4;10166:6;10162:17;10150:29;;10228:3;10220:4;10212:6;10208:17;10198:8;10194:32;10191:41;10188:128;;;10235:79;;:::i;:::-;10188:128;9754:568;;;;;:::o;10328:559::-;10414:6;10422;10471:2;10459:9;10450:7;10446:23;10442:32;10439:119;;;10477:79;;:::i;:::-;10439:119;10625:1;10614:9;10610:17;10597:31;10655:18;10647:6;10644:30;10641:117;;;10677:79;;:::i;:::-;10641:117;10790:80;10862:7;10853:6;10842:9;10838:22;10790:80;:::i;:::-;10772:98;;;;10568:312;10328:559;;;;;:::o;10893:911::-;10988:6;10996;11004;11012;11020;11069:3;11057:9;11048:7;11044:23;11040:33;11037:120;;;11076:79;;:::i;:::-;11037:120;11196:1;11221:53;11266:7;11257:6;11246:9;11242:22;11221:53;:::i;:::-;11211:63;;11167:117;11323:2;11349:53;11394:7;11385:6;11374:9;11370:22;11349:53;:::i;:::-;11339:63;;11294:118;11451:2;11477:53;11522:7;11513:6;11502:9;11498:22;11477:53;:::i;:::-;11467:63;;11422:118;11579:2;11605:53;11650:7;11641:6;11630:9;11626:22;11605:53;:::i;:::-;11595:63;;11550:118;11707:3;11734:53;11779:7;11770:6;11759:9;11755:22;11734:53;:::i;:::-;11724:63;;11678:119;10893:911;;;;;;;;:::o;11810:111::-;11862:7;11891:24;11909:5;11891:24;:::i;:::-;11880:35;;11810:111;;;:::o;11927:152::-;12015:39;12048:5;12015:39;:::i;:::-;12008:5;12005:50;11995:78;;12069:1;12066;12059:12;11995:78;11927:152;:::o;12085:169::-;12146:5;12184:6;12171:20;12162:29;;12200:48;12242:5;12200:48;:::i;:::-;12085:169;;;;:::o;12260:120::-;12321:7;12350:24;12368:5;12350:24;:::i;:::-;12339:35;;12260:120;;;:::o;12386:170::-;12483:48;12525:5;12483:48;:::i;:::-;12476:5;12473:59;12463:87;;12546:1;12543;12536:12;12463:87;12386:170;:::o;12562:187::-;12632:5;12670:6;12657:20;12648:29;;12686:57;12737:5;12686:57;:::i;:::-;12562:187;;;;:::o;12755:101::-;12791:7;12831:18;12824:5;12820:30;12809:41;;12755:101;;;:::o;12862:120::-;12934:23;12951:5;12934:23;:::i;:::-;12927:5;12924:34;12914:62;;12972:1;12969;12962:12;12914:62;12862:120;:::o;12988:137::-;13033:5;13071:6;13058:20;13049:29;;13087:32;13113:5;13087:32;:::i;:::-;12988:137;;;;:::o;13131:987::-;13264:6;13272;13280;13288;13296;13345:3;13333:9;13324:7;13320:23;13316:33;13313:120;;;13352:79;;:::i;:::-;13313:120;13472:1;13497:68;13557:7;13548:6;13537:9;13533:22;13497:68;:::i;:::-;13487:78;;13443:132;13614:2;13640:77;13709:7;13700:6;13689:9;13685:22;13640:77;:::i;:::-;13630:87;;13585:142;13766:2;13792:52;13836:7;13827:6;13816:9;13812:22;13792:52;:::i;:::-;13782:62;;13737:117;13893:2;13919:53;13964:7;13955:6;13944:9;13940:22;13919:53;:::i;:::-;13909:63;;13864:118;14021:3;14048:53;14093:7;14084:6;14073:9;14069:22;14048:53;:::i;:::-;14038:63;;13992:119;13131:987;;;;;;;;:::o;14124:115::-;14209:23;14226:5;14209:23;:::i;:::-;14204:3;14197:36;14124:115;;:::o;14245:218::-;14336:4;14374:2;14363:9;14359:18;14351:26;;14387:69;14453:1;14442:9;14438:17;14429:6;14387:69;:::i;:::-;14245:218;;;;:::o;14469:141::-;14534:9;14567:37;14598:5;14567:37;:::i;:::-;14554:50;;14469:141;;;:::o;14616:161::-;14718:52;14764:5;14718:52;:::i;:::-;14713:3;14706:65;14616:161;;:::o;14783:252::-;14891:4;14929:2;14918:9;14914:18;14906:26;;14942:86;15025:1;15014:9;15010:17;15001:6;14942:86;:::i;:::-;14783:252;;;;:::o;15041:169::-;15125:11;15159:6;15154:3;15147:19;15199:4;15194:3;15190:14;15175:29;;15041:169;;;;:::o;15216:234::-;15356:34;15352:1;15344:6;15340:14;15333:58;15425:17;15420:2;15412:6;15408:15;15401:42;15216:234;:::o;15456:366::-;15598:3;15619:67;15683:2;15678:3;15619:67;:::i;:::-;15612:74;;15695:93;15784:3;15695:93;:::i;:::-;15813:2;15808:3;15804:12;15797:19;;15456:366;;;:::o;15828:419::-;15994:4;16032:2;16021:9;16017:18;16009:26;;16081:9;16075:4;16071:20;16067:1;16056:9;16052:17;16045:47;16109:131;16235:4;16109:131;:::i;:::-;16101:139;;15828:419;;;:::o;16253:231::-;16393:34;16389:1;16381:6;16377:14;16370:58;16462:14;16457:2;16449:6;16445:15;16438:39;16253:231;:::o;16490:366::-;16632:3;16653:67;16717:2;16712:3;16653:67;:::i;:::-;16646:74;;16729:93;16818:3;16729:93;:::i;:::-;16847:2;16842:3;16838:12;16831:19;;16490:366;;;:::o;16862:419::-;17028:4;17066:2;17055:9;17051:18;17043:26;;17115:9;17109:4;17105:20;17101:1;17090:9;17086:17;17079:47;17143:131;17269:4;17143:131;:::i;:::-;17135:139;;16862:419;;;:::o;17287:231::-;17427:34;17423:1;17415:6;17411:14;17404:58;17496:14;17491:2;17483:6;17479:15;17472:39;17287:231;:::o;17524:366::-;17666:3;17687:67;17751:2;17746:3;17687:67;:::i;:::-;17680:74;;17763:93;17852:3;17763:93;:::i;:::-;17881:2;17876:3;17872:12;17865:19;;17524:366;;;:::o;17896:419::-;18062:4;18100:2;18089:9;18085:18;18077:26;;18149:9;18143:4;18139:20;18135:1;18124:9;18120:17;18113:47;18177:131;18303:4;18177:131;:::i;:::-;18169:139;;17896:419;;;:::o;18321:118::-;18408:24;18426:5;18408:24;:::i;:::-;18403:3;18396:37;18321:118;;:::o;18445:::-;18532:24;18550:5;18532:24;:::i;:::-;18527:3;18520:37;18445:118;;:::o;18569:112::-;18652:22;18668:5;18652:22;:::i;:::-;18647:3;18640:35;18569:112;;:::o;18687:878::-;18944:4;18982:3;18971:9;18967:19;18959:27;;18996:71;19064:1;19053:9;19049:17;19040:6;18996:71;:::i;:::-;19077:72;19145:2;19134:9;19130:18;19121:6;19077:72;:::i;:::-;19159;19227:2;19216:9;19212:18;19203:6;19159:72;:::i;:::-;19241;19309:2;19298:9;19294:18;19285:6;19241:72;:::i;:::-;19323:69;19387:3;19376:9;19372:19;19363:6;19323:69;:::i;:::-;19402:73;19470:3;19459:9;19455:19;19446:6;19402:73;:::i;:::-;19485;19553:3;19542:9;19538:19;19529:6;19485:73;:::i;:::-;18687:878;;;;;;;;;;:::o;19571:442::-;19720:4;19758:2;19747:9;19743:18;19735:26;;19771:71;19839:1;19828:9;19824:17;19815:6;19771:71;:::i;:::-;19852:72;19920:2;19909:9;19905:18;19896:6;19852:72;:::i;:::-;19934;20002:2;19991:9;19987:18;19978:6;19934:72;:::i;:::-;19571:442;;;;;;:::o;20019:116::-;20089:21;20104:5;20089:21;:::i;:::-;20082:5;20079:32;20069:60;;20125:1;20122;20115:12;20069:60;20019:116;:::o;20141:137::-;20195:5;20226:6;20220:13;20211:22;;20242:30;20266:5;20242:30;:::i;:::-;20141:137;;;;:::o;20284:345::-;20351:6;20400:2;20388:9;20379:7;20375:23;20371:32;20368:119;;;20406:79;;:::i;:::-;20368:119;20526:1;20551:61;20604:7;20595:6;20584:9;20580:22;20551:61;:::i;:::-;20541:71;;20497:125;20284:345;;;;:::o;20635:222::-;20728:4;20766:2;20755:9;20751:18;20743:26;;20779:71;20847:1;20836:9;20832:17;20823:6;20779:71;:::i;:::-;20635:222;;;;:::o;20863:243::-;21003:34;20999:1;20991:6;20987:14;20980:58;21072:26;21067:2;21059:6;21055:15;21048:51;20863:243;:::o;21112:366::-;21254:3;21275:67;21339:2;21334:3;21275:67;:::i;:::-;21268:74;;21351:93;21440:3;21351:93;:::i;:::-;21469:2;21464:3;21460:12;21453:19;;21112:366;;;:::o;21484:419::-;21650:4;21688:2;21677:9;21673:18;21665:26;;21737:9;21731:4;21727:20;21723:1;21712:9;21708:17;21701:47;21765:131;21891:4;21765:131;:::i;:::-;21757:139;;21484:419;;;:::o;21909:180::-;21957:77;21954:1;21947:88;22054:4;22051:1;22044:15;22078:4;22075:1;22068:15;22095:332;22216:4;22254:2;22243:9;22239:18;22231:26;;22267:71;22335:1;22324:9;22320:17;22311:6;22267:71;:::i;:::-;22348:72;22416:2;22405:9;22401:18;22392:6;22348:72;:::i;:::-;22095:332;;;;;:::o;22433:442::-;22582:4;22620:2;22609:9;22605:18;22597:26;;22633:71;22701:1;22690:9;22686:17;22677:6;22633:71;:::i;:::-;22714:72;22782:2;22771:9;22767:18;22758:6;22714:72;:::i;:::-;22796;22864:2;22853:9;22849:18;22840:6;22796:72;:::i;:::-;22433:442;;;;;;:::o;22881:332::-;23002:4;23040:2;23029:9;23025:18;23017:26;;23053:71;23121:1;23110:9;23106:17;23097:6;23053:71;:::i;:::-;23134:72;23202:2;23191:9;23187:18;23178:6;23134:72;:::i;:::-;22881:332;;;;;:::o;23219:233::-;23359:34;23355:1;23347:6;23343:14;23336:58;23428:16;23423:2;23415:6;23411:15;23404:41;23219:233;:::o;23458:366::-;23600:3;23621:67;23685:2;23680:3;23621:67;:::i;:::-;23614:74;;23697:93;23786:3;23697:93;:::i;:::-;23815:2;23810:3;23806:12;23799:19;;23458:366;;;:::o;23830:419::-;23996:4;24034:2;24023:9;24019:18;24011:26;;24083:9;24077:4;24073:20;24069:1;24058:9;24054:17;24047:47;24111:131;24237:4;24111:131;:::i;:::-;24103:139;;23830:419;;;:::o;24255:85::-;24300:7;24329:5;24318:16;;24255:85;;;:::o;24346:154::-;24402:9;24435:59;24451:42;24460:32;24486:5;24460:32;:::i;:::-;24451:42;:::i;:::-;24435:59;:::i;:::-;24422:72;;24346:154;;;:::o;24506:143::-;24599:43;24636:5;24599:43;:::i;:::-;24594:3;24587:56;24506:143;;:::o;24655:234::-;24754:4;24792:2;24781:9;24777:18;24769:26;;24805:77;24879:1;24868:9;24864:17;24855:6;24805:77;:::i;:::-;24655:234;;;;:::o;24895:328::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25065:69;25131:1;25120:9;25116:17;25107:6;25065:69;:::i;:::-;25144:72;25212:2;25201:9;25197:18;25188:6;25144:72;:::i;:::-;24895:328;;;;;:::o;25229:143::-;25286:5;25317:6;25311:13;25302:22;;25333:33;25360:5;25333:33;:::i;:::-;25229:143;;;;:::o;25378:351::-;25448:6;25497:2;25485:9;25476:7;25472:23;25468:32;25465:119;;;25503:79;;:::i;:::-;25465:119;25623:1;25648:64;25704:7;25695:6;25684:9;25680:22;25648:64;:::i;:::-;25638:74;;25594:128;25378:351;;;;:::o;25735:233::-;25875:34;25871:1;25863:6;25859:14;25852:58;25944:16;25939:2;25931:6;25927:15;25920:41;25735:233;:::o;25974:366::-;26116:3;26137:67;26201:2;26196:3;26137:67;:::i;:::-;26130:74;;26213:93;26302:3;26213:93;:::i;:::-;26331:2;26326:3;26322:12;26315:19;;25974:366;;;:::o;26346:419::-;26512:4;26550:2;26539:9;26535:18;26527:26;;26599:9;26593:4;26589:20;26585:1;26574:9;26570:17;26563:47;26627:131;26753:4;26627:131;:::i;:::-;26619:139;;26346:419;;;:::o;26771:228::-;26911:34;26907:1;26899:6;26895:14;26888:58;26980:11;26975:2;26967:6;26963:15;26956:36;26771:228;:::o;27005:366::-;27147:3;27168:67;27232:2;27227:3;27168:67;:::i;:::-;27161:74;;27244:93;27333:3;27244:93;:::i;:::-;27362:2;27357:3;27353:12;27346:19;;27005:366;;;:::o;27377:419::-;27543:4;27581:2;27570:9;27566:18;27558:26;;27630:9;27624:4;27620:20;27616:1;27605:9;27601:17;27594:47;27658:131;27784:4;27658:131;:::i;:::-;27650:139;;27377:419;;;:::o;27802:222::-;27895:4;27933:2;27922:9;27918:18;27910:26;;27946:71;28014:1;28003:9;27999:17;27990:6;27946:71;:::i;:::-;27802:222;;;;:::o;28030:426::-;28171:4;28209:2;28198:9;28194:18;28186:26;;28222:69;28288:1;28277:9;28273:17;28264:6;28222:69;:::i;:::-;28301:72;28369:2;28358:9;28354:18;28345:6;28301:72;:::i;:::-;28383:66;28445:2;28434:9;28430:18;28421:6;28383:66;:::i;:::-;28030:426;;;;;;:::o;28462:230::-;28602:34;28598:1;28590:6;28586:14;28579:58;28671:13;28666:2;28658:6;28654:15;28647:38;28462:230;:::o;28698:366::-;28840:3;28861:67;28925:2;28920:3;28861:67;:::i;:::-;28854:74;;28937:93;29026:3;28937:93;:::i;:::-;29055:2;29050:3;29046:12;29039:19;;28698:366;;;:::o;29070:419::-;29236:4;29274:2;29263:9;29259:18;29251:26;;29323:9;29317:4;29313:20;29309:1;29298:9;29294:17;29287:47;29351:131;29477:4;29351:131;:::i;:::-;29343:139;;29070:419;;;:::o;29495:148::-;29597:11;29634:3;29619:18;;29495:148;;;;:::o;29649:173::-;29789:25;29785:1;29777:6;29773:14;29766:49;29649:173;:::o;29828:402::-;29988:3;30009:85;30091:2;30086:3;30009:85;:::i;:::-;30002:92;;30103:93;30192:3;30103:93;:::i;:::-;30221:2;30216:3;30212:12;30205:19;;29828:402;;;:::o;30236:99::-;30288:6;30322:5;30316:12;30306:22;;30236:99;;;:::o;30341:139::-;30430:6;30425:3;30420;30414:23;30471:1;30462:6;30457:3;30453:16;30446:27;30341:139;;;:::o;30486:390::-;30592:3;30620:39;30653:5;30620:39;:::i;:::-;30675:89;30757:6;30752:3;30675:89;:::i;:::-;30668:96;;30773:65;30831:6;30826:3;30819:4;30812:5;30808:16;30773:65;:::i;:::-;30863:6;30858:3;30854:16;30847:23;;30596:280;30486:390;;;;:::o;30882:167::-;31022:19;31018:1;31010:6;31006:14;30999:43;30882:167;:::o;31055:402::-;31215:3;31236:85;31318:2;31313:3;31236:85;:::i;:::-;31229:92;;31330:93;31419:3;31330:93;:::i;:::-;31448:2;31443:3;31439:12;31432:19;;31055:402;;;:::o;31463:967::-;31845:3;31867:148;32011:3;31867:148;:::i;:::-;31860:155;;32032:95;32123:3;32114:6;32032:95;:::i;:::-;32025:102;;32144:148;32288:3;32144:148;:::i;:::-;32137:155;;32309:95;32400:3;32391:6;32309:95;:::i;:::-;32302:102;;32421:3;32414:10;;31463:967;;;;;:::o;32436:377::-;32524:3;32552:39;32585:5;32552:39;:::i;:::-;32607:71;32671:6;32666:3;32607:71;:::i;:::-;32600:78;;32687:65;32745:6;32740:3;32733:4;32726:5;32722:16;32687:65;:::i;:::-;32777:29;32799:6;32777:29;:::i;:::-;32772:3;32768:39;32761:46;;32528:285;32436:377;;;;:::o;32819:313::-;32932:4;32970:2;32959:9;32955:18;32947:26;;33019:9;33013:4;33009:20;33005:1;32994:9;32990:17;32983:47;33047:78;33120:4;33111:6;33047:78;:::i;:::-;33039:86;;32819:313;;;;:::o;33138:232::-;33278:34;33274:1;33266:6;33262:14;33255:58;33347:15;33342:2;33334:6;33330:15;33323:40;33138:232;:::o;33376:366::-;33518:3;33539:67;33603:2;33598:3;33539:67;:::i;:::-;33532:74;;33615:93;33704:3;33615:93;:::i;:::-;33733:2;33728:3;33724:12;33717:19;;33376:366;;;:::o;33748:419::-;33914:4;33952:2;33941:9;33937:18;33929:26;;34001:9;33995:4;33991:20;33987:1;33976:9;33972:17;33965:47;34029:131;34155:4;34029:131;:::i;:::-;34021:139;;33748:419;;;:::o;34173:180::-;34221:77;34218:1;34211:88;34318:4;34315:1;34308:15;34342:4;34339:1;34332:15;34359:410;34399:7;34422:20;34440:1;34422:20;:::i;:::-;34417:25;;34456:20;34474:1;34456:20;:::i;:::-;34451:25;;34511:1;34508;34504:9;34533:30;34551:11;34533:30;:::i;:::-;34522:41;;34712:1;34703:7;34699:15;34696:1;34693:22;34673:1;34666:9;34646:83;34623:139;;34742:18;;:::i;:::-;34623:139;34407:362;34359:410;;;;:::o;34775:191::-;34815:3;34834:20;34852:1;34834:20;:::i;:::-;34829:25;;34868:20;34886:1;34868:20;:::i;:::-;34863:25;;34911:1;34908;34904:9;34897:16;;34932:3;34929:1;34926:10;34923:36;;;34939:18;;:::i;:::-;34923:36;34775:191;;;;:::o;34972:171::-;35011:3;35034:24;35052:5;35034:24;:::i;:::-;35025:33;;35080:4;35073:5;35070:15;35067:41;;35088:18;;:::i;:::-;35067:41;35135:1;35128:5;35124:13;35117:20;;34972:171;;;:::o;35149:182::-;35289:34;35285:1;35277:6;35273:14;35266:58;35149:182;:::o;35337:366::-;35479:3;35500:67;35564:2;35559:3;35500:67;:::i;:::-;35493:74;;35576:93;35665:3;35576:93;:::i;:::-;35694:2;35689:3;35685:12;35678:19;;35337:366;;;:::o;35709:419::-;35875:4;35913:2;35902:9;35898:18;35890:26;;35962:9;35956:4;35952:20;35948:1;35937:9;35933:17;35926:47;35990:131;36116:4;35990:131;:::i;:::-;35982:139;;35709:419;;;:::o;36134:98::-;36185:6;36219:5;36213:12;36203:22;;36134:98;;;:::o;36238:147::-;36339:11;36376:3;36361:18;;36238:147;;;;:::o;36391:386::-;36495:3;36523:38;36555:5;36523:38;:::i;:::-;36577:88;36658:6;36653:3;36577:88;:::i;:::-;36570:95;;36674:65;36732:6;36727:3;36720:4;36713:5;36709:16;36674:65;:::i;:::-;36764:6;36759:3;36755:16;36748:23;;36499:278;36391:386;;;;:::o;36783:271::-;36913:3;36935:93;37024:3;37015:6;36935:93;:::i;:::-;36928:100;;37045:3;37038:10;;36783:271;;;;:::o;37060:179::-;37200:31;37196:1;37188:6;37184:14;37177:55;37060:179;:::o;37245:366::-;37387:3;37408:67;37472:2;37467:3;37408:67;:::i;:::-;37401:74;;37484:93;37573:3;37484:93;:::i;:::-;37602:2;37597:3;37593:12;37586:19;;37245:366;;;:::o;37617:419::-;37783:4;37821:2;37810:9;37806:18;37798:26;;37870:9;37864:4;37860:20;37856:1;37845:9;37841:17;37834:47;37898:131;38024:4;37898:131;:::i;:::-;37890:139;;37617:419;;;:::o","linkReferences":{},"immutableReferences":{"964":[{"length":32,"start":2116},{"length":32,"start":2258},{"length":32,"start":3439},{"length":32,"start":3581},{"length":32,"start":3756}]}}}}}}},"proxyResolution":null}