Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save straightupjac/69bce152535225a9e6a88b0da85e7d36 to your computer and use it in GitHub Desktop.
Save straightupjac/69bce152535225a9e6a88b0da85e7d36 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.5.7+commit.6da8b019.js&optimize=false&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/EnumerableSet.sol";
import "../utils/Address.sol";
import "../GSN/Context.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context {
using EnumerableSet for EnumerableSet.AddressSet;
using Address for address;
struct RoleData {
EnumerableSet.AddressSet members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev 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._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev 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`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role].members.contains(account);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
return _roles[role].members.length();
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
return _roles[role].members.at(index);
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev 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.
*/
function grantRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev 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 granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (_roles[role].members.add(account)) {
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (_roles[role].members.remove(account)) {
emit RoleRevoked(role, account, _msgSender());
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../access/AccessControl.sol";
import "../GSN/Context.sol";
import "../token/ERC20/ERC20.sol";
import "../token/ERC20/ERC20Burnable.sol";
import "../token/ERC20/ERC20Pausable.sol";
/**
* @dev {ERC20} token, including:
*
* - ability for holders to burn (destroy) their tokens
* - a minter role that allows for token minting (creation)
* - a pauser role that allows to stop all token transfers
*
* This contract uses {AccessControl} to lock permissioned functions using the
* different roles - head to its documentation for details.
*
* The account that deploys the contract will be granted the minter and pauser
* roles, as well as the default admin role, which will let it grant both minter
* and pauser roles to other accounts.
*/
contract ERC20PresetMinterPauser is Context, AccessControl, ERC20Burnable, ERC20Pausable {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
/**
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
* account that deploys the contract.
*
* See {ERC20-constructor}.
*/
constructor(string memory name, string memory symbol) public ERC20(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
/**
* @dev Creates `amount` new tokens for `to`.
*
* See {ERC20-_mint}.
*
* Requirements:
*
* - the caller must have the `MINTER_ROLE`.
*/
function mint(address to, uint256 amount) public virtual {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
_mint(to, amount);
}
/**
* @dev Pauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20, ERC20Pausable) {
super._beforeTokenTransfer(from, to, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../GSN/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../GSN/Context.sol";
import "./ERC20.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
using SafeMath for uint256;
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), decreasedAllowance);
_burn(account, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./ERC20.sol";
import "../../utils/Pausable.sol";
/**
* @dev ERC20 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*/
abstract contract ERC20Pausable is ERC20, Pausable {
/**
* @dev See {ERC20-_beforeTokenTransfer}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
require(!paused(), "ERC20Pausable: token transfer while paused");
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), currentAllowance - amount);
_burn(account, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../extensions/ERC20Burnable.sol";
import "../extensions/ERC20Pausable.sol";
import "../../../access/AccessControlEnumerable.sol";
import "../../../utils/Context.sol";
/**
* @dev {ERC20} token, including:
*
* - ability for holders to burn (destroy) their tokens
* - a minter role that allows for token minting (creation)
* - a pauser role that allows to stop all token transfers
*
* This contract uses {AccessControl} to lock permissioned functions using the
* different roles - head to its documentation for details.
*
* The account that deploys the contract will be granted the minter and pauser
* roles, as well as the default admin role, which will let it grant both minter
* and pauser roles to other accounts.
*/
contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
/**
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
* account that deploys the contract.
*
* See {ERC20-constructor}.
*/
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
/**
* @dev Creates `amount` new tokens for `to`.
*
* See {ERC20-_mint}.
*
* Requirements:
*
* - the caller must have the `MINTER_ROLE`.
*/
function mint(address to, uint256 amount) public virtual {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
_mint(to, amount);
}
/**
* @dev Pauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20, ERC20Pausable) {
super._beforeTokenTransfer(from, to, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(value)));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint256(_at(set._inner, index)));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../GSN/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!_paused, "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(_paused, "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping (address => bool) members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev 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._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev 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`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev 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.
*/
function grantRole(bytes32 role, address account) public virtual override {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev 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 granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The defaut value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), currentAllowance - amount);
_burn(account, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../extensions/ERC20Burnable.sol";
import "../extensions/ERC20Pausable.sol";
import "../../../access/AccessControlEnumerable.sol";
import "../../../utils/Context.sol";
/**
* @dev {ERC20} token, including:
*
* - ability for holders to burn (destroy) their tokens
* - a minter role that allows for token minting (creation)
* - a pauser role that allows to stop all token transfers
*
* This contract uses {AccessControl} to lock permissioned functions using the
* different roles - head to its documentation for details.
*
* The account that deploys the contract will be granted the minter and pauser
* roles, as well as the default admin role, which will let it grant both minter
* and pauser roles to other accounts.
*/
contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
/**
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
* account that deploys the contract.
*
* See {ERC20-constructor}.
*/
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
/**
* @dev Creates `amount` new tokens for `to`.
*
* See {ERC20-_mint}.
*
* Requirements:
*
* - the caller must have the `MINTER_ROLE`.
*/
function mint(address to, uint256 amount) public virtual {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
_mint(to, amount);
}
/**
* @dev Pauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20, ERC20Pausable) {
super._beforeTokenTransfer(from, to, amount);
}
}
REMIX EXAMPLE PROJECT
Remix example project is present when Remix loads very first time or there are no files existing in the File Explorer.
It contains 3 directories:
1. 'contracts': Holds three contracts with different complexity level, denoted with number prefix in file name.
2. 'scripts': Holds two scripts to deploy a contract. It is explained below.
3. 'tests': Contains one test file for 'Ballot' contract with unit tests in Solidity.
SCRIPTS
The 'scripts' folder contains example async/await scripts for deploying the 'Storage' contract.
For the deployment of any other contract, 'contractName' and 'constructorArgs' should be updated (along with other code if required).
Scripts have full access to the web3.js and ethers.js libraries.
To run a script, right click on file name in the file explorer and click 'Run'. Remember, Solidity file must already be compiled.
Output from script will appear in remix terminal.
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "60806040523480156200001157600080fd5b5060405162004dce38038062004dce833981810160405281019062000037919062000501565b60008060006101000a81548160ff02191690831515021790555084600260006101000a81548160ff021916908360ff160217905550826003819055508160068190555080600781905550620000966000801b336200013460201b60201c565b620000c0604051620000a89062000646565b60405180910390206000801b6200014a60201b60201c565b60005b8451811015620001285762000108604051620000df9062000646565b6040518091039020868381518110620000f457fe5b6020026020010151620001ae60201b60201c565b6004600081548092919060010191905055508080600101915050620000c3565b5050505050506200078b565b6200014682826200023d60201b60201c565b5050565b806001600084815260200190815260200160002060020154837fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a48060016000848152602001908152602001600020600201819055505050565b620001e56001600084815260200190815260200160002060020154620001d9620002e160201b60201c565b620002e960201b60201c565b62000227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021e906200065d565b60405180910390fd5b6200023982826200023d60201b60201c565b5050565b6200026c81600160008581526020019081526020016000206000016200032260201b6200285b1790919060201c565b15620002dd5762000282620002e160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b60006200031a82600160008681526020019081526020016000206000016200035a60201b620027601790919060201c565b905092915050565b600062000352836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200039260201b60201c565b905092915050565b60006200038a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200040c60201b60201c565b905092915050565b6000620003a683836200040c60201b60201c565b6200040157826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000406565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b60008151905062000440816200073d565b92915050565b600082601f8301126200045857600080fd5b81516200046f6200046982620006ad565b6200067f565b915081818352602084019350602081019050838560208402820111156200049557600080fd5b60005b83811015620004c95781620004ae88826200042f565b84526020840193506020830192505060018101905062000498565b5050505092915050565b600081519050620004e48162000757565b92915050565b600081519050620004fb8162000771565b92915050565b600080600080600060a086880312156200051a57600080fd5b60006200052a88828901620004ea565b955050602086015167ffffffffffffffff8111156200054857600080fd5b620005568882890162000446565b94505060406200056988828901620004d3565b93505060606200057c88828901620004d3565b92505060806200058f88828901620004d3565b9150509295509295909350565b6000620005ab602f83620006d6565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b600062000613600c83620006e7565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b6000620006538262000604565b9150819050919050565b6000602082019050818103600083015262000678816200059c565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620006a357600080fd5b8060405250919050565b600067ffffffffffffffff821115620006c557600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b600081905092915050565b6000620006ff8262000706565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6200074881620006f2565b81146200075457600080fd5b50565b620007628162000726565b81146200076e57600080fd5b50565b6200077c8162000730565b81146200078857600080fd5b50565b614633806200079b6000396000f3fe6080604052600436106102305760003560e01c806384db809f1161012e578063beab7131116100ab578063cdb0f73a1161006f578063cdb0f73a14610877578063d547741f146108a0578063d7a9cd79146108c9578063e8437ee7146108f4578063ffaac0eb1461091d57610230565b8063beab713114610790578063c5b37c22146107bb578063c5ec8970146107e6578063ca15c87314610811578063cb10f2151461084e57610230565b8063926d7d7f116100f2578063926d7d7f146106a95780639d5773e0146106d45780639d82dd63146106ff578063a217fddf14610728578063a9cf69fa1461075357610230565b806384db809f146105a05780638c0c2631146105dd5780639010d07c1461060657806391c404ac1461064357806391d148541461066c57610230565b80634b0b919d116101bc5780635e1fab0f116101805780635e1fab0f146104cf578063780cf004146104f85780637febe63f14610521578063802aabe81461055e57806380ae1c281461058957610230565b80634b0b919d146103c15780634e056005146103fe5780635059871914610427578063541d5548146104675780635c975abb146104a457610230565b80632f2ff15d116102035780632f2ff15d146102e057806336568abe146103095780633ee7094a146103325780634454b20d1461036f5780634603ae381461039857610230565b806305e2ca171461023557806317f03ce5146102515780631ff013f11461027a578063248a9ca3146102a3575b600080fd5b61024f600480360381019061024a9190613229565b610934565b005b34801561025d57600080fd5b5061027860048036038101906102739190613295565b610b91565b005b34801561028657600080fd5b506102a1600480360381019061029c91906132e4565b610d3e565b005b3480156102af57600080fd5b506102ca60048036038101906102c5919061306f565b6114bf565b6040516102d79190613df0565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613098565b6114df565b005b34801561031557600080fd5b50610330600480360381019061032b9190613098565b611553565b005b34801561033e57600080fd5b5061035960048036038101906103549190613139565b6115d6565b6040516103669190613f75565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613347565b611693565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190612ffa565b6119d4565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613200565b611a7a565b6040516103f591906142d6565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613110565b611aa1565b005b34801561043357600080fd5b5061044e60048036038101906104499190613175565b611ae0565b60405161045e9493929190613ea2565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190612e43565b611b2a565b60405161049b9190613dd5565b60405180910390f35b3480156104b057600080fd5b506104b9611b50565b6040516104c69190613dd5565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190612e43565b611b66565b005b34801561050457600080fd5b5061051f600480360381019061051a9190612ed1565b611b8b565b005b34801561052d57600080fd5b50610548600480360381019061054391906131b1565b611c0e565b6040516105559190613dd5565b60405180910390f35b34801561056a57600080fd5b50610573611c4a565b60405161058091906142bb565b60405180910390f35b34801561059557600080fd5b5061059e611c50565b005b3480156105ac57600080fd5b506105c760048036038101906105c2919061306f565b611c62565b6040516105d49190613d68565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190612e95565b611c95565b005b34801561061257600080fd5b5061062d600480360381019061062891906130d4565b611d12565b60405161063a9190613d68565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613110565b611d44565b005b34801561067857600080fd5b50610693600480360381019061068e9190613098565b611d9b565b6040516106a09190613dd5565b60405180910390f35b3480156106b557600080fd5b506106be611dcd565b6040516106cb9190613df0565b60405180910390f35b3480156106e057600080fd5b506106e9611de4565b6040516106f691906142bb565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190612e43565b611dea565b005b34801561073457600080fd5b5061073d611ec4565b60405161074a9190613df0565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613295565b611ecb565b6040516107879190614299565b60405180910390f35b34801561079c57600080fd5b506107a56120ac565b6040516107b291906142f1565b60405180910390f35b3480156107c757600080fd5b506107d06120bf565b6040516107dd91906142bb565b60405180910390f35b3480156107f257600080fd5b506107fb6120c5565b60405161080891906142bb565b60405180910390f35b34801561081d57600080fd5b506108386004803603810190610833919061306f565b6120cb565b60405161084591906142bb565b60405180910390f35b34801561085a57600080fd5b5061087560048036038101906108709190612f34565b6120f2565b005b34801561088357600080fd5b5061089e60048036038101906108999190612e43565b6121c4565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613098565b61229e565b005b3480156108d557600080fd5b506108de612312565b6040516108eb91906142bb565b60405180910390f35b34801561090057600080fd5b5061091b60048036038101906109169190612f83565b612318565b005b34801561092957600080fd5b506109326123f0565b005b61093c612402565b6006543414610980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610977906140b9565b60405180910390fd5b60006009600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90614119565b60405180910390fd5b6000600860008760ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508383600a60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008960ff1660ff1681526020019081526020016000209190610ad1929190612b04565b5060008290508073ffffffffffffffffffffffffffffffffffffffff166338995da9878985338a8a6040518763ffffffff1660e01b8152600401610b1a96959493929190613f19565b600060405180830381600087803b158015610b3457600080fd5b505af1158015610b48573d6000803e3d6000fd5b505050508167ffffffffffffffff16868860ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a450505050505050565b610b99612453565b60008360ff1660088467ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600480811115610c0657fe5b8160040160009054906101000a900460ff166004811115610c2357fe5b1415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906140f9565b60405180910390fd5b600754610c754383600501546124c5565b11610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90614159565b60405180910390fd5b60048160040160006101000a81548160ff02191690836004811115610cd657fe5b0217905550600480811115610ce757fe5b8467ffffffffffffffff168660ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041784600001548560010154604051610d2f929190613e79565b60405180910390a45050505050565b610d4661250f565b610d4e612402565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff166009600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990614259565b60405180910390fd5b60018160040160009054906101000a900460ff166004811115610e7157fe5b1115610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea9906141b9565b60405180910390fd5b600c60008368ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90614059565b60405180910390fd5b60008160040160009054906101000a900460ff166004811115610f9657fe5b14156111b657600560008154600101919050819055506040518060c001604052808581526020018481526020016001604051908082528060200260200182016040528015610ff35781602001602082028036833780820191505090505b50815260200160006040519080825280602002602001820160405280156110295781602001602082028036833780820191505090505b5081526020016001600481111561103c57fe5b815260200143815250600b60008468ffffffffffffffffff1668ffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906110af929190612b84565b5060608201518160030190805190602001906110cc929190612b84565b5060808201518160040160006101000a81548160ff021916908360048111156110f157fe5b021790555060a08201518160050155905050338160020160008154811061111457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481111561116957fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516111a9929190613e79565b60405180910390a46112f9565b6007546111c74383600501546124c5565b111561124c5760048160040160006101000a81548160ff021916908360048111156111ee57fe5b02179055506004808111156111ff57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417878760405161123f929190613e79565b60405180910390a46112f8565b80600101548314611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990614239565b60405180910390fd5b80600201339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b60048081111561130557fe5b8160040160009054906101000a900460ff16600481111561132257fe5b146114b7576001600c60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060040160009054906101000a900460ff1660048111156113d457fe5b8567ffffffffffffffff168760ff167f25f8daaa4635a7729927ba3f5b3d59cc3320aca7c32c9db4e7ca7b9574343640876040516114129190613df0565b60405180910390a460016003541115806114355750600354816002018054905010155b156114b65760028160040160006101000a81548160ff0219169083600481111561145b57fe5b02179055506002600481111561146d57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516114ad929190613e79565b60405180910390a45b5b505050505050565b600060016000838152602001908152602001600020600201549050919050565b611506600160008481526020019081526020016000206002015461150161256d565b611d9b565b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614039565b60405180910390fd5b61154f8282612575565b5050565b61155b61256d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614279565b60405180910390fd5b6115d28282612609565b5050565b600a602052816000526040600020602052806000526040600020600091509150508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561168b5780601f106116605761010080835404028352916020019161168b565b820191906000526020600020905b81548152906001019060200180831161166e57829003601f168201915b505050505081565b61169b61250f565b6116a3612402565b60006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008660ff1660088767ffffffffffffffff1668ffffffffffffffffff16901b179050600082868660405160200161171593929190613d29565b6040516020818303038152906040528051906020012090506000600b60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000600481111561177857fe5b8160040160009054906101000a900460ff16600481111561179557fe5b14156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613fd9565b60405180910390fd5b600260048111156117e357fe5b8160040160009054906101000a900460ff16600481111561180057fe5b14611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613fb9565b60405180910390fd5b80600101548214611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d906140d9565b60405180910390fd5b60038160040160006101000a81548160ff021916908360048111156118a757fe5b02179055506000600960008360000154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e248cff283600001548a8a6040518463ffffffff1660e01b815260040161192993929190613ee7565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050508160040160009054906101000a900460ff16600481111561197857fe5b8967ffffffffffffffff168b60ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417856000015486600101546040516119c0929190613e79565b60405180910390a450505050505050505050565b6119dc61269d565b60008090505b84849050811015611a73578484828181106119f957fe5b9050602002016020810190611a0e9190612e6c565b73ffffffffffffffffffffffffffffffffffffffff166108fc848484818110611a3357fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611a65573d6000803e3d6000fd5b5080806001019150506119e2565b5050505050565b60086020528060005260406000206000915054906101000a900467ffffffffffffffff1681565b611aa961269d565b80600381905550807fa20d6b84cd798a24038be305eff8a45ca82ef54a2aa2082005d8e14c0a4746c860405160405180910390a250565b600b602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060040160009054906101000a900460ff16908060050154905084565b6000611b49604051611b3b90613d53565b604051809103902083611d9b565b9050919050565b60008060009054906101000a900460ff16905090565b611b6e61269d565b611b7b6000801b826114df565b611b886000801b33611553565b50565b611b9361269d565b60008490508073ffffffffffffffffffffffffffffffffffffffff1663d9caed128585856040518463ffffffff1660e01b8152600401611bd593929190613d9e565b600060405180830381600087803b158015611bef57600080fd5b505af1158015611c03573d6000803e3d6000fd5b505050505050505050565b600c602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60045481565b611c5861269d565b611c606126eb565b565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c9d61269d565b60008290508073ffffffffffffffffffffffffffffffffffffffff166307b7ed99836040518263ffffffff1660e01b8152600401611cdb9190613d68565b600060405180830381600087803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b50505050505050565b6000611d3c826001600086815260200190815260200160002060000161274690919063ffffffff16565b905092915050565b611d4c61269d565b806006541415611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8890614219565b60405180910390fd5b8060068190555050565b6000611dc5826001600086815260200190815260200160002060000161276090919063ffffffff16565b905092915050565b604051611dd990613d53565b604051809103902081565b60055481565b611df261269d565b611e0f604051611e0190613d53565b604051809103902082611d9b565b611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590614099565b60405180910390fd5b611e6b604051611e5d90613d53565b60405180910390208261229e565b8073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a26004600081548092919060019003919050555050565b6000801b81565b611ed3612c0e565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b179050600b60008268ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611fd457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f8a575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561206257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612018575b505050505081526020016004820160009054906101000a900460ff16600481111561208957fe5b600481111561209457fe5b81526020016005820154815250509150509392505050565b600260009054906101000a900460ff1681565b60065481565b60075481565b60006120eb60016000848152602001908152602001600020600001612790565b9050919050565b6120fa61269d565b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008390508073ffffffffffffffffffffffffffffffffffffffff1663b8fa373684846040518363ffffffff1660e01b815260040161218c929190613e0b565b600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050505050505050565b6121cc61269d565b6121e96040516121db90613d53565b604051809103902082611d9b565b15612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614199565b60405180910390fd5b61224660405161223890613d53565b6040518091039020826114df565b8073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a260046000815480929190600101919050555050565b6122c560016000848152602001908152602001600020600201546122c061256d565b611d9b565b612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90614139565b60405180910390fd5b61230e8282612609565b5050565b60035481565b61232061269d565b846009600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008590508073ffffffffffffffffffffffffffffffffffffffff1663bba8185a868686866040518563ffffffff1660e01b81526004016123b69493929190613e34565b600060405180830381600087803b1580156123d057600080fd5b505af11580156123e4573d6000803e3d6000fd5b50505050505050505050565b6123f861269d565b6124006127a5565b565b6000809054906101000a900460ff1615612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614179565b60405180910390fd5b565b6124606000801b33611d9b565b80612484575061248360405161247590613d53565b604051809103902033611d9b565b5b6124c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ba90614019565b60405180910390fd5b565b600061250783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612800565b905092915050565b61252c60405161251e90613d53565b604051809103902033611d9b565b61256b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612562906141d9565b60405180910390fd5b565b600033905090565b61259d816001600085815260200190815260200160002060000161285b90919063ffffffff16565b15612605576125aa61256d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612631816001600085815260200190815260200160002060000161288b90919063ffffffff16565b156126995761263e61256d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6126aa6000801b33611d9b565b6126e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e0906141f9565b60405180910390fd5b565b6126f3612402565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161273c9190613d83565b60405180910390a1565b600061275583600001836128bb565b60001c905092915050565b6000612788836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612928565b905092915050565b600061279e8260000161294b565b9050919050565b6127ad61295c565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336040516127f69190613d83565b60405180910390a1565b6000838311158290612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f9190613f97565b60405180910390fd5b5060008385039050809150509392505050565b6000612883836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129ac565b905092915050565b60006128b3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612a1c565b905092915050565b600081836000018054905011612906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fd90613ff9565b60405180910390fd5b82600001828154811061291557fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000809054906101000a900460ff166129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190614079565b60405180910390fd5b565b60006129b88383612928565b612a11578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612a16565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114612af85760006001820390506000600186600001805490500390506000866000018281548110612a6757fe5b9060005260206000200154905080876000018481548110612a8457fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612abc57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612afe565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612b4557803560ff1916838001178555612b73565b82800160010185558215612b73579182015b82811115612b72578235825591602001919060010190612b57565b5b509050612b809190612c55565b5090565b828054828255906000526020600020908101928215612bfd579160200282015b82811115612bfc5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612ba4565b5b509050612c0a9190612c7a565b5090565b6040518060c001604052806000801916815260200160008019168152602001606081526020016060815260200160006004811115612c4857fe5b8152602001600081525090565b612c7791905b80821115612c73576000816000905550600101612c5b565b5090565b90565b612cba91905b80821115612cb657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101612c80565b5090565b90565b600081359050612ccc81614545565b92915050565b600081359050612ce18161455c565b92915050565b60008083601f840112612cf957600080fd5b8235905067ffffffffffffffff811115612d1257600080fd5b602083019150836020820283011115612d2a57600080fd5b9250929050565b60008083601f840112612d4357600080fd5b8235905067ffffffffffffffff811115612d5c57600080fd5b602083019150836020820283011115612d7457600080fd5b9250929050565b600081359050612d8a81614573565b92915050565b600081359050612d9f8161458a565b92915050565b60008083601f840112612db757600080fd5b8235905067ffffffffffffffff811115612dd057600080fd5b602083019150836001820283011115612de857600080fd5b9250929050565b600081359050612dfe816145a1565b92915050565b600081359050612e13816145b8565b92915050565b600081359050612e28816145cf565b92915050565b600081359050612e3d816145e6565b92915050565b600060208284031215612e5557600080fd5b6000612e6384828501612cbd565b91505092915050565b600060208284031215612e7e57600080fd5b6000612e8c84828501612cd2565b91505092915050565b60008060408385031215612ea857600080fd5b6000612eb685828601612cbd565b9250506020612ec785828601612cbd565b9150509250929050565b60008060008060808587031215612ee757600080fd5b6000612ef587828801612cbd565b9450506020612f0687828801612cbd565b9350506040612f1787828801612cbd565b9250506060612f2887828801612def565b91505092959194509250565b600080600060608486031215612f4957600080fd5b6000612f5786828701612cbd565b9350506020612f6886828701612d7b565b9250506040612f7986828701612cbd565b9150509250925092565b600080600080600060a08688031215612f9b57600080fd5b6000612fa988828901612cbd565b9550506020612fba88828901612d7b565b9450506040612fcb88828901612cbd565b9350506060612fdc88828901612d90565b9250506080612fed88828901612d90565b9150509295509295909350565b6000806000806040858703121561301057600080fd5b600085013567ffffffffffffffff81111561302a57600080fd5b61303687828801612ce7565b9450945050602085013567ffffffffffffffff81111561305557600080fd5b61306187828801612d31565b925092505092959194509250565b60006020828403121561308157600080fd5b600061308f84828501612d7b565b91505092915050565b600080604083850312156130ab57600080fd5b60006130b985828601612d7b565b92505060206130ca85828601612cbd565b9150509250929050565b600080604083850312156130e757600080fd5b60006130f585828601612d7b565b925050602061310685828601612def565b9150509250929050565b60006020828403121561312257600080fd5b600061313084828501612def565b91505092915050565b6000806040838503121561314c57600080fd5b600061315a85828601612e04565b925050602061316b85828601612e2e565b9150509250929050565b6000806040838503121561318857600080fd5b600061319685828601612e19565b92505060206131a785828601612d7b565b9150509250929050565b6000806000606084860312156131c657600080fd5b60006131d486828701612e19565b93505060206131e586828701612d7b565b92505060406131f686828701612cbd565b9150509250925092565b60006020828403121561321257600080fd5b600061322084828501612e2e565b91505092915050565b6000806000806060858703121561323f57600080fd5b600061324d87828801612e2e565b945050602061325e87828801612d7b565b935050604085013567ffffffffffffffff81111561327b57600080fd5b61328787828801612da5565b925092505092959194509250565b6000806000606084860312156132aa57600080fd5b60006132b886828701612e2e565b93505060206132c986828701612e04565b92505060406132da86828701612d7b565b9150509250925092565b600080600080608085870312156132fa57600080fd5b600061330887828801612e2e565b945050602061331987828801612e04565b935050604061332a87828801612d7b565b925050606061333b87828801612d7b565b91505092959194509250565b60008060008060006080868803121561335f57600080fd5b600061336d88828901612e2e565b955050602061337e88828901612e04565b945050604086013567ffffffffffffffff81111561339b57600080fd5b6133a788828901612da5565b935093505060606133ba88828901612d7b565b9150509295509295909350565b60006133d383836133ee565b60208301905092915050565b6133e88161446c565b82525050565b6133f781614393565b82525050565b61340681614393565b82525050565b61341d61341882614393565b6144f6565b82525050565b600061342e8261431c565b613438818561434a565b93506134438361430c565b8060005b8381101561347457815161345b88826133c7565b97506134668361433d565b925050600181019050613447565b5085935050505092915050565b61348a816143b7565b82525050565b613499816143c3565b82525050565b6134a8816143c3565b82525050565b6134b7816143cd565b82525050565b60006134c9838561435b565b93506134d68385846144b4565b6134df8361451a565b840190509392505050565b60006134f6838561436c565b93506135038385846144b4565b82840190509392505050565b600061351a82614327565b613524818561435b565b93506135348185602086016144c3565b61353d8161451a565b840191505092915050565b6135518161447e565b82525050565b6135608161447e565b82525050565b600061357182614332565b61357b8185614377565b935061358b8185602086016144c3565b6135948161451a565b840191505092915050565b60006135ac601c83614377565b91507f70726f706f73616c20616c7265616479207472616e73666572726564000000006000830152602082019050919050565b60006135ec601683614377565b91507f70726f706f73616c206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061362c602283614377565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613692601e83614377565b91507f73656e646572206973206e6f742072656c61796572206f722061646d696e00006000830152602082019050919050565b60006136d2602f83614377565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b6000613738601583614377565b91507f72656c6179657220616c726561647920766f74656400000000000000000000006000830152602082019050919050565b6000613778601483614377565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006137b8601f83614377565b91507f6164647220646f65736e277420686176652072656c6179657220726f6c6521006000830152602082019050919050565b60006137f8601683614377565b91507f496e636f72726563742066656520737570706c696564000000000000000000006000830152602082019050919050565b6000613838601b83614377565b91507f6461746120646f65736e2774206d6174636820646174616861736800000000006000830152602082019050919050565b6000613878601a83614377565b91507f50726f706f73616c20616c72656164792063616e63656c6c65640000000000006000830152602082019050919050565b60006138b8602083614377565b91507f7265736f757263654944206e6f74206d617070656420746f2068616e646c65726000830152602082019050919050565b60006138f8603083614377565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f207265766f6b65000000000000000000000000000000006020830152604082019050919050565b600061395e602083614377565b91507f50726f706f73616c206e6f7420617420657870697279207468726573686f6c646000830152602082019050919050565b600061399e601083614377565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006139de601e83614377565b91507f6164647220616c7265616479206861732072656c6179657220726f6c652100006000830152602082019050919050565b6000613a1e602a83614377565b91507f70726f706f73616c20616c7265616479207061737365642f657865637574656460008301527f2f63616e63656c6c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a84602083614377565b91507f73656e64657220646f65736e277420686176652072656c6179657220726f6c656000830152602082019050919050565b6000613ac4601e83614377565b91507f73656e64657220646f65736e277420686176652061646d696e20726f6c6500006000830152602082019050919050565b6000613b04601f83614377565b91507f43757272656e742066656520697320657175616c20746f206e657720666565006000830152602082019050919050565b6000613b44600c83614388565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b6000613b84601183614377565b91507f6461746168617368206d69736d617463680000000000000000000000000000006000830152602082019050919050565b6000613bc4601983614377565b91507f6e6f2068616e646c657220666f72207265736f757263654944000000000000006000830152602082019050919050565b6000613c04602f83614377565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b600060c083016000830151613c756000860182613490565b506020830151613c886020860182613490565b5060408301518482036040860152613ca08282613423565b91505060608301518482036060860152613cba8282613423565b9150506080830151613ccf6080860182613548565b5060a0830151613ce260a0860182613ced565b508091505092915050565b613cf68161442c565b82525050565b613d058161442c565b82525050565b613d1481614436565b82525050565b613d238161445f565b82525050565b6000613d35828661340c565b601482019150613d468284866134ea565b9150819050949350505050565b6000613d5e82613b37565b9150819050919050565b6000602082019050613d7d60008301846133fd565b92915050565b6000602082019050613d9860008301846133df565b92915050565b6000606082019050613db360008301866133fd565b613dc060208301856133fd565b613dcd6040830184613cfc565b949350505050565b6000602082019050613dea6000830184613481565b92915050565b6000602082019050613e05600083018461349f565b92915050565b6000604082019050613e20600083018561349f565b613e2d60208301846133fd565b9392505050565b6000608082019050613e49600083018761349f565b613e5660208301866133fd565b613e6360408301856134ae565b613e7060608301846134ae565b95945050505050565b6000604082019050613e8e600083018561349f565b613e9b602083018461349f565b9392505050565b6000608082019050613eb7600083018761349f565b613ec4602083018661349f565b613ed16040830185613557565b613ede6060830184613cfc565b95945050505050565b6000604082019050613efc600083018661349f565b8181036020830152613f0f8184866134bd565b9050949350505050565b600060a082019050613f2e600083018961349f565b613f3b6020830188613d1a565b613f486040830187613d0b565b613f5560608301866133df565b8181036080830152613f688184866134bd565b9050979650505050505050565b60006020820190508181036000830152613f8f818461350f565b905092915050565b60006020820190508181036000830152613fb18184613566565b905092915050565b60006020820190508181036000830152613fd28161359f565b9050919050565b60006020820190508181036000830152613ff2816135df565b9050919050565b600060208201905081810360008301526140128161361f565b9050919050565b6000602082019050818103600083015261403281613685565b9050919050565b60006020820190508181036000830152614052816136c5565b9050919050565b600060208201905081810360008301526140728161372b565b9050919050565b600060208201905081810360008301526140928161376b565b9050919050565b600060208201905081810360008301526140b2816137ab565b9050919050565b600060208201905081810360008301526140d2816137eb565b9050919050565b600060208201905081810360008301526140f28161382b565b9050919050565b600060208201905081810360008301526141128161386b565b9050919050565b60006020820190508181036000830152614132816138ab565b9050919050565b60006020820190508181036000830152614152816138eb565b9050919050565b6000602082019050818103600083015261417281613951565b9050919050565b6000602082019050818103600083015261419281613991565b9050919050565b600060208201905081810360008301526141b2816139d1565b9050919050565b600060208201905081810360008301526141d281613a11565b9050919050565b600060208201905081810360008301526141f281613a77565b9050919050565b6000602082019050818103600083015261421281613ab7565b9050919050565b6000602082019050818103600083015261423281613af7565b9050919050565b6000602082019050818103600083015261425281613b77565b9050919050565b6000602082019050818103600083015261427281613bb7565b9050919050565b6000602082019050818103600083015261429281613bf7565b9050919050565b600060208201905081810360008301526142b38184613c5d565b905092915050565b60006020820190506142d06000830184613cfc565b92915050565b60006020820190506142eb6000830184613d0b565b92915050565b60006020820190506143066000830184613d1a565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061439e8261440c565b9050919050565b60006143b08261440c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061440782614538565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b600061447782614490565b9050919050565b6000614489826143f9565b9050919050565b600061449b826144a2565b9050919050565b60006144ad8261440c565b9050919050565b82818337600083830152505050565b60005b838110156144e15780820151818401526020810190506144c6565b838111156144f0576000848401525b50505050565b600061450182614508565b9050919050565b60006145138261452b565b9050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6005811061454257fe5b50565b61454e81614393565b811461455957600080fd5b50565b614565816143a5565b811461457057600080fd5b50565b61457c816143c3565b811461458757600080fd5b50565b614593816143cd565b811461459e57600080fd5b50565b6145aa8161442c565b81146145b557600080fd5b50565b6145c181614436565b81146145cc57600080fd5b50565b6145d88161444a565b81146145e357600080fd5b50565b6145ef8161445f565b81146145fa57600080fd5b5056fea2646970667358221220516009222e13732fb2b271e05e189ee935c032eef285667f0c5e2a89242ceb7764736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x4DCE CODESIZE SUB DUP1 PUSH3 0x4DCE DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH3 0x37 SWAP2 SWAP1 PUSH3 0x501 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x3 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x6 DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x7 DUP2 SWAP1 SSTORE POP PUSH3 0x96 PUSH1 0x0 DUP1 SHL CALLER PUSH3 0x134 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0xC0 PUSH1 0x40 MLOAD PUSH3 0xA8 SWAP1 PUSH3 0x646 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 DUP1 SHL PUSH3 0x14A PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH3 0x128 JUMPI PUSH3 0x108 PUSH1 0x40 MLOAD PUSH3 0xDF SWAP1 PUSH3 0x646 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH3 0xF4 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH3 0x1AE PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH3 0xC3 JUMP JUMPDEST POP POP POP POP POP POP PUSH3 0x78B JUMP JUMPDEST PUSH3 0x146 DUP3 DUP3 PUSH3 0x23D PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD DUP4 PUSH32 0xBD79B86FFE0AB8E8776151514217CD7CACD52C909F66475C3AF44E129F0B00FF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH3 0x1E5 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH3 0x1D9 PUSH3 0x2E1 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x2E9 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x227 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x21E SWAP1 PUSH3 0x65D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH3 0x239 DUP3 DUP3 PUSH3 0x23D PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH3 0x26C DUP2 PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH3 0x322 PUSH1 0x20 SHL PUSH3 0x285B OR SWAP1 SWAP2 SWAP1 PUSH1 0x20 SHR JUMP JUMPDEST ISZERO PUSH3 0x2DD JUMPI PUSH3 0x282 PUSH3 0x2E1 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x31A DUP3 PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH3 0x35A PUSH1 0x20 SHL PUSH3 0x2760 OR SWAP1 SWAP2 SWAP1 PUSH1 0x20 SHR JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x352 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH3 0x392 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x38A DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH3 0x40C PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3A6 DUP4 DUP4 PUSH3 0x40C PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x401 JUMPI DUP3 PUSH1 0x0 ADD DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE DUP3 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 SWAP1 POP PUSH3 0x406 JUMP JUMPDEST PUSH1 0x0 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x440 DUP2 PUSH3 0x73D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x458 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x46F PUSH3 0x469 DUP3 PUSH3 0x6AD JUMP JUMPDEST PUSH3 0x67F JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH3 0x495 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x4C9 JUMPI DUP2 PUSH3 0x4AE DUP9 DUP3 PUSH3 0x42F JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH3 0x498 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x4E4 DUP2 PUSH3 0x757 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x4FB DUP2 PUSH3 0x771 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x51A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x52A DUP9 DUP3 DUP10 ADD PUSH3 0x4EA JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 DUP7 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x556 DUP9 DUP3 DUP10 ADD PUSH3 0x446 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x569 DUP9 DUP3 DUP10 ADD PUSH3 0x4D3 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0x57C DUP9 DUP3 DUP10 ADD PUSH3 0x4D3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH3 0x58F DUP9 DUP3 DUP10 ADD PUSH3 0x4D3 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x5AB PUSH1 0x2F DUP4 PUSH3 0x6D6 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2073656E646572206D75737420626520616E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2061646D696E20746F206772616E740000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x613 PUSH1 0xC DUP4 PUSH3 0x6E7 JUMP JUMPDEST SWAP2 POP PUSH32 0x52454C415945525F524F4C450000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0xC DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x653 DUP3 PUSH3 0x604 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH3 0x678 DUP2 PUSH3 0x59C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH3 0x6A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x40 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x6C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x6FF DUP3 PUSH3 0x706 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0x748 DUP2 PUSH3 0x6F2 JUMP JUMPDEST DUP2 EQ PUSH3 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH3 0x762 DUP2 PUSH3 0x726 JUMP JUMPDEST DUP2 EQ PUSH3 0x76E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH3 0x77C DUP2 PUSH3 0x730 JUMP JUMPDEST DUP2 EQ PUSH3 0x788 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x4633 DUP1 PUSH3 0x79B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x230 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x84DB809F GT PUSH2 0x12E JUMPI DUP1 PUSH4 0xBEAB7131 GT PUSH2 0xAB JUMPI DUP1 PUSH4 0xCDB0F73A GT PUSH2 0x6F JUMPI DUP1 PUSH4 0xCDB0F73A EQ PUSH2 0x877 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8A0 JUMPI DUP1 PUSH4 0xD7A9CD79 EQ PUSH2 0x8C9 JUMPI DUP1 PUSH4 0xE8437EE7 EQ PUSH2 0x8F4 JUMPI DUP1 PUSH4 0xFFAAC0EB EQ PUSH2 0x91D JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0xBEAB7131 EQ PUSH2 0x790 JUMPI DUP1 PUSH4 0xC5B37C22 EQ PUSH2 0x7BB JUMPI DUP1 PUSH4 0xC5EC8970 EQ PUSH2 0x7E6 JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x811 JUMPI DUP1 PUSH4 0xCB10F215 EQ PUSH2 0x84E JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x926D7D7F GT PUSH2 0xF2 JUMPI DUP1 PUSH4 0x926D7D7F EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0x9D5773E0 EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x9D82DD63 EQ PUSH2 0x6FF JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x728 JUMPI DUP1 PUSH4 0xA9CF69FA EQ PUSH2 0x753 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x84DB809F EQ PUSH2 0x5A0 JUMPI DUP1 PUSH4 0x8C0C2631 EQ PUSH2 0x5DD JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x606 JUMPI DUP1 PUSH4 0x91C404AC EQ PUSH2 0x643 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x66C JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x4B0B919D GT PUSH2 0x1BC JUMPI DUP1 PUSH4 0x5E1FAB0F GT PUSH2 0x180 JUMPI DUP1 PUSH4 0x5E1FAB0F EQ PUSH2 0x4CF JUMPI DUP1 PUSH4 0x780CF004 EQ PUSH2 0x4F8 JUMPI DUP1 PUSH4 0x7FEBE63F EQ PUSH2 0x521 JUMPI DUP1 PUSH4 0x802AABE8 EQ PUSH2 0x55E JUMPI DUP1 PUSH4 0x80AE1C28 EQ PUSH2 0x589 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x4B0B919D EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0x4E056005 EQ PUSH2 0x3FE JUMPI DUP1 PUSH4 0x50598719 EQ PUSH2 0x427 JUMPI DUP1 PUSH4 0x541D5548 EQ PUSH2 0x467 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x4A4 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x2F2FF15D GT PUSH2 0x203 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2E0 JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x309 JUMPI DUP1 PUSH4 0x3EE7094A EQ PUSH2 0x332 JUMPI DUP1 PUSH4 0x4454B20D EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0x4603AE38 EQ PUSH2 0x398 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x5E2CA17 EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0x17F03CE5 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x1FF013F1 EQ PUSH2 0x27A JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x2A3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x24A SWAP2 SWAP1 PUSH2 0x3229 JUMP JUMPDEST PUSH2 0x934 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x278 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x273 SWAP2 SWAP1 PUSH2 0x3295 JUMP JUMPDEST PUSH2 0xB91 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x286 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x29C SWAP2 SWAP1 PUSH2 0x32E4 JUMP JUMPDEST PUSH2 0xD3E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x2C5 SWAP2 SWAP1 PUSH2 0x306F JUMP JUMPDEST PUSH2 0x14BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2D7 SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x302 SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x14DF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x330 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x32B SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x1553 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x359 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x354 SWAP2 SWAP1 PUSH2 0x3139 JUMP JUMPDEST PUSH2 0x15D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x366 SWAP2 SWAP1 PUSH2 0x3F75 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x396 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x391 SWAP2 SWAP1 PUSH2 0x3347 JUMP JUMPDEST PUSH2 0x1693 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x3BA SWAP2 SWAP1 PUSH2 0x2FFA JUMP JUMPDEST PUSH2 0x19D4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x3E3 SWAP2 SWAP1 PUSH2 0x3200 JUMP JUMPDEST PUSH2 0x1A7A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3F5 SWAP2 SWAP1 PUSH2 0x42D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x425 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x420 SWAP2 SWAP1 PUSH2 0x3110 JUMP JUMPDEST PUSH2 0x1AA1 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x433 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x44E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x449 SWAP2 SWAP1 PUSH2 0x3175 JUMP JUMPDEST PUSH2 0x1AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x45E SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3EA2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x489 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x1B2A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x49B SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B9 PUSH2 0x1B50 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x4C6 SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4F6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F1 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x1B66 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x51F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x51A SWAP2 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0x1B8B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x548 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x543 SWAP2 SWAP1 PUSH2 0x31B1 JUMP JUMPDEST PUSH2 0x1C0E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x555 SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x573 PUSH2 0x1C4A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x580 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x595 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59E PUSH2 0x1C50 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5C7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x5C2 SWAP2 SWAP1 PUSH2 0x306F JUMP JUMPDEST PUSH2 0x1C62 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5D4 SWAP2 SWAP1 PUSH2 0x3D68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x604 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x5FF SWAP2 SWAP1 PUSH2 0x2E95 JUMP JUMPDEST PUSH2 0x1C95 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x612 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x62D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x628 SWAP2 SWAP1 PUSH2 0x30D4 JUMP JUMPDEST PUSH2 0x1D12 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x63A SWAP2 SWAP1 PUSH2 0x3D68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x64F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x66A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x3110 JUMP JUMPDEST PUSH2 0x1D44 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x678 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x693 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x68E SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x1D9B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6A0 SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6BE PUSH2 0x1DCD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6CB SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6E9 PUSH2 0x1DE4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6F6 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x70B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x726 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x721 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x1DEA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x734 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x73D PUSH2 0x1EC4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x74A SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x75F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x77A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x775 SWAP2 SWAP1 PUSH2 0x3295 JUMP JUMPDEST PUSH2 0x1ECB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x4299 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x79C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7A5 PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7B2 SWAP2 SWAP1 PUSH2 0x42F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7D0 PUSH2 0x20BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7DD SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7FB PUSH2 0x20C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x808 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x81D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x838 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x833 SWAP2 SWAP1 PUSH2 0x306F JUMP JUMPDEST PUSH2 0x20CB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x845 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x85A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x875 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x870 SWAP2 SWAP1 PUSH2 0x2F34 JUMP JUMPDEST PUSH2 0x20F2 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x883 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x89E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x899 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x21C4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x8C2 SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x229E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8DE PUSH2 0x2312 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8EB SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x900 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x91B PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x916 SWAP2 SWAP1 PUSH2 0x2F83 JUMP JUMPDEST PUSH2 0x2318 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x929 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x932 PUSH2 0x23F0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x93C PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x6 SLOAD CALLVALUE EQ PUSH2 0x980 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x977 SWAP1 PUSH2 0x40B9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA28 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA1F SWAP1 PUSH2 0x4119 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x8 PUSH1 0x0 DUP8 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP2 DUP2 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 ADD SWAP2 SWAP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH8 0xFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE SWAP1 POP DUP4 DUP4 PUSH1 0xA PUSH1 0x0 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP10 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 SWAP1 PUSH2 0xAD1 SWAP3 SWAP2 SWAP1 PUSH2 0x2B04 JUMP JUMPDEST POP PUSH1 0x0 DUP3 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x38995DA9 DUP8 DUP10 DUP6 CALLER DUP11 DUP11 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB1A SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3F19 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB48 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP7 DUP9 PUSH1 0xFF AND PUSH32 0xDBB69440DF8433824A026EF190652F29929EB64B4D1D5D2A69BE8AFE3E6EAED8 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB99 PUSH2 0x2453 JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0xFF AND PUSH1 0x8 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0x0 PUSH1 0xB PUSH1 0x0 DUP4 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0xC06 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xC23 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC64 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC5B SWAP1 PUSH2 0x40F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x7 SLOAD PUSH2 0xC75 NUMBER DUP4 PUSH1 0x5 ADD SLOAD PUSH2 0x24C5 JUMP JUMPDEST GT PUSH2 0xCB5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCAC SWAP1 PUSH2 0x4159 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xCD6 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0xCE7 JUMPI INVALID JUMPDEST DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP5 PUSH1 0x0 ADD SLOAD DUP6 PUSH1 0x1 ADD SLOAD PUSH1 0x40 MLOAD PUSH2 0xD2F SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xD46 PUSH2 0x250F JUMP JUMPDEST PUSH2 0xD4E PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0xFF AND PUSH1 0x8 DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0x0 PUSH1 0xB PUSH1 0x0 DUP4 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x9 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE49 SWAP1 PUSH2 0x4259 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xE71 JUMPI INVALID JUMPDEST GT ISZERO PUSH2 0xEB2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xEA9 SWAP1 PUSH2 0x41B9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xC PUSH1 0x0 DUP4 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xF77 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF6E SWAP1 PUSH2 0x4059 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xF96 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x11B6 JUMPI PUSH1 0x5 PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 ADD SWAP2 SWAP1 POP DUP2 SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xFF3 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1029 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x103C JUMPI INVALID JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD NUMBER DUP2 MSTORE POP PUSH1 0xB PUSH1 0x0 DUP5 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD SSTORE PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x10AF SWAP3 SWAP2 SWAP1 PUSH2 0x2B84 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x10CC SWAP3 SWAP2 SWAP1 PUSH2 0x2B84 JUMP JUMPDEST POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x10F1 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE SWAP1 POP POP CALLER DUP2 PUSH1 0x2 ADD PUSH1 0x0 DUP2 SLOAD DUP2 LT PUSH2 0x1114 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1169 JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x11A9 SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH2 0x12F9 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH2 0x11C7 NUMBER DUP4 PUSH1 0x5 ADD SLOAD PUSH2 0x24C5 JUMP JUMPDEST GT ISZERO PUSH2 0x124C JUMPI PUSH1 0x4 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x11EE JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0x11FF JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x123F SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH2 0x12F8 JUMP JUMPDEST DUP1 PUSH1 0x1 ADD SLOAD DUP4 EQ PUSH2 0x1292 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1289 SWAP1 PUSH2 0x4239 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x2 ADD CALLER SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST JUMPDEST PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0x1305 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1322 JUMPI INVALID JUMPDEST EQ PUSH2 0x14B7 JUMPI PUSH1 0x1 PUSH1 0xC PUSH1 0x0 DUP5 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x13D4 JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x25F8DAAA4635A7729927BA3F5B3D59CC3320ACA7C32C9DB4E7CA7B9574343640 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1412 SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH1 0x1 PUSH1 0x3 SLOAD GT ISZERO DUP1 PUSH2 0x1435 JUMPI POP PUSH1 0x3 SLOAD DUP2 PUSH1 0x2 ADD DUP1 SLOAD SWAP1 POP LT ISZERO JUMPDEST ISZERO PUSH2 0x14B6 JUMPI PUSH1 0x2 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x145B JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x146D JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x14AD SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1506 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH2 0x1501 PUSH2 0x256D JUMP JUMPDEST PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x1545 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x153C SWAP1 PUSH2 0x4039 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x154F DUP3 DUP3 PUSH2 0x2575 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x155B PUSH2 0x256D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x15C8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15BF SWAP1 PUSH2 0x4279 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x15D2 DUP3 DUP3 PUSH2 0x2609 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x168B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1660 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x168B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x166E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x169B PUSH2 0x250F JUMP JUMPDEST PUSH2 0x16A3 PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x9 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x0 DUP7 PUSH1 0xFF AND PUSH1 0x8 DUP8 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0x0 DUP3 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1715 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3D29 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0xB PUSH1 0x0 DUP5 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1778 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1795 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17D6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17CD SWAP1 PUSH2 0x3FD9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x17E3 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1800 JUMPI INVALID JUMPDEST EQ PUSH2 0x1840 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1837 SWAP1 PUSH2 0x3FB9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 ADD SLOAD DUP3 EQ PUSH2 0x1886 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x187D SWAP1 PUSH2 0x40D9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x18A7 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x9 PUSH1 0x0 DUP4 PUSH1 0x0 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE248CFF2 DUP4 PUSH1 0x0 ADD SLOAD DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1929 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3EE7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1943 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1957 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1978 JUMPI INVALID JUMPDEST DUP10 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP6 PUSH1 0x0 ADD SLOAD DUP7 PUSH1 0x1 ADD SLOAD PUSH1 0x40 MLOAD PUSH2 0x19C0 SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x19DC PUSH2 0x269D JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP5 DUP5 SWAP1 POP DUP2 LT ISZERO PUSH2 0x1A73 JUMPI DUP5 DUP5 DUP3 DUP2 DUP2 LT PUSH2 0x19F9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x1A0E SWAP2 SWAP1 PUSH2 0x2E6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1A33 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1A65 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x19E2 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1AA9 PUSH2 0x269D JUMP JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP DUP1 PUSH32 0xA20D6B84CD798A24038BE305EFF8A45CA82EF54A2AA2082005D8E14C0A4746C8 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 PUSH1 0x0 ADD SLOAD SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x5 ADD SLOAD SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B49 PUSH1 0x40 MLOAD PUSH2 0x1B3B SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP4 PUSH2 0x1D9B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1B6E PUSH2 0x269D JUMP JUMPDEST PUSH2 0x1B7B PUSH1 0x0 DUP1 SHL DUP3 PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x1B88 PUSH1 0x0 DUP1 SHL CALLER PUSH2 0x1553 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x1B93 PUSH2 0x269D JUMP JUMPDEST PUSH1 0x0 DUP5 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD9CAED12 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BD5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0xC PUSH1 0x20 MSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP3 POP SWAP3 POP POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1C58 PUSH2 0x269D JUMP JUMPDEST PUSH2 0x1C60 PUSH2 0x26EB JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1C9D PUSH2 0x269D JUMP JUMPDEST PUSH1 0x0 DUP3 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x7B7ED99 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1CDB SWAP2 SWAP1 PUSH2 0x3D68 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1CF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D09 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D3C DUP3 PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x2746 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1D4C PUSH2 0x269D JUMP JUMPDEST DUP1 PUSH1 0x6 SLOAD EQ ISZERO PUSH2 0x1D91 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D88 SWAP1 PUSH2 0x4219 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1DC5 DUP3 PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x2760 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD9 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1DF2 PUSH2 0x269D JUMP JUMPDEST PUSH2 0x1E0F PUSH1 0x40 MLOAD PUSH2 0x1E01 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x1E4E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E45 SWAP1 PUSH2 0x4099 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1E6B PUSH1 0x40 MLOAD PUSH2 0x1E5D SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x229E JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x10E1F7CE9FD7D1B90A66D13A2AB3CB8DD7F29F3F8D520B143B063CCFBAB6906B PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x4 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 SWAP1 SUB SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SHL DUP2 JUMP JUMPDEST PUSH2 0x1ED3 PUSH2 0x2C0E JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0xFF AND PUSH1 0x8 DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0xB PUSH1 0x0 DUP3 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1FD4 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1F8A JUMPI JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2062 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x2018 JUMPI JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2089 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2094 JUMPI INVALID JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x5 DUP3 ADD SLOAD DUP2 MSTORE POP POP SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20EB PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x2790 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x20FA PUSH2 0x269D JUMP JUMPDEST DUP3 PUSH1 0x9 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP4 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB8FA3736 DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x218C SWAP3 SWAP2 SWAP1 PUSH2 0x3E0B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x21CC PUSH2 0x269D JUMP JUMPDEST PUSH2 0x21E9 PUSH1 0x40 MLOAD PUSH2 0x21DB SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x1D9B JUMP JUMPDEST ISZERO PUSH2 0x2229 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2220 SWAP1 PUSH2 0x4199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2246 PUSH1 0x40 MLOAD PUSH2 0x2238 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x14DF JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x3580EE9F53A62B7CB409A2CB56F9BE87747DD15017AFC5CEF6EEF321E4FB2C5 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x4 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST PUSH2 0x22C5 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH2 0x22C0 PUSH2 0x256D JUMP JUMPDEST PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x2304 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22FB SWAP1 PUSH2 0x4139 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x230E DUP3 DUP3 PUSH2 0x2609 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2320 PUSH2 0x269D JUMP JUMPDEST DUP5 PUSH1 0x9 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP6 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBBA8185A DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23B6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3E34 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x23D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x23E4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x23F8 PUSH2 0x269D JUMP JUMPDEST PUSH2 0x2400 PUSH2 0x27A5 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x2451 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2448 SWAP1 PUSH2 0x4179 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH2 0x2460 PUSH1 0x0 DUP1 SHL CALLER PUSH2 0x1D9B JUMP JUMPDEST DUP1 PUSH2 0x2484 JUMPI POP PUSH2 0x2483 PUSH1 0x40 MLOAD PUSH2 0x2475 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 CALLER PUSH2 0x1D9B JUMP JUMPDEST JUMPDEST PUSH2 0x24C3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24BA SWAP1 PUSH2 0x4019 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2507 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 DUP2 MSTORE POP PUSH2 0x2800 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x252C PUSH1 0x40 MLOAD PUSH2 0x251E SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 CALLER PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x256B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2562 SWAP1 PUSH2 0x41D9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x259D DUP2 PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x285B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST ISZERO PUSH2 0x2605 JUMPI PUSH2 0x25AA PUSH2 0x256D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x2631 DUP2 PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x288B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST ISZERO PUSH2 0x2699 JUMPI PUSH2 0x263E PUSH2 0x256D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x26AA PUSH1 0x0 DUP1 SHL CALLER PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x26E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x26E0 SWAP1 PUSH2 0x41F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH2 0x26F3 PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 CALLER PUSH1 0x40 MLOAD PUSH2 0x273C SWAP2 SWAP1 PUSH2 0x3D83 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2755 DUP4 PUSH1 0x0 ADD DUP4 PUSH2 0x28BB JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2788 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH2 0x2928 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x279E DUP3 PUSH1 0x0 ADD PUSH2 0x294B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x27AD PUSH2 0x295C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA CALLER PUSH1 0x40 MLOAD PUSH2 0x27F6 SWAP2 SWAP1 PUSH2 0x3D83 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 GT ISZERO DUP3 SWAP1 PUSH2 0x2848 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x283F SWAP2 SWAP1 PUSH2 0x3F97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 SUB SWAP1 POP DUP1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2883 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH2 0x29AC JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B3 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH2 0x2A1C JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP GT PUSH2 0x2906 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x28FD SWAP1 PUSH2 0x3FF9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2915 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x29AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x29A1 SWAP1 PUSH2 0x4079 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29B8 DUP4 DUP4 PUSH2 0x2928 JUMP JUMPDEST PUSH2 0x2A11 JUMPI DUP3 PUSH1 0x0 ADD DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE DUP3 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 SWAP1 POP PUSH2 0x2A16 JUMP JUMPDEST PUSH1 0x0 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x0 DUP2 EQ PUSH2 0x2AF8 JUMPI PUSH1 0x0 PUSH1 0x1 DUP3 SUB SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP7 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP SUB SWAP1 POP PUSH1 0x0 DUP7 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2A67 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x2A84 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x1 DUP4 ADD DUP8 PUSH1 0x1 ADD PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP7 PUSH1 0x0 ADD DUP1 SLOAD DUP1 PUSH2 0x2ABC JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2B45 JUMPI DUP1 CALLDATALOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2B73 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2B73 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2B72 JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2B57 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2B80 SWAP2 SWAP1 PUSH2 0x2C55 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x2BFD JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2BFC JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2BA4 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2C0A SWAP2 SWAP1 PUSH2 0x2C7A JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2C48 JUMPI INVALID JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2C77 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2C73 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x2C5B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CBA SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2CB6 JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x2C80 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2CCC DUP2 PUSH2 0x4545 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2CE1 DUP2 PUSH2 0x455C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2CF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2D12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x2D2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2D43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2D5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x2D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2D8A DUP2 PUSH2 0x4573 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2D9F DUP2 PUSH2 0x458A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2DB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2DD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x2DE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2DFE DUP2 PUSH2 0x45A1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2E13 DUP2 PUSH2 0x45B8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2E28 DUP2 PUSH2 0x45CF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2E3D DUP2 PUSH2 0x45E6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E63 DUP5 DUP3 DUP6 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E8C DUP5 DUP3 DUP6 ADD PUSH2 0x2CD2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2EA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2EB6 DUP6 DUP3 DUP7 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2EC7 DUP6 DUP3 DUP7 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2EE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2EF5 DUP8 DUP3 DUP9 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x2F06 DUP8 DUP3 DUP9 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x2F17 DUP8 DUP3 DUP9 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x2F28 DUP8 DUP3 DUP9 ADD PUSH2 0x2DEF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2F49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2F57 DUP7 DUP3 DUP8 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2F68 DUP7 DUP3 DUP8 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x2F79 DUP7 DUP3 DUP8 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x2F9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2FA9 DUP9 DUP3 DUP10 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x2FBA DUP9 DUP3 DUP10 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x2FCB DUP9 DUP3 DUP10 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x2FDC DUP9 DUP3 DUP10 ADD PUSH2 0x2D90 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x2FED DUP9 DUP3 DUP10 ADD PUSH2 0x2D90 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3010 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x302A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3036 DUP8 DUP3 DUP9 ADD PUSH2 0x2CE7 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3055 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3061 DUP8 DUP3 DUP9 ADD PUSH2 0x2D31 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3081 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x308F DUP5 DUP3 DUP6 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x30AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x30B9 DUP6 DUP3 DUP7 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x30CA DUP6 DUP3 DUP7 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x30E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x30F5 DUP6 DUP3 DUP7 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3106 DUP6 DUP3 DUP7 ADD PUSH2 0x2DEF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3130 DUP5 DUP3 DUP6 ADD PUSH2 0x2DEF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x314C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x315A DUP6 DUP3 DUP7 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x316B DUP6 DUP3 DUP7 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3196 DUP6 DUP3 DUP7 ADD PUSH2 0x2E19 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x31A7 DUP6 DUP3 DUP7 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x31C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31D4 DUP7 DUP3 DUP8 ADD PUSH2 0x2E19 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x31E5 DUP7 DUP3 DUP8 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x31F6 DUP7 DUP3 DUP8 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3212 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3220 DUP5 DUP3 DUP6 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x323F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x324D DUP8 DUP3 DUP9 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x325E DUP8 DUP3 DUP9 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x327B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3287 DUP8 DUP3 DUP9 ADD PUSH2 0x2DA5 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x32AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x32B8 DUP7 DUP3 DUP8 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x32C9 DUP7 DUP3 DUP8 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x32DA DUP7 DUP3 DUP8 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x32FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3308 DUP8 DUP3 DUP9 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3319 DUP8 DUP3 DUP9 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x332A DUP8 DUP3 DUP9 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x333B DUP8 DUP3 DUP9 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x335F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x336D DUP9 DUP3 DUP10 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x337E DUP9 DUP3 DUP10 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x339B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x33A7 DUP9 DUP3 DUP10 ADD PUSH2 0x2DA5 JUMP JUMPDEST SWAP4 POP SWAP4 POP POP PUSH1 0x60 PUSH2 0x33BA DUP9 DUP3 DUP10 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33D3 DUP4 DUP4 PUSH2 0x33EE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x33E8 DUP2 PUSH2 0x446C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x33F7 DUP2 PUSH2 0x4393 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3406 DUP2 PUSH2 0x4393 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x341D PUSH2 0x3418 DUP3 PUSH2 0x4393 JUMP JUMPDEST PUSH2 0x44F6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x342E DUP3 PUSH2 0x431C JUMP JUMPDEST PUSH2 0x3438 DUP2 DUP6 PUSH2 0x434A JUMP JUMPDEST SWAP4 POP PUSH2 0x3443 DUP4 PUSH2 0x430C JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3474 JUMPI DUP2 MLOAD PUSH2 0x345B DUP9 DUP3 PUSH2 0x33C7 JUMP JUMPDEST SWAP8 POP PUSH2 0x3466 DUP4 PUSH2 0x433D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x3447 JUMP JUMPDEST POP DUP6 SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x348A DUP2 PUSH2 0x43B7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3499 DUP2 PUSH2 0x43C3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x34A8 DUP2 PUSH2 0x43C3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x34B7 DUP2 PUSH2 0x43CD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x34C9 DUP4 DUP6 PUSH2 0x435B JUMP JUMPDEST SWAP4 POP PUSH2 0x34D6 DUP4 DUP6 DUP5 PUSH2 0x44B4 JUMP JUMPDEST PUSH2 0x34DF DUP4 PUSH2 0x451A JUMP JUMPDEST DUP5 ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x34F6 DUP4 DUP6 PUSH2 0x436C JUMP JUMPDEST SWAP4 POP PUSH2 0x3503 DUP4 DUP6 DUP5 PUSH2 0x44B4 JUMP JUMPDEST DUP3 DUP5 ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x351A DUP3 PUSH2 0x4327 JUMP JUMPDEST PUSH2 0x3524 DUP2 DUP6 PUSH2 0x435B JUMP JUMPDEST SWAP4 POP PUSH2 0x3534 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x44C3 JUMP JUMPDEST PUSH2 0x353D DUP2 PUSH2 0x451A JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3551 DUP2 PUSH2 0x447E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3560 DUP2 PUSH2 0x447E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3571 DUP3 PUSH2 0x4332 JUMP JUMPDEST PUSH2 0x357B DUP2 DUP6 PUSH2 0x4377 JUMP JUMPDEST SWAP4 POP PUSH2 0x358B DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x44C3 JUMP JUMPDEST PUSH2 0x3594 DUP2 PUSH2 0x451A JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x35AC PUSH1 0x1C DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F706F73616C20616C7265616479207472616E7366657272656400000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x35EC PUSH1 0x16 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F706F73616C206973206E6F742061637469766500000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x362C PUSH1 0x22 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x456E756D657261626C655365743A20696E646578206F7574206F6620626F756E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6473000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3692 PUSH1 0x1E DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E646572206973206E6F742072656C61796572206F722061646D696E0000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x36D2 PUSH1 0x2F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2073656E646572206D75737420626520616E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2061646D696E20746F206772616E740000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3738 PUSH1 0x15 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x72656C6179657220616C726561647920766F7465640000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3778 PUSH1 0x14 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x5061757361626C653A206E6F7420706175736564000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B8 PUSH1 0x1F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6164647220646F65736E277420686176652072656C6179657220726F6C652100 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F8 PUSH1 0x16 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x496E636F72726563742066656520737570706C69656400000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3838 PUSH1 0x1B DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6461746120646F65736E2774206D617463682064617461686173680000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3878 PUSH1 0x1A DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x50726F706F73616C20616C72656164792063616E63656C6C6564000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B8 PUSH1 0x20 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x7265736F757263654944206E6F74206D617070656420746F2068616E646C6572 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38F8 PUSH1 0x30 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2073656E646572206D75737420626520616E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2061646D696E20746F207265766F6B6500000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x395E PUSH1 0x20 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x50726F706F73616C206E6F7420617420657870697279207468726573686F6C64 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x399E PUSH1 0x10 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x5061757361626C653A2070617573656400000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39DE PUSH1 0x1E DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6164647220616C7265616479206861732072656C6179657220726F6C65210000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A1E PUSH1 0x2A DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F706F73616C20616C7265616479207061737365642F6578656375746564 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2F63616E63656C6C656400000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A84 PUSH1 0x20 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E64657220646F65736E277420686176652072656C6179657220726F6C65 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AC4 PUSH1 0x1E DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E64657220646F65736E277420686176652061646D696E20726F6C650000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B04 PUSH1 0x1F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x43757272656E742066656520697320657175616C20746F206E65772066656500 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B44 PUSH1 0xC DUP4 PUSH2 0x4388 JUMP JUMPDEST SWAP2 POP PUSH32 0x52454C415945525F524F4C450000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0xC DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B84 PUSH1 0x11 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6461746168617368206D69736D61746368000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3BC4 PUSH1 0x19 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6E6F2068616E646C657220666F72207265736F75726365494400000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C04 PUSH1 0x2F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x3C75 PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x3490 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x3C88 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x3490 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x3CA0 DUP3 DUP3 PUSH2 0x3423 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x60 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x3CBA DUP3 DUP3 PUSH2 0x3423 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x3CCF PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x3548 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x3CE2 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x3CED JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3CF6 DUP2 PUSH2 0x442C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3D05 DUP2 PUSH2 0x442C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3D14 DUP2 PUSH2 0x4436 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3D23 DUP2 PUSH2 0x445F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D35 DUP3 DUP7 PUSH2 0x340C JUMP JUMPDEST PUSH1 0x14 DUP3 ADD SWAP2 POP PUSH2 0x3D46 DUP3 DUP5 DUP7 PUSH2 0x34EA JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D5E DUP3 PUSH2 0x3B37 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3D7D PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x33FD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3D98 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x33DF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD SWAP1 POP PUSH2 0x3DB3 PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x33FD JUMP JUMPDEST PUSH2 0x3DC0 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x33FD JUMP JUMPDEST PUSH2 0x3DCD PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3CFC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3DEA PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3481 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3E05 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x349F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3E20 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3E2D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x33FD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x3E49 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3E56 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x33FD JUMP JUMPDEST PUSH2 0x3E63 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x34AE JUMP JUMPDEST PUSH2 0x3E70 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x34AE JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3E8E PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3E9B PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x349F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x3EB7 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3EC4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3ED1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3557 JUMP JUMPDEST PUSH2 0x3EDE PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3CFC JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3EFC PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x349F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3F0F DUP2 DUP5 DUP7 PUSH2 0x34BD JUMP JUMPDEST SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0x3F2E PUSH1 0x0 DUP4 ADD DUP10 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3F3B PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x3D1A JUMP JUMPDEST PUSH2 0x3F48 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x3D0B JUMP JUMPDEST PUSH2 0x3F55 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x33DF JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x3F68 DUP2 DUP5 DUP7 PUSH2 0x34BD JUMP JUMPDEST SWAP1 POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3F8F DUP2 DUP5 PUSH2 0x350F JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3FB1 DUP2 DUP5 PUSH2 0x3566 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3FD2 DUP2 PUSH2 0x359F JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3FF2 DUP2 PUSH2 0x35DF JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4012 DUP2 PUSH2 0x361F JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4032 DUP2 PUSH2 0x3685 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4052 DUP2 PUSH2 0x36C5 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4072 DUP2 PUSH2 0x372B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4092 DUP2 PUSH2 0x376B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x40B2 DUP2 PUSH2 0x37AB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x40D2 DUP2 PUSH2 0x37EB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x40F2 DUP2 PUSH2 0x382B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4112 DUP2 PUSH2 0x386B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4132 DUP2 PUSH2 0x38AB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4152 DUP2 PUSH2 0x38EB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4172 DUP2 PUSH2 0x3951 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4192 DUP2 PUSH2 0x3991 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x41B2 DUP2 PUSH2 0x39D1 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x41D2 DUP2 PUSH2 0x3A11 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x41F2 DUP2 PUSH2 0x3A77 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4212 DUP2 PUSH2 0x3AB7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4232 DUP2 PUSH2 0x3AF7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4252 DUP2 PUSH2 0x3B77 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4272 DUP2 PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4292 DUP2 PUSH2 0x3BF7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x42B3 DUP2 DUP5 PUSH2 0x3C5D JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x42D0 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3CFC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x42EB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3D0B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x4306 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3D1A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x439E DUP3 PUSH2 0x440C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x43B0 DUP3 PUSH2 0x440C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH2 0x4407 DUP3 PUSH2 0x4538 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH9 0xFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4477 DUP3 PUSH2 0x4490 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4489 DUP3 PUSH2 0x43F9 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x449B DUP3 PUSH2 0x44A2 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44AD DUP3 PUSH2 0x440C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x44E1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x44C6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x44F0 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4501 DUP3 PUSH2 0x4508 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4513 DUP3 PUSH2 0x452B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x60 SHL SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 DUP2 LT PUSH2 0x4542 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST PUSH2 0x454E DUP2 PUSH2 0x4393 JUMP JUMPDEST DUP2 EQ PUSH2 0x4559 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x4565 DUP2 PUSH2 0x43A5 JUMP JUMPDEST DUP2 EQ PUSH2 0x4570 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x457C DUP2 PUSH2 0x43C3 JUMP JUMPDEST DUP2 EQ PUSH2 0x4587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x4593 DUP2 PUSH2 0x43CD JUMP JUMPDEST DUP2 EQ PUSH2 0x459E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45AA DUP2 PUSH2 0x442C JUMP JUMPDEST DUP2 EQ PUSH2 0x45B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45C1 DUP2 PUSH2 0x4436 JUMP JUMPDEST DUP2 EQ PUSH2 0x45CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45D8 DUP2 PUSH2 0x444A JUMP JUMPDEST DUP2 EQ PUSH2 0x45E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45EF DUP2 PUSH2 0x445F JUMP JUMPDEST DUP2 EQ PUSH2 0x45FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MLOAD PUSH1 0x9 0x22 0x2E SGT PUSH20 0x2FB2B271E05E189EE935C032EEF285667F0C5E2A DUP10 0x24 0x2C 0xEB PUSH24 0x64736F6C6343000604003300000000000000000000000000 ",
"sourceMap": "538:18377:0:-:0;;;3621:527;5:9:-1;2:2;;;27:1;24;17:12;2:2;3621:527:0;;;;;;;;;;;;;;;;;;;;;;;;782:5:5;772:7;;:15;;;;;;;;;;;;;;;;;;3770:7:0;3759:8;;:18;;;;;;;;;;;;;;;;;;3807:23;3787:17;:43;;;;3847:3;3840:4;:10;;;;3870:6;3860:7;:16;;;;3887:42;1770:4:8;3898:18:0;;3918:10;3887;;;:42;;:::i;:::-;3939:47;2471:25;;;;;;;;;;;;;;1770:4:8;3967:18:0;;3939:13;;;:47;;:::i;:::-;4002:6;3997:144;4014:15;:22;4010:1;:26;3997:144;;;4057:43;2471:25;;;;;;;;;;;;;;4081:15;4097:1;4081:18;;;;;;;;;;;;;;4057:9;;;:43;;:::i;:::-;4114:14;;:16;;;;;;;;;;;;;4038:3;;;;;;;3997:144;;;;3621:527;;;;;538:18377;;6586:110:8;6664:25;6675:4;6681:7;6664:10;;;:25;;:::i;:::-;6586:110;;:::o;6821:196::-;6956:9;6932:6;:12;6939:4;6932:12;;;;;;;;;;;:22;;;6926:4;6909:57;;;;;;;;;;7001:9;6976:6;:12;6983:4;6976:12;;;;;;;;;;;:22;;:34;;;;6821:196;;:::o;4642:223::-;4725:45;4733:6;:12;4740:4;4733:12;;;;;;;;;;;:22;;;4757:12;:10;;;:12;;:::i;:::-;4725:7;;;:45;;:::i;:::-;4717:105;;;;;;;;;;;;;;;;;;;;;;4833:25;4844:4;4850:7;4833:10;;;:25;;:::i;:::-;4642:223;;:::o;7023:184::-;7096:33;7121:7;7096:6;:12;7103:4;7096:12;;;;;;;;;;;:20;;:24;;;;;;:33;;;;:::i;:::-;7092:109;;;7177:12;:10;;;:12;;:::i;:::-;7150:40;;7168:7;7150:40;;7162:4;7150:40;;;;;;;;;;7092:109;7023:184;;:::o;598:104:7:-;651:15;685:10;678:17;;598:104;:::o;2948:137:8:-;3017:4;3040:38;3070:7;3040:6;:12;3047:4;3040:12;;;;;;;;;;;:20;;:29;;;;;;:38;;;;:::i;:::-;3033:45;;2948:137;;;;:::o;6429:141:10:-;6499:4;6522:41;6527:3;:10;;6555:5;6547:14;;6539:23;;6522:4;;;:41;;:::i;:::-;6515:48;;6429:141;;;;:::o;6966:156::-;7046:4;7069:46;7079:3;:10;;7107:5;7099:14;;7091:23;;7069:9;;;:46;;:::i;:::-;7062:53;;6966:156;;;;:::o;1640:404::-;1703:4;1724:21;1734:3;1739:5;1724:9;;;:21;;:::i;:::-;1719:319;;1761:3;:11;;1778:5;1761:23;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1761:23:10;;;;;;;;;;;;;;;;;;;1941:3;:11;;:18;;;;1919:3;:12;;:19;1932:5;1919:19;;;;;;;;;;;:40;;;;1980:4;1973:11;;;;1719:319;2022:5;2015:12;;1640:404;;;;;:::o;3805:127::-;3878:4;3924:1;3901:3;:12;;:19;3914:5;3901:19;;;;;;;;;;;;:24;;3894:31;;3805:127;;;;:::o;5:134:-1:-;;89:6;83:13;74:22;;101:33;128:5;101:33;;;68:71;;;;;164:722;;292:3;285:4;277:6;273:17;269:27;259:2;;310:1;307;300:12;259:2;340:6;334:13;362:80;377:64;434:6;377:64;;;362:80;;;353:89;;459:5;484:6;477:5;470:21;514:4;506:6;502:17;492:27;;536:4;531:3;527:14;520:21;;589:6;636:3;628:4;620:6;616:17;611:3;607:27;604:36;601:2;;;653:1;650;643:12;601:2;678:1;663:217;688:6;685:1;682:13;663:217;;;746:3;768:48;812:3;800:10;768:48;;;763:3;756:61;840:4;835:3;831:14;824:21;;868:4;863:3;859:14;852:21;;720:160;710:1;707;703:9;698:14;;663:217;;;667:14;252:634;;;;;;;;894:134;;978:6;972:13;963:22;;990:33;1017:5;990:33;;;957:71;;;;;1035:130;;1117:6;1111:13;1102:22;;1129:31;1154:5;1129:31;;;1096:69;;;;;1172:934;;;;;;1378:3;1366:9;1357:7;1353:23;1349:33;1346:2;;;1395:1;1392;1385:12;1346:2;1430:1;1447:62;1501:7;1492:6;1481:9;1477:22;1447:62;;;1437:72;;1409:106;1567:2;1556:9;1552:18;1546:25;1591:18;1583:6;1580:30;1577:2;;;1623:1;1620;1613:12;1577:2;1643:89;1724:7;1715:6;1704:9;1700:22;1643:89;;;1633:99;;1525:213;1769:2;1787:64;1843:7;1834:6;1823:9;1819:22;1787:64;;;1777:74;;1748:109;1888:2;1906:64;1962:7;1953:6;1942:9;1938:22;1906:64;;;1896:74;;1867:109;2007:3;2026:64;2082:7;2073:6;2062:9;2058:22;2026:64;;;2016:74;;1986:110;1340:766;;;;;;;;;2114:384;;2274:67;2338:2;2333:3;2274:67;;;2267:74;;2374:34;2370:1;2365:3;2361:11;2354:55;2443:17;2438:2;2433:3;2429:12;2422:39;2489:2;2484:3;2480:12;2473:19;;2260:238;;;;2507:348;;2685:85;2767:2;2762:3;2685:85;;;2678:92;;2803:14;2799:1;2794:3;2790:11;2783:35;2846:2;2841:3;2837:12;2830:19;;2671:184;;;;2863:372;;3062:148;3206:3;3062:148;;;3055:155;;3227:3;3220:10;;3043:192;;;;3242:407;;3433:2;3422:9;3418:18;3410:26;;3483:9;3477:4;3473:20;3469:1;3458:9;3454:17;3447:47;3508:131;3634:4;3508:131;;;3500:139;;3404:245;;;;3656:256;;3718:2;3712:9;3702:19;;3756:4;3748:6;3744:17;3855:6;3843:10;3840:22;3819:18;3807:10;3804:34;3801:62;3798:2;;;3876:1;3873;3866:12;3798:2;3896:10;3892:2;3885:22;3696:216;;;;;3919:304;;4078:18;4070:6;4067:30;4064:2;;;4110:1;4107;4100:12;4064:2;4145:4;4137:6;4133:17;4125:25;;4208:4;4202;4198:15;4190:23;;4001:222;;;;4231:163;;4346:6;4341:3;4334:19;4383:4;4378:3;4374:14;4359:29;;4327:67;;;;;4403:145;;4539:3;4524:18;;4517:31;;;;;4556:91;;4618:24;4636:5;4618:24;;;4607:35;;4601:46;;;;4654:121;;4727:42;4720:5;4716:54;4705:65;;4699:76;;;;4782:72;;4844:5;4833:16;;4827:27;;;;4861:81;;4932:4;4925:5;4921:16;4910:27;;4904:38;;;;4949:117;5018:24;5036:5;5018:24;;;5011:5;5008:35;4998:2;;5057:1;5054;5047:12;4998:2;4992:74;;5073:117;5142:24;5160:5;5142:24;;;5135:5;5132:35;5122:2;;5181:1;5178;5171:12;5122:2;5116:74;;5197:113;5264:22;5280:5;5264:22;;;5257:5;5254:33;5244:2;;5301:1;5298;5291:12;5244:2;5238:72;;538:18377:0;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "6080604052600436106102305760003560e01c806384db809f1161012e578063beab7131116100ab578063cdb0f73a1161006f578063cdb0f73a14610877578063d547741f146108a0578063d7a9cd79146108c9578063e8437ee7146108f4578063ffaac0eb1461091d57610230565b8063beab713114610790578063c5b37c22146107bb578063c5ec8970146107e6578063ca15c87314610811578063cb10f2151461084e57610230565b8063926d7d7f116100f2578063926d7d7f146106a95780639d5773e0146106d45780639d82dd63146106ff578063a217fddf14610728578063a9cf69fa1461075357610230565b806384db809f146105a05780638c0c2631146105dd5780639010d07c1461060657806391c404ac1461064357806391d148541461066c57610230565b80634b0b919d116101bc5780635e1fab0f116101805780635e1fab0f146104cf578063780cf004146104f85780637febe63f14610521578063802aabe81461055e57806380ae1c281461058957610230565b80634b0b919d146103c15780634e056005146103fe5780635059871914610427578063541d5548146104675780635c975abb146104a457610230565b80632f2ff15d116102035780632f2ff15d146102e057806336568abe146103095780633ee7094a146103325780634454b20d1461036f5780634603ae381461039857610230565b806305e2ca171461023557806317f03ce5146102515780631ff013f11461027a578063248a9ca3146102a3575b600080fd5b61024f600480360381019061024a9190613229565b610934565b005b34801561025d57600080fd5b5061027860048036038101906102739190613295565b610b91565b005b34801561028657600080fd5b506102a1600480360381019061029c91906132e4565b610d3e565b005b3480156102af57600080fd5b506102ca60048036038101906102c5919061306f565b6114bf565b6040516102d79190613df0565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613098565b6114df565b005b34801561031557600080fd5b50610330600480360381019061032b9190613098565b611553565b005b34801561033e57600080fd5b5061035960048036038101906103549190613139565b6115d6565b6040516103669190613f75565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613347565b611693565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190612ffa565b6119d4565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613200565b611a7a565b6040516103f591906142d6565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613110565b611aa1565b005b34801561043357600080fd5b5061044e60048036038101906104499190613175565b611ae0565b60405161045e9493929190613ea2565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190612e43565b611b2a565b60405161049b9190613dd5565b60405180910390f35b3480156104b057600080fd5b506104b9611b50565b6040516104c69190613dd5565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190612e43565b611b66565b005b34801561050457600080fd5b5061051f600480360381019061051a9190612ed1565b611b8b565b005b34801561052d57600080fd5b50610548600480360381019061054391906131b1565b611c0e565b6040516105559190613dd5565b60405180910390f35b34801561056a57600080fd5b50610573611c4a565b60405161058091906142bb565b60405180910390f35b34801561059557600080fd5b5061059e611c50565b005b3480156105ac57600080fd5b506105c760048036038101906105c2919061306f565b611c62565b6040516105d49190613d68565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190612e95565b611c95565b005b34801561061257600080fd5b5061062d600480360381019061062891906130d4565b611d12565b60405161063a9190613d68565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613110565b611d44565b005b34801561067857600080fd5b50610693600480360381019061068e9190613098565b611d9b565b6040516106a09190613dd5565b60405180910390f35b3480156106b557600080fd5b506106be611dcd565b6040516106cb9190613df0565b60405180910390f35b3480156106e057600080fd5b506106e9611de4565b6040516106f691906142bb565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190612e43565b611dea565b005b34801561073457600080fd5b5061073d611ec4565b60405161074a9190613df0565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613295565b611ecb565b6040516107879190614299565b60405180910390f35b34801561079c57600080fd5b506107a56120ac565b6040516107b291906142f1565b60405180910390f35b3480156107c757600080fd5b506107d06120bf565b6040516107dd91906142bb565b60405180910390f35b3480156107f257600080fd5b506107fb6120c5565b60405161080891906142bb565b60405180910390f35b34801561081d57600080fd5b506108386004803603810190610833919061306f565b6120cb565b60405161084591906142bb565b60405180910390f35b34801561085a57600080fd5b5061087560048036038101906108709190612f34565b6120f2565b005b34801561088357600080fd5b5061089e60048036038101906108999190612e43565b6121c4565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613098565b61229e565b005b3480156108d557600080fd5b506108de612312565b6040516108eb91906142bb565b60405180910390f35b34801561090057600080fd5b5061091b60048036038101906109169190612f83565b612318565b005b34801561092957600080fd5b506109326123f0565b005b61093c612402565b6006543414610980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610977906140b9565b60405180910390fd5b60006009600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90614119565b60405180910390fd5b6000600860008760ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508383600a60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008960ff1660ff1681526020019081526020016000209190610ad1929190612b04565b5060008290508073ffffffffffffffffffffffffffffffffffffffff166338995da9878985338a8a6040518763ffffffff1660e01b8152600401610b1a96959493929190613f19565b600060405180830381600087803b158015610b3457600080fd5b505af1158015610b48573d6000803e3d6000fd5b505050508167ffffffffffffffff16868860ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a450505050505050565b610b99612453565b60008360ff1660088467ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600480811115610c0657fe5b8160040160009054906101000a900460ff166004811115610c2357fe5b1415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b906140f9565b60405180910390fd5b600754610c754383600501546124c5565b11610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90614159565b60405180910390fd5b60048160040160006101000a81548160ff02191690836004811115610cd657fe5b0217905550600480811115610ce757fe5b8467ffffffffffffffff168660ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041784600001548560010154604051610d2f929190613e79565b60405180910390a45050505050565b610d4661250f565b610d4e612402565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff166009600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990614259565b60405180910390fd5b60018160040160009054906101000a900460ff166004811115610e7157fe5b1115610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea9906141b9565b60405180910390fd5b600c60008368ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90614059565b60405180910390fd5b60008160040160009054906101000a900460ff166004811115610f9657fe5b14156111b657600560008154600101919050819055506040518060c001604052808581526020018481526020016001604051908082528060200260200182016040528015610ff35781602001602082028036833780820191505090505b50815260200160006040519080825280602002602001820160405280156110295781602001602082028036833780820191505090505b5081526020016001600481111561103c57fe5b815260200143815250600b60008468ffffffffffffffffff1668ffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906110af929190612b84565b5060608201518160030190805190602001906110cc929190612b84565b5060808201518160040160006101000a81548160ff021916908360048111156110f157fe5b021790555060a08201518160050155905050338160020160008154811061111457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481111561116957fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516111a9929190613e79565b60405180910390a46112f9565b6007546111c74383600501546124c5565b111561124c5760048160040160006101000a81548160ff021916908360048111156111ee57fe5b02179055506004808111156111ff57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417878760405161123f929190613e79565b60405180910390a46112f8565b80600101548314611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990614239565b60405180910390fd5b80600201339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b60048081111561130557fe5b8160040160009054906101000a900460ff16600481111561132257fe5b146114b7576001600c60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060040160009054906101000a900460ff1660048111156113d457fe5b8567ffffffffffffffff168760ff167f25f8daaa4635a7729927ba3f5b3d59cc3320aca7c32c9db4e7ca7b9574343640876040516114129190613df0565b60405180910390a460016003541115806114355750600354816002018054905010155b156114b65760028160040160006101000a81548160ff0219169083600481111561145b57fe5b02179055506002600481111561146d57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516114ad929190613e79565b60405180910390a45b5b505050505050565b600060016000838152602001908152602001600020600201549050919050565b611506600160008481526020019081526020016000206002015461150161256d565b611d9b565b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614039565b60405180910390fd5b61154f8282612575565b5050565b61155b61256d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614279565b60405180910390fd5b6115d28282612609565b5050565b600a602052816000526040600020602052806000526040600020600091509150508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561168b5780601f106116605761010080835404028352916020019161168b565b820191906000526020600020905b81548152906001019060200180831161166e57829003601f168201915b505050505081565b61169b61250f565b6116a3612402565b60006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008660ff1660088767ffffffffffffffff1668ffffffffffffffffff16901b179050600082868660405160200161171593929190613d29565b6040516020818303038152906040528051906020012090506000600b60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000600481111561177857fe5b8160040160009054906101000a900460ff16600481111561179557fe5b14156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613fd9565b60405180910390fd5b600260048111156117e357fe5b8160040160009054906101000a900460ff16600481111561180057fe5b14611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613fb9565b60405180910390fd5b80600101548214611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d906140d9565b60405180910390fd5b60038160040160006101000a81548160ff021916908360048111156118a757fe5b02179055506000600960008360000154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e248cff283600001548a8a6040518463ffffffff1660e01b815260040161192993929190613ee7565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050508160040160009054906101000a900460ff16600481111561197857fe5b8967ffffffffffffffff168b60ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417856000015486600101546040516119c0929190613e79565b60405180910390a450505050505050505050565b6119dc61269d565b60008090505b84849050811015611a73578484828181106119f957fe5b9050602002016020810190611a0e9190612e6c565b73ffffffffffffffffffffffffffffffffffffffff166108fc848484818110611a3357fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611a65573d6000803e3d6000fd5b5080806001019150506119e2565b5050505050565b60086020528060005260406000206000915054906101000a900467ffffffffffffffff1681565b611aa961269d565b80600381905550807fa20d6b84cd798a24038be305eff8a45ca82ef54a2aa2082005d8e14c0a4746c860405160405180910390a250565b600b602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060040160009054906101000a900460ff16908060050154905084565b6000611b49604051611b3b90613d53565b604051809103902083611d9b565b9050919050565b60008060009054906101000a900460ff16905090565b611b6e61269d565b611b7b6000801b826114df565b611b886000801b33611553565b50565b611b9361269d565b60008490508073ffffffffffffffffffffffffffffffffffffffff1663d9caed128585856040518463ffffffff1660e01b8152600401611bd593929190613d9e565b600060405180830381600087803b158015611bef57600080fd5b505af1158015611c03573d6000803e3d6000fd5b505050505050505050565b600c602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60045481565b611c5861269d565b611c606126eb565b565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c9d61269d565b60008290508073ffffffffffffffffffffffffffffffffffffffff166307b7ed99836040518263ffffffff1660e01b8152600401611cdb9190613d68565b600060405180830381600087803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b50505050505050565b6000611d3c826001600086815260200190815260200160002060000161274690919063ffffffff16565b905092915050565b611d4c61269d565b806006541415611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8890614219565b60405180910390fd5b8060068190555050565b6000611dc5826001600086815260200190815260200160002060000161276090919063ffffffff16565b905092915050565b604051611dd990613d53565b604051809103902081565b60055481565b611df261269d565b611e0f604051611e0190613d53565b604051809103902082611d9b565b611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590614099565b60405180910390fd5b611e6b604051611e5d90613d53565b60405180910390208261229e565b8073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a26004600081548092919060019003919050555050565b6000801b81565b611ed3612c0e565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b179050600b60008268ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611fd457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f8a575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561206257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612018575b505050505081526020016004820160009054906101000a900460ff16600481111561208957fe5b600481111561209457fe5b81526020016005820154815250509150509392505050565b600260009054906101000a900460ff1681565b60065481565b60075481565b60006120eb60016000848152602001908152602001600020600001612790565b9050919050565b6120fa61269d565b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008390508073ffffffffffffffffffffffffffffffffffffffff1663b8fa373684846040518363ffffffff1660e01b815260040161218c929190613e0b565b600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050505050505050565b6121cc61269d565b6121e96040516121db90613d53565b604051809103902082611d9b565b15612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614199565b60405180910390fd5b61224660405161223890613d53565b6040518091039020826114df565b8073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a260046000815480929190600101919050555050565b6122c560016000848152602001908152602001600020600201546122c061256d565b611d9b565b612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90614139565b60405180910390fd5b61230e8282612609565b5050565b60035481565b61232061269d565b846009600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008590508073ffffffffffffffffffffffffffffffffffffffff1663bba8185a868686866040518563ffffffff1660e01b81526004016123b69493929190613e34565b600060405180830381600087803b1580156123d057600080fd5b505af11580156123e4573d6000803e3d6000fd5b50505050505050505050565b6123f861269d565b6124006127a5565b565b6000809054906101000a900460ff1615612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614179565b60405180910390fd5b565b6124606000801b33611d9b565b80612484575061248360405161247590613d53565b604051809103902033611d9b565b5b6124c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ba90614019565b60405180910390fd5b565b600061250783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612800565b905092915050565b61252c60405161251e90613d53565b604051809103902033611d9b565b61256b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612562906141d9565b60405180910390fd5b565b600033905090565b61259d816001600085815260200190815260200160002060000161285b90919063ffffffff16565b15612605576125aa61256d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612631816001600085815260200190815260200160002060000161288b90919063ffffffff16565b156126995761263e61256d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6126aa6000801b33611d9b565b6126e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e0906141f9565b60405180910390fd5b565b6126f3612402565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161273c9190613d83565b60405180910390a1565b600061275583600001836128bb565b60001c905092915050565b6000612788836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612928565b905092915050565b600061279e8260000161294b565b9050919050565b6127ad61295c565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336040516127f69190613d83565b60405180910390a1565b6000838311158290612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f9190613f97565b60405180910390fd5b5060008385039050809150509392505050565b6000612883836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129ac565b905092915050565b60006128b3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612a1c565b905092915050565b600081836000018054905011612906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fd90613ff9565b60405180910390fd5b82600001828154811061291557fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000809054906101000a900460ff166129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190614079565b60405180910390fd5b565b60006129b88383612928565b612a11578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612a16565b600090505b92915050565b60008083600101600084815260200190815260200160002054905060008114612af85760006001820390506000600186600001805490500390506000866000018281548110612a6757fe5b9060005260206000200154905080876000018481548110612a8457fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612abc57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612afe565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612b4557803560ff1916838001178555612b73565b82800160010185558215612b73579182015b82811115612b72578235825591602001919060010190612b57565b5b509050612b809190612c55565b5090565b828054828255906000526020600020908101928215612bfd579160200282015b82811115612bfc5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612ba4565b5b509050612c0a9190612c7a565b5090565b6040518060c001604052806000801916815260200160008019168152602001606081526020016060815260200160006004811115612c4857fe5b8152602001600081525090565b612c7791905b80821115612c73576000816000905550600101612c5b565b5090565b90565b612cba91905b80821115612cb657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101612c80565b5090565b90565b600081359050612ccc81614545565b92915050565b600081359050612ce18161455c565b92915050565b60008083601f840112612cf957600080fd5b8235905067ffffffffffffffff811115612d1257600080fd5b602083019150836020820283011115612d2a57600080fd5b9250929050565b60008083601f840112612d4357600080fd5b8235905067ffffffffffffffff811115612d5c57600080fd5b602083019150836020820283011115612d7457600080fd5b9250929050565b600081359050612d8a81614573565b92915050565b600081359050612d9f8161458a565b92915050565b60008083601f840112612db757600080fd5b8235905067ffffffffffffffff811115612dd057600080fd5b602083019150836001820283011115612de857600080fd5b9250929050565b600081359050612dfe816145a1565b92915050565b600081359050612e13816145b8565b92915050565b600081359050612e28816145cf565b92915050565b600081359050612e3d816145e6565b92915050565b600060208284031215612e5557600080fd5b6000612e6384828501612cbd565b91505092915050565b600060208284031215612e7e57600080fd5b6000612e8c84828501612cd2565b91505092915050565b60008060408385031215612ea857600080fd5b6000612eb685828601612cbd565b9250506020612ec785828601612cbd565b9150509250929050565b60008060008060808587031215612ee757600080fd5b6000612ef587828801612cbd565b9450506020612f0687828801612cbd565b9350506040612f1787828801612cbd565b9250506060612f2887828801612def565b91505092959194509250565b600080600060608486031215612f4957600080fd5b6000612f5786828701612cbd565b9350506020612f6886828701612d7b565b9250506040612f7986828701612cbd565b9150509250925092565b600080600080600060a08688031215612f9b57600080fd5b6000612fa988828901612cbd565b9550506020612fba88828901612d7b565b9450506040612fcb88828901612cbd565b9350506060612fdc88828901612d90565b9250506080612fed88828901612d90565b9150509295509295909350565b6000806000806040858703121561301057600080fd5b600085013567ffffffffffffffff81111561302a57600080fd5b61303687828801612ce7565b9450945050602085013567ffffffffffffffff81111561305557600080fd5b61306187828801612d31565b925092505092959194509250565b60006020828403121561308157600080fd5b600061308f84828501612d7b565b91505092915050565b600080604083850312156130ab57600080fd5b60006130b985828601612d7b565b92505060206130ca85828601612cbd565b9150509250929050565b600080604083850312156130e757600080fd5b60006130f585828601612d7b565b925050602061310685828601612def565b9150509250929050565b60006020828403121561312257600080fd5b600061313084828501612def565b91505092915050565b6000806040838503121561314c57600080fd5b600061315a85828601612e04565b925050602061316b85828601612e2e565b9150509250929050565b6000806040838503121561318857600080fd5b600061319685828601612e19565b92505060206131a785828601612d7b565b9150509250929050565b6000806000606084860312156131c657600080fd5b60006131d486828701612e19565b93505060206131e586828701612d7b565b92505060406131f686828701612cbd565b9150509250925092565b60006020828403121561321257600080fd5b600061322084828501612e2e565b91505092915050565b6000806000806060858703121561323f57600080fd5b600061324d87828801612e2e565b945050602061325e87828801612d7b565b935050604085013567ffffffffffffffff81111561327b57600080fd5b61328787828801612da5565b925092505092959194509250565b6000806000606084860312156132aa57600080fd5b60006132b886828701612e2e565b93505060206132c986828701612e04565b92505060406132da86828701612d7b565b9150509250925092565b600080600080608085870312156132fa57600080fd5b600061330887828801612e2e565b945050602061331987828801612e04565b935050604061332a87828801612d7b565b925050606061333b87828801612d7b565b91505092959194509250565b60008060008060006080868803121561335f57600080fd5b600061336d88828901612e2e565b955050602061337e88828901612e04565b945050604086013567ffffffffffffffff81111561339b57600080fd5b6133a788828901612da5565b935093505060606133ba88828901612d7b565b9150509295509295909350565b60006133d383836133ee565b60208301905092915050565b6133e88161446c565b82525050565b6133f781614393565b82525050565b61340681614393565b82525050565b61341d61341882614393565b6144f6565b82525050565b600061342e8261431c565b613438818561434a565b93506134438361430c565b8060005b8381101561347457815161345b88826133c7565b97506134668361433d565b925050600181019050613447565b5085935050505092915050565b61348a816143b7565b82525050565b613499816143c3565b82525050565b6134a8816143c3565b82525050565b6134b7816143cd565b82525050565b60006134c9838561435b565b93506134d68385846144b4565b6134df8361451a565b840190509392505050565b60006134f6838561436c565b93506135038385846144b4565b82840190509392505050565b600061351a82614327565b613524818561435b565b93506135348185602086016144c3565b61353d8161451a565b840191505092915050565b6135518161447e565b82525050565b6135608161447e565b82525050565b600061357182614332565b61357b8185614377565b935061358b8185602086016144c3565b6135948161451a565b840191505092915050565b60006135ac601c83614377565b91507f70726f706f73616c20616c7265616479207472616e73666572726564000000006000830152602082019050919050565b60006135ec601683614377565b91507f70726f706f73616c206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061362c602283614377565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613692601e83614377565b91507f73656e646572206973206e6f742072656c61796572206f722061646d696e00006000830152602082019050919050565b60006136d2602f83614377565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b6000613738601583614377565b91507f72656c6179657220616c726561647920766f74656400000000000000000000006000830152602082019050919050565b6000613778601483614377565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006137b8601f83614377565b91507f6164647220646f65736e277420686176652072656c6179657220726f6c6521006000830152602082019050919050565b60006137f8601683614377565b91507f496e636f72726563742066656520737570706c696564000000000000000000006000830152602082019050919050565b6000613838601b83614377565b91507f6461746120646f65736e2774206d6174636820646174616861736800000000006000830152602082019050919050565b6000613878601a83614377565b91507f50726f706f73616c20616c72656164792063616e63656c6c65640000000000006000830152602082019050919050565b60006138b8602083614377565b91507f7265736f757263654944206e6f74206d617070656420746f2068616e646c65726000830152602082019050919050565b60006138f8603083614377565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f207265766f6b65000000000000000000000000000000006020830152604082019050919050565b600061395e602083614377565b91507f50726f706f73616c206e6f7420617420657870697279207468726573686f6c646000830152602082019050919050565b600061399e601083614377565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006139de601e83614377565b91507f6164647220616c7265616479206861732072656c6179657220726f6c652100006000830152602082019050919050565b6000613a1e602a83614377565b91507f70726f706f73616c20616c7265616479207061737365642f657865637574656460008301527f2f63616e63656c6c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a84602083614377565b91507f73656e64657220646f65736e277420686176652072656c6179657220726f6c656000830152602082019050919050565b6000613ac4601e83614377565b91507f73656e64657220646f65736e277420686176652061646d696e20726f6c6500006000830152602082019050919050565b6000613b04601f83614377565b91507f43757272656e742066656520697320657175616c20746f206e657720666565006000830152602082019050919050565b6000613b44600c83614388565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b6000613b84601183614377565b91507f6461746168617368206d69736d617463680000000000000000000000000000006000830152602082019050919050565b6000613bc4601983614377565b91507f6e6f2068616e646c657220666f72207265736f757263654944000000000000006000830152602082019050919050565b6000613c04602f83614377565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b600060c083016000830151613c756000860182613490565b506020830151613c886020860182613490565b5060408301518482036040860152613ca08282613423565b91505060608301518482036060860152613cba8282613423565b9150506080830151613ccf6080860182613548565b5060a0830151613ce260a0860182613ced565b508091505092915050565b613cf68161442c565b82525050565b613d058161442c565b82525050565b613d1481614436565b82525050565b613d238161445f565b82525050565b6000613d35828661340c565b601482019150613d468284866134ea565b9150819050949350505050565b6000613d5e82613b37565b9150819050919050565b6000602082019050613d7d60008301846133fd565b92915050565b6000602082019050613d9860008301846133df565b92915050565b6000606082019050613db360008301866133fd565b613dc060208301856133fd565b613dcd6040830184613cfc565b949350505050565b6000602082019050613dea6000830184613481565b92915050565b6000602082019050613e05600083018461349f565b92915050565b6000604082019050613e20600083018561349f565b613e2d60208301846133fd565b9392505050565b6000608082019050613e49600083018761349f565b613e5660208301866133fd565b613e6360408301856134ae565b613e7060608301846134ae565b95945050505050565b6000604082019050613e8e600083018561349f565b613e9b602083018461349f565b9392505050565b6000608082019050613eb7600083018761349f565b613ec4602083018661349f565b613ed16040830185613557565b613ede6060830184613cfc565b95945050505050565b6000604082019050613efc600083018661349f565b8181036020830152613f0f8184866134bd565b9050949350505050565b600060a082019050613f2e600083018961349f565b613f3b6020830188613d1a565b613f486040830187613d0b565b613f5560608301866133df565b8181036080830152613f688184866134bd565b9050979650505050505050565b60006020820190508181036000830152613f8f818461350f565b905092915050565b60006020820190508181036000830152613fb18184613566565b905092915050565b60006020820190508181036000830152613fd28161359f565b9050919050565b60006020820190508181036000830152613ff2816135df565b9050919050565b600060208201905081810360008301526140128161361f565b9050919050565b6000602082019050818103600083015261403281613685565b9050919050565b60006020820190508181036000830152614052816136c5565b9050919050565b600060208201905081810360008301526140728161372b565b9050919050565b600060208201905081810360008301526140928161376b565b9050919050565b600060208201905081810360008301526140b2816137ab565b9050919050565b600060208201905081810360008301526140d2816137eb565b9050919050565b600060208201905081810360008301526140f28161382b565b9050919050565b600060208201905081810360008301526141128161386b565b9050919050565b60006020820190508181036000830152614132816138ab565b9050919050565b60006020820190508181036000830152614152816138eb565b9050919050565b6000602082019050818103600083015261417281613951565b9050919050565b6000602082019050818103600083015261419281613991565b9050919050565b600060208201905081810360008301526141b2816139d1565b9050919050565b600060208201905081810360008301526141d281613a11565b9050919050565b600060208201905081810360008301526141f281613a77565b9050919050565b6000602082019050818103600083015261421281613ab7565b9050919050565b6000602082019050818103600083015261423281613af7565b9050919050565b6000602082019050818103600083015261425281613b77565b9050919050565b6000602082019050818103600083015261427281613bb7565b9050919050565b6000602082019050818103600083015261429281613bf7565b9050919050565b600060208201905081810360008301526142b38184613c5d565b905092915050565b60006020820190506142d06000830184613cfc565b92915050565b60006020820190506142eb6000830184613d0b565b92915050565b60006020820190506143066000830184613d1a565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061439e8261440c565b9050919050565b60006143b08261440c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061440782614538565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b600061447782614490565b9050919050565b6000614489826143f9565b9050919050565b600061449b826144a2565b9050919050565b60006144ad8261440c565b9050919050565b82818337600083830152505050565b60005b838110156144e15780820151818401526020810190506144c6565b838111156144f0576000848401525b50505050565b600061450182614508565b9050919050565b60006145138261452b565b9050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6005811061454257fe5b50565b61454e81614393565b811461455957600080fd5b50565b614565816143a5565b811461457057600080fd5b50565b61457c816143c3565b811461458757600080fd5b50565b614593816143cd565b811461459e57600080fd5b50565b6145aa8161442c565b81146145b557600080fd5b50565b6145c181614436565b81146145cc57600080fd5b50565b6145d88161444a565b81146145e357600080fd5b50565b6145ef8161445f565b81146145fa57600080fd5b5056fea2646970667358221220516009222e13732fb2b271e05e189ee935c032eef285667f0c5e2a89242ceb7764736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x230 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x84DB809F GT PUSH2 0x12E JUMPI DUP1 PUSH4 0xBEAB7131 GT PUSH2 0xAB JUMPI DUP1 PUSH4 0xCDB0F73A GT PUSH2 0x6F JUMPI DUP1 PUSH4 0xCDB0F73A EQ PUSH2 0x877 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8A0 JUMPI DUP1 PUSH4 0xD7A9CD79 EQ PUSH2 0x8C9 JUMPI DUP1 PUSH4 0xE8437EE7 EQ PUSH2 0x8F4 JUMPI DUP1 PUSH4 0xFFAAC0EB EQ PUSH2 0x91D JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0xBEAB7131 EQ PUSH2 0x790 JUMPI DUP1 PUSH4 0xC5B37C22 EQ PUSH2 0x7BB JUMPI DUP1 PUSH4 0xC5EC8970 EQ PUSH2 0x7E6 JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x811 JUMPI DUP1 PUSH4 0xCB10F215 EQ PUSH2 0x84E JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x926D7D7F GT PUSH2 0xF2 JUMPI DUP1 PUSH4 0x926D7D7F EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0x9D5773E0 EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x9D82DD63 EQ PUSH2 0x6FF JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x728 JUMPI DUP1 PUSH4 0xA9CF69FA EQ PUSH2 0x753 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x84DB809F EQ PUSH2 0x5A0 JUMPI DUP1 PUSH4 0x8C0C2631 EQ PUSH2 0x5DD JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x606 JUMPI DUP1 PUSH4 0x91C404AC EQ PUSH2 0x643 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x66C JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x4B0B919D GT PUSH2 0x1BC JUMPI DUP1 PUSH4 0x5E1FAB0F GT PUSH2 0x180 JUMPI DUP1 PUSH4 0x5E1FAB0F EQ PUSH2 0x4CF JUMPI DUP1 PUSH4 0x780CF004 EQ PUSH2 0x4F8 JUMPI DUP1 PUSH4 0x7FEBE63F EQ PUSH2 0x521 JUMPI DUP1 PUSH4 0x802AABE8 EQ PUSH2 0x55E JUMPI DUP1 PUSH4 0x80AE1C28 EQ PUSH2 0x589 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x4B0B919D EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0x4E056005 EQ PUSH2 0x3FE JUMPI DUP1 PUSH4 0x50598719 EQ PUSH2 0x427 JUMPI DUP1 PUSH4 0x541D5548 EQ PUSH2 0x467 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x4A4 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x2F2FF15D GT PUSH2 0x203 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2E0 JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x309 JUMPI DUP1 PUSH4 0x3EE7094A EQ PUSH2 0x332 JUMPI DUP1 PUSH4 0x4454B20D EQ PUSH2 0x36F JUMPI DUP1 PUSH4 0x4603AE38 EQ PUSH2 0x398 JUMPI PUSH2 0x230 JUMP JUMPDEST DUP1 PUSH4 0x5E2CA17 EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0x17F03CE5 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x1FF013F1 EQ PUSH2 0x27A JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x2A3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x24A SWAP2 SWAP1 PUSH2 0x3229 JUMP JUMPDEST PUSH2 0x934 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x278 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x273 SWAP2 SWAP1 PUSH2 0x3295 JUMP JUMPDEST PUSH2 0xB91 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x286 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x29C SWAP2 SWAP1 PUSH2 0x32E4 JUMP JUMPDEST PUSH2 0xD3E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2CA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x2C5 SWAP2 SWAP1 PUSH2 0x306F JUMP JUMPDEST PUSH2 0x14BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2D7 SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x302 SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x14DF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x330 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x32B SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x1553 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x359 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x354 SWAP2 SWAP1 PUSH2 0x3139 JUMP JUMPDEST PUSH2 0x15D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x366 SWAP2 SWAP1 PUSH2 0x3F75 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x396 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x391 SWAP2 SWAP1 PUSH2 0x3347 JUMP JUMPDEST PUSH2 0x1693 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x3BA SWAP2 SWAP1 PUSH2 0x2FFA JUMP JUMPDEST PUSH2 0x19D4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x3E3 SWAP2 SWAP1 PUSH2 0x3200 JUMP JUMPDEST PUSH2 0x1A7A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3F5 SWAP2 SWAP1 PUSH2 0x42D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x40A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x425 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x420 SWAP2 SWAP1 PUSH2 0x3110 JUMP JUMPDEST PUSH2 0x1AA1 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x433 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x44E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x449 SWAP2 SWAP1 PUSH2 0x3175 JUMP JUMPDEST PUSH2 0x1AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x45E SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3EA2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x489 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x1B2A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x49B SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B9 PUSH2 0x1B50 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x4C6 SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4F6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F1 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x1B66 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x51F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x51A SWAP2 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0x1B8B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x548 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x543 SWAP2 SWAP1 PUSH2 0x31B1 JUMP JUMPDEST PUSH2 0x1C0E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x555 SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x573 PUSH2 0x1C4A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x580 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x595 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59E PUSH2 0x1C50 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5C7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x5C2 SWAP2 SWAP1 PUSH2 0x306F JUMP JUMPDEST PUSH2 0x1C62 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5D4 SWAP2 SWAP1 PUSH2 0x3D68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x604 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x5FF SWAP2 SWAP1 PUSH2 0x2E95 JUMP JUMPDEST PUSH2 0x1C95 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x612 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x62D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x628 SWAP2 SWAP1 PUSH2 0x30D4 JUMP JUMPDEST PUSH2 0x1D12 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x63A SWAP2 SWAP1 PUSH2 0x3D68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x64F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x66A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x665 SWAP2 SWAP1 PUSH2 0x3110 JUMP JUMPDEST PUSH2 0x1D44 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x678 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x693 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x68E SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x1D9B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6A0 SWAP2 SWAP1 PUSH2 0x3DD5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6BE PUSH2 0x1DCD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6CB SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6E9 PUSH2 0x1DE4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6F6 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x70B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x726 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x721 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x1DEA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x734 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x73D PUSH2 0x1EC4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x74A SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x75F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x77A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x775 SWAP2 SWAP1 PUSH2 0x3295 JUMP JUMPDEST PUSH2 0x1ECB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x4299 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x79C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7A5 PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7B2 SWAP2 SWAP1 PUSH2 0x42F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7D0 PUSH2 0x20BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7DD SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7FB PUSH2 0x20C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x808 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x81D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x838 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x833 SWAP2 SWAP1 PUSH2 0x306F JUMP JUMPDEST PUSH2 0x20CB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x845 SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x85A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x875 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x870 SWAP2 SWAP1 PUSH2 0x2F34 JUMP JUMPDEST PUSH2 0x20F2 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x883 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x89E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x899 SWAP2 SWAP1 PUSH2 0x2E43 JUMP JUMPDEST PUSH2 0x21C4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x8C2 SWAP2 SWAP1 PUSH2 0x3098 JUMP JUMPDEST PUSH2 0x229E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8DE PUSH2 0x2312 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8EB SWAP2 SWAP1 PUSH2 0x42BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x900 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x91B PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x916 SWAP2 SWAP1 PUSH2 0x2F83 JUMP JUMPDEST PUSH2 0x2318 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x929 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x932 PUSH2 0x23F0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x93C PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x6 SLOAD CALLVALUE EQ PUSH2 0x980 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x977 SWAP1 PUSH2 0x40B9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA28 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA1F SWAP1 PUSH2 0x4119 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x8 PUSH1 0x0 DUP8 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP2 DUP2 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 ADD SWAP2 SWAP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH8 0xFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE SWAP1 POP DUP4 DUP4 PUSH1 0xA PUSH1 0x0 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP10 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 SWAP1 PUSH2 0xAD1 SWAP3 SWAP2 SWAP1 PUSH2 0x2B04 JUMP JUMPDEST POP PUSH1 0x0 DUP3 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x38995DA9 DUP8 DUP10 DUP6 CALLER DUP11 DUP11 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB1A SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3F19 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB48 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP7 DUP9 PUSH1 0xFF AND PUSH32 0xDBB69440DF8433824A026EF190652F29929EB64B4D1D5D2A69BE8AFE3E6EAED8 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB99 PUSH2 0x2453 JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0xFF AND PUSH1 0x8 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0x0 PUSH1 0xB PUSH1 0x0 DUP4 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0xC06 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xC23 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC64 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC5B SWAP1 PUSH2 0x40F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x7 SLOAD PUSH2 0xC75 NUMBER DUP4 PUSH1 0x5 ADD SLOAD PUSH2 0x24C5 JUMP JUMPDEST GT PUSH2 0xCB5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCAC SWAP1 PUSH2 0x4159 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xCD6 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0xCE7 JUMPI INVALID JUMPDEST DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP5 PUSH1 0x0 ADD SLOAD DUP6 PUSH1 0x1 ADD SLOAD PUSH1 0x40 MLOAD PUSH2 0xD2F SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xD46 PUSH2 0x250F JUMP JUMPDEST PUSH2 0xD4E PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0xFF AND PUSH1 0x8 DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0x0 PUSH1 0xB PUSH1 0x0 DUP4 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x9 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE49 SWAP1 PUSH2 0x4259 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xE71 JUMPI INVALID JUMPDEST GT ISZERO PUSH2 0xEB2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xEA9 SWAP1 PUSH2 0x41B9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xC PUSH1 0x0 DUP4 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xF77 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF6E SWAP1 PUSH2 0x4059 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xF96 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x11B6 JUMPI PUSH1 0x5 PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 ADD SWAP2 SWAP1 POP DUP2 SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xFF3 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1029 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x103C JUMPI INVALID JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD NUMBER DUP2 MSTORE POP PUSH1 0xB PUSH1 0x0 DUP5 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD SSTORE PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x10AF SWAP3 SWAP2 SWAP1 PUSH2 0x2B84 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x10CC SWAP3 SWAP2 SWAP1 PUSH2 0x2B84 JUMP JUMPDEST POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x10F1 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE SWAP1 POP POP CALLER DUP2 PUSH1 0x2 ADD PUSH1 0x0 DUP2 SLOAD DUP2 LT PUSH2 0x1114 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1169 JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x11A9 SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH2 0x12F9 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH2 0x11C7 NUMBER DUP4 PUSH1 0x5 ADD SLOAD PUSH2 0x24C5 JUMP JUMPDEST GT ISZERO PUSH2 0x124C JUMPI PUSH1 0x4 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x11EE JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0x11FF JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x123F SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH2 0x12F8 JUMP JUMPDEST DUP1 PUSH1 0x1 ADD SLOAD DUP4 EQ PUSH2 0x1292 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1289 SWAP1 PUSH2 0x4239 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x2 ADD CALLER SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST JUMPDEST PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0x1305 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1322 JUMPI INVALID JUMPDEST EQ PUSH2 0x14B7 JUMPI PUSH1 0x1 PUSH1 0xC PUSH1 0x0 DUP5 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x13D4 JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x25F8DAAA4635A7729927BA3F5B3D59CC3320ACA7C32C9DB4E7CA7B9574343640 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1412 SWAP2 SWAP1 PUSH2 0x3DF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH1 0x1 PUSH1 0x3 SLOAD GT ISZERO DUP1 PUSH2 0x1435 JUMPI POP PUSH1 0x3 SLOAD DUP2 PUSH1 0x2 ADD DUP1 SLOAD SWAP1 POP LT ISZERO JUMPDEST ISZERO PUSH2 0x14B6 JUMPI PUSH1 0x2 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x145B JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x146D JUMPI INVALID JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x14AD SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1506 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH2 0x1501 PUSH2 0x256D JUMP JUMPDEST PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x1545 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x153C SWAP1 PUSH2 0x4039 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x154F DUP3 DUP3 PUSH2 0x2575 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x155B PUSH2 0x256D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x15C8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15BF SWAP1 PUSH2 0x4279 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x15D2 DUP3 DUP3 PUSH2 0x2609 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x168B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1660 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x168B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x166E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x169B PUSH2 0x250F JUMP JUMPDEST PUSH2 0x16A3 PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x9 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x0 DUP7 PUSH1 0xFF AND PUSH1 0x8 DUP8 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0x0 DUP3 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1715 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3D29 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0xB PUSH1 0x0 DUP5 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1778 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1795 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17D6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17CD SWAP1 PUSH2 0x3FD9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x17E3 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1800 JUMPI INVALID JUMPDEST EQ PUSH2 0x1840 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1837 SWAP1 PUSH2 0x3FB9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 ADD SLOAD DUP3 EQ PUSH2 0x1886 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x187D SWAP1 PUSH2 0x40D9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x18A7 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x9 PUSH1 0x0 DUP4 PUSH1 0x0 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xE248CFF2 DUP4 PUSH1 0x0 ADD SLOAD DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1929 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3EE7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1943 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1957 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1978 JUMPI INVALID JUMPDEST DUP10 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0xFF AND PUSH32 0x803C5A12F6BDE629CEA32E63D4B92D1B560816A6FB72E939D3C89E1CAB650417 DUP6 PUSH1 0x0 ADD SLOAD DUP7 PUSH1 0x1 ADD SLOAD PUSH1 0x40 MLOAD PUSH2 0x19C0 SWAP3 SWAP2 SWAP1 PUSH2 0x3E79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x19DC PUSH2 0x269D JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP5 DUP5 SWAP1 POP DUP2 LT ISZERO PUSH2 0x1A73 JUMPI DUP5 DUP5 DUP3 DUP2 DUP2 LT PUSH2 0x19F9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x1A0E SWAP2 SWAP1 PUSH2 0x2E6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1A33 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1A65 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x19E2 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1AA9 PUSH2 0x269D JUMP JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP DUP1 PUSH32 0xA20D6B84CD798A24038BE305EFF8A45CA82EF54A2AA2082005D8E14C0A4746C8 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 PUSH1 0x0 ADD SLOAD SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x5 ADD SLOAD SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B49 PUSH1 0x40 MLOAD PUSH2 0x1B3B SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP4 PUSH2 0x1D9B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1B6E PUSH2 0x269D JUMP JUMPDEST PUSH2 0x1B7B PUSH1 0x0 DUP1 SHL DUP3 PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x1B88 PUSH1 0x0 DUP1 SHL CALLER PUSH2 0x1553 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x1B93 PUSH2 0x269D JUMP JUMPDEST PUSH1 0x0 DUP5 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD9CAED12 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BD5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0xC PUSH1 0x20 MSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP3 POP SWAP3 POP POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1C58 PUSH2 0x269D JUMP JUMPDEST PUSH2 0x1C60 PUSH2 0x26EB JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1C9D PUSH2 0x269D JUMP JUMPDEST PUSH1 0x0 DUP3 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x7B7ED99 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1CDB SWAP2 SWAP1 PUSH2 0x3D68 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1CF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D09 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D3C DUP3 PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x2746 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1D4C PUSH2 0x269D JUMP JUMPDEST DUP1 PUSH1 0x6 SLOAD EQ ISZERO PUSH2 0x1D91 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D88 SWAP1 PUSH2 0x4219 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1DC5 DUP3 PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x2760 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DD9 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1DF2 PUSH2 0x269D JUMP JUMPDEST PUSH2 0x1E0F PUSH1 0x40 MLOAD PUSH2 0x1E01 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x1E4E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E45 SWAP1 PUSH2 0x4099 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1E6B PUSH1 0x40 MLOAD PUSH2 0x1E5D SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x229E JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x10E1F7CE9FD7D1B90A66D13A2AB3CB8DD7F29F3F8D520B143B063CCFBAB6906B PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x4 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 SWAP1 SUB SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SHL DUP2 JUMP JUMPDEST PUSH2 0x1ED3 PUSH2 0x2C0E JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0xFF AND PUSH1 0x8 DUP6 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND SWAP1 SHL OR SWAP1 POP PUSH1 0xB PUSH1 0x0 DUP3 PUSH9 0xFFFFFFFFFFFFFFFFFF AND PUSH9 0xFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1FD4 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1F8A JUMPI JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2062 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x2018 JUMPI JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2089 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2094 JUMPI INVALID JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x5 DUP3 ADD SLOAD DUP2 MSTORE POP POP SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20EB PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x2790 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x20FA PUSH2 0x269D JUMP JUMPDEST DUP3 PUSH1 0x9 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP4 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xB8FA3736 DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x218C SWAP3 SWAP2 SWAP1 PUSH2 0x3E0B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x21CC PUSH2 0x269D JUMP JUMPDEST PUSH2 0x21E9 PUSH1 0x40 MLOAD PUSH2 0x21DB SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x1D9B JUMP JUMPDEST ISZERO PUSH2 0x2229 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2220 SWAP1 PUSH2 0x4199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2246 PUSH1 0x40 MLOAD PUSH2 0x2238 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP3 PUSH2 0x14DF JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x3580EE9F53A62B7CB409A2CB56F9BE87747DD15017AFC5CEF6EEF321E4FB2C5 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x4 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP POP JUMP JUMPDEST PUSH2 0x22C5 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH2 0x22C0 PUSH2 0x256D JUMP JUMPDEST PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x2304 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22FB SWAP1 PUSH2 0x4139 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x230E DUP3 DUP3 PUSH2 0x2609 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2320 PUSH2 0x269D JUMP JUMPDEST DUP5 PUSH1 0x9 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP6 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xBBA8185A DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23B6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3E34 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x23D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x23E4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x23F8 PUSH2 0x269D JUMP JUMPDEST PUSH2 0x2400 PUSH2 0x27A5 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x2451 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2448 SWAP1 PUSH2 0x4179 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH2 0x2460 PUSH1 0x0 DUP1 SHL CALLER PUSH2 0x1D9B JUMP JUMPDEST DUP1 PUSH2 0x2484 JUMPI POP PUSH2 0x2483 PUSH1 0x40 MLOAD PUSH2 0x2475 SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 CALLER PUSH2 0x1D9B JUMP JUMPDEST JUMPDEST PUSH2 0x24C3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24BA SWAP1 PUSH2 0x4019 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2507 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 DUP2 MSTORE POP PUSH2 0x2800 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x252C PUSH1 0x40 MLOAD PUSH2 0x251E SWAP1 PUSH2 0x3D53 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 CALLER PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x256B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2562 SWAP1 PUSH2 0x41D9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x259D DUP2 PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x285B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST ISZERO PUSH2 0x2605 JUMPI PUSH2 0x25AA PUSH2 0x256D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x2631 DUP2 PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH2 0x288B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST ISZERO PUSH2 0x2699 JUMPI PUSH2 0x263E PUSH2 0x256D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x26AA PUSH1 0x0 DUP1 SHL CALLER PUSH2 0x1D9B JUMP JUMPDEST PUSH2 0x26E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x26E0 SWAP1 PUSH2 0x41F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH2 0x26F3 PUSH2 0x2402 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 CALLER PUSH1 0x40 MLOAD PUSH2 0x273C SWAP2 SWAP1 PUSH2 0x3D83 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2755 DUP4 PUSH1 0x0 ADD DUP4 PUSH2 0x28BB JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2788 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH2 0x2928 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x279E DUP3 PUSH1 0x0 ADD PUSH2 0x294B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x27AD PUSH2 0x295C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA CALLER PUSH1 0x40 MLOAD PUSH2 0x27F6 SWAP2 SWAP1 PUSH2 0x3D83 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 GT ISZERO DUP3 SWAP1 PUSH2 0x2848 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x283F SWAP2 SWAP1 PUSH2 0x3F97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 SUB SWAP1 POP DUP1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2883 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH2 0x29AC JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B3 DUP4 PUSH1 0x0 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SHL PUSH2 0x2A1C JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP GT PUSH2 0x2906 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x28FD SWAP1 PUSH2 0x3FF9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2915 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x29AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x29A1 SWAP1 PUSH2 0x4079 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29B8 DUP4 DUP4 PUSH2 0x2928 JUMP JUMPDEST PUSH2 0x2A11 JUMPI DUP3 PUSH1 0x0 ADD DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE DUP3 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 SWAP1 POP PUSH2 0x2A16 JUMP JUMPDEST PUSH1 0x0 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x0 DUP2 EQ PUSH2 0x2AF8 JUMPI PUSH1 0x0 PUSH1 0x1 DUP3 SUB SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP7 PUSH1 0x0 ADD DUP1 SLOAD SWAP1 POP SUB SWAP1 POP PUSH1 0x0 DUP7 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2A67 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x2A84 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x1 DUP4 ADD DUP8 PUSH1 0x1 ADD PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP7 PUSH1 0x0 ADD DUP1 SLOAD DUP1 PUSH2 0x2ABC JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2B45 JUMPI DUP1 CALLDATALOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2B73 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2B73 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2B72 JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2B57 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2B80 SWAP2 SWAP1 PUSH2 0x2C55 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x2BFD JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2BFC JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2BA4 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2C0A SWAP2 SWAP1 PUSH2 0x2C7A JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2C48 JUMPI INVALID JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2C77 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2C73 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x2C5B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CBA SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2CB6 JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x2C80 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2CCC DUP2 PUSH2 0x4545 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2CE1 DUP2 PUSH2 0x455C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2CF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2D12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x2D2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2D43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2D5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x2D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2D8A DUP2 PUSH2 0x4573 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2D9F DUP2 PUSH2 0x458A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2DB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2DD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x2DE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2DFE DUP2 PUSH2 0x45A1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2E13 DUP2 PUSH2 0x45B8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2E28 DUP2 PUSH2 0x45CF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x2E3D DUP2 PUSH2 0x45E6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E63 DUP5 DUP3 DUP6 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E8C DUP5 DUP3 DUP6 ADD PUSH2 0x2CD2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2EA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2EB6 DUP6 DUP3 DUP7 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2EC7 DUP6 DUP3 DUP7 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2EE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2EF5 DUP8 DUP3 DUP9 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x2F06 DUP8 DUP3 DUP9 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x2F17 DUP8 DUP3 DUP9 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x2F28 DUP8 DUP3 DUP9 ADD PUSH2 0x2DEF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2F49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2F57 DUP7 DUP3 DUP8 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2F68 DUP7 DUP3 DUP8 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x2F79 DUP7 DUP3 DUP8 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x2F9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2FA9 DUP9 DUP3 DUP10 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x2FBA DUP9 DUP3 DUP10 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x2FCB DUP9 DUP3 DUP10 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x2FDC DUP9 DUP3 DUP10 ADD PUSH2 0x2D90 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x2FED DUP9 DUP3 DUP10 ADD PUSH2 0x2D90 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3010 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x302A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3036 DUP8 DUP3 DUP9 ADD PUSH2 0x2CE7 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3055 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3061 DUP8 DUP3 DUP9 ADD PUSH2 0x2D31 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3081 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x308F DUP5 DUP3 DUP6 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x30AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x30B9 DUP6 DUP3 DUP7 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x30CA DUP6 DUP3 DUP7 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x30E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x30F5 DUP6 DUP3 DUP7 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3106 DUP6 DUP3 DUP7 ADD PUSH2 0x2DEF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3130 DUP5 DUP3 DUP6 ADD PUSH2 0x2DEF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x314C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x315A DUP6 DUP3 DUP7 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x316B DUP6 DUP3 DUP7 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3196 DUP6 DUP3 DUP7 ADD PUSH2 0x2E19 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x31A7 DUP6 DUP3 DUP7 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x31C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31D4 DUP7 DUP3 DUP8 ADD PUSH2 0x2E19 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x31E5 DUP7 DUP3 DUP8 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x31F6 DUP7 DUP3 DUP8 ADD PUSH2 0x2CBD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3212 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3220 DUP5 DUP3 DUP6 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x323F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x324D DUP8 DUP3 DUP9 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x325E DUP8 DUP3 DUP9 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x327B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3287 DUP8 DUP3 DUP9 ADD PUSH2 0x2DA5 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x32AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x32B8 DUP7 DUP3 DUP8 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x32C9 DUP7 DUP3 DUP8 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x32DA DUP7 DUP3 DUP8 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x32FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3308 DUP8 DUP3 DUP9 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3319 DUP8 DUP3 DUP9 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x332A DUP8 DUP3 DUP9 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x333B DUP8 DUP3 DUP9 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x335F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x336D DUP9 DUP3 DUP10 ADD PUSH2 0x2E2E JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x337E DUP9 DUP3 DUP10 ADD PUSH2 0x2E04 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x339B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x33A7 DUP9 DUP3 DUP10 ADD PUSH2 0x2DA5 JUMP JUMPDEST SWAP4 POP SWAP4 POP POP PUSH1 0x60 PUSH2 0x33BA DUP9 DUP3 DUP10 ADD PUSH2 0x2D7B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33D3 DUP4 DUP4 PUSH2 0x33EE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x33E8 DUP2 PUSH2 0x446C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x33F7 DUP2 PUSH2 0x4393 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3406 DUP2 PUSH2 0x4393 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x341D PUSH2 0x3418 DUP3 PUSH2 0x4393 JUMP JUMPDEST PUSH2 0x44F6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x342E DUP3 PUSH2 0x431C JUMP JUMPDEST PUSH2 0x3438 DUP2 DUP6 PUSH2 0x434A JUMP JUMPDEST SWAP4 POP PUSH2 0x3443 DUP4 PUSH2 0x430C JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3474 JUMPI DUP2 MLOAD PUSH2 0x345B DUP9 DUP3 PUSH2 0x33C7 JUMP JUMPDEST SWAP8 POP PUSH2 0x3466 DUP4 PUSH2 0x433D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x3447 JUMP JUMPDEST POP DUP6 SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x348A DUP2 PUSH2 0x43B7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3499 DUP2 PUSH2 0x43C3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x34A8 DUP2 PUSH2 0x43C3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x34B7 DUP2 PUSH2 0x43CD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x34C9 DUP4 DUP6 PUSH2 0x435B JUMP JUMPDEST SWAP4 POP PUSH2 0x34D6 DUP4 DUP6 DUP5 PUSH2 0x44B4 JUMP JUMPDEST PUSH2 0x34DF DUP4 PUSH2 0x451A JUMP JUMPDEST DUP5 ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x34F6 DUP4 DUP6 PUSH2 0x436C JUMP JUMPDEST SWAP4 POP PUSH2 0x3503 DUP4 DUP6 DUP5 PUSH2 0x44B4 JUMP JUMPDEST DUP3 DUP5 ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x351A DUP3 PUSH2 0x4327 JUMP JUMPDEST PUSH2 0x3524 DUP2 DUP6 PUSH2 0x435B JUMP JUMPDEST SWAP4 POP PUSH2 0x3534 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x44C3 JUMP JUMPDEST PUSH2 0x353D DUP2 PUSH2 0x451A JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3551 DUP2 PUSH2 0x447E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3560 DUP2 PUSH2 0x447E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3571 DUP3 PUSH2 0x4332 JUMP JUMPDEST PUSH2 0x357B DUP2 DUP6 PUSH2 0x4377 JUMP JUMPDEST SWAP4 POP PUSH2 0x358B DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x44C3 JUMP JUMPDEST PUSH2 0x3594 DUP2 PUSH2 0x451A JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x35AC PUSH1 0x1C DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F706F73616C20616C7265616479207472616E7366657272656400000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x35EC PUSH1 0x16 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F706F73616C206973206E6F742061637469766500000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x362C PUSH1 0x22 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x456E756D657261626C655365743A20696E646578206F7574206F6620626F756E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6473000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3692 PUSH1 0x1E DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E646572206973206E6F742072656C61796572206F722061646D696E0000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x36D2 PUSH1 0x2F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2073656E646572206D75737420626520616E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2061646D696E20746F206772616E740000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3738 PUSH1 0x15 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x72656C6179657220616C726561647920766F7465640000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3778 PUSH1 0x14 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x5061757361626C653A206E6F7420706175736564000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B8 PUSH1 0x1F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6164647220646F65736E277420686176652072656C6179657220726F6C652100 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F8 PUSH1 0x16 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x496E636F72726563742066656520737570706C69656400000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3838 PUSH1 0x1B DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6461746120646F65736E2774206D617463682064617461686173680000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3878 PUSH1 0x1A DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x50726F706F73616C20616C72656164792063616E63656C6C6564000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B8 PUSH1 0x20 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x7265736F757263654944206E6F74206D617070656420746F2068616E646C6572 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38F8 PUSH1 0x30 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2073656E646572206D75737420626520616E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2061646D696E20746F207265766F6B6500000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x395E PUSH1 0x20 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x50726F706F73616C206E6F7420617420657870697279207468726573686F6C64 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x399E PUSH1 0x10 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x5061757361626C653A2070617573656400000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39DE PUSH1 0x1E DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6164647220616C7265616479206861732072656C6179657220726F6C65210000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A1E PUSH1 0x2A DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F706F73616C20616C7265616479207061737365642F6578656375746564 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2F63616E63656C6C656400000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A84 PUSH1 0x20 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E64657220646F65736E277420686176652072656C6179657220726F6C65 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AC4 PUSH1 0x1E DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E64657220646F65736E277420686176652061646D696E20726F6C650000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B04 PUSH1 0x1F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x43757272656E742066656520697320657175616C20746F206E65772066656500 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B44 PUSH1 0xC DUP4 PUSH2 0x4388 JUMP JUMPDEST SWAP2 POP PUSH32 0x52454C415945525F524F4C450000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0xC DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B84 PUSH1 0x11 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6461746168617368206D69736D61746368000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3BC4 PUSH1 0x19 DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x6E6F2068616E646C657220666F72207265736F75726365494400000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C04 PUSH1 0x2F DUP4 PUSH2 0x4377 JUMP JUMPDEST SWAP2 POP PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x3C75 PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x3490 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x3C88 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x3490 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x3CA0 DUP3 DUP3 PUSH2 0x3423 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x60 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x3CBA DUP3 DUP3 PUSH2 0x3423 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x3CCF PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x3548 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x3CE2 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x3CED JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3CF6 DUP2 PUSH2 0x442C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3D05 DUP2 PUSH2 0x442C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3D14 DUP2 PUSH2 0x4436 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3D23 DUP2 PUSH2 0x445F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D35 DUP3 DUP7 PUSH2 0x340C JUMP JUMPDEST PUSH1 0x14 DUP3 ADD SWAP2 POP PUSH2 0x3D46 DUP3 DUP5 DUP7 PUSH2 0x34EA JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D5E DUP3 PUSH2 0x3B37 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3D7D PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x33FD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3D98 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x33DF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD SWAP1 POP PUSH2 0x3DB3 PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x33FD JUMP JUMPDEST PUSH2 0x3DC0 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x33FD JUMP JUMPDEST PUSH2 0x3DCD PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3CFC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3DEA PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3481 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3E05 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x349F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3E20 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3E2D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x33FD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x3E49 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3E56 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x33FD JUMP JUMPDEST PUSH2 0x3E63 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x34AE JUMP JUMPDEST PUSH2 0x3E70 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x34AE JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3E8E PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3E9B PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x349F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x3EB7 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3EC4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3ED1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3557 JUMP JUMPDEST PUSH2 0x3EDE PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3CFC JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3EFC PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x349F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3F0F DUP2 DUP5 DUP7 PUSH2 0x34BD JUMP JUMPDEST SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0x3F2E PUSH1 0x0 DUP4 ADD DUP10 PUSH2 0x349F JUMP JUMPDEST PUSH2 0x3F3B PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x3D1A JUMP JUMPDEST PUSH2 0x3F48 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x3D0B JUMP JUMPDEST PUSH2 0x3F55 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x33DF JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x3F68 DUP2 DUP5 DUP7 PUSH2 0x34BD JUMP JUMPDEST SWAP1 POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3F8F DUP2 DUP5 PUSH2 0x350F JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3FB1 DUP2 DUP5 PUSH2 0x3566 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3FD2 DUP2 PUSH2 0x359F JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3FF2 DUP2 PUSH2 0x35DF JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4012 DUP2 PUSH2 0x361F JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4032 DUP2 PUSH2 0x3685 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4052 DUP2 PUSH2 0x36C5 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4072 DUP2 PUSH2 0x372B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4092 DUP2 PUSH2 0x376B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x40B2 DUP2 PUSH2 0x37AB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x40D2 DUP2 PUSH2 0x37EB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x40F2 DUP2 PUSH2 0x382B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4112 DUP2 PUSH2 0x386B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4132 DUP2 PUSH2 0x38AB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4152 DUP2 PUSH2 0x38EB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4172 DUP2 PUSH2 0x3951 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4192 DUP2 PUSH2 0x3991 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x41B2 DUP2 PUSH2 0x39D1 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x41D2 DUP2 PUSH2 0x3A11 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x41F2 DUP2 PUSH2 0x3A77 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4212 DUP2 PUSH2 0x3AB7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4232 DUP2 PUSH2 0x3AF7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4252 DUP2 PUSH2 0x3B77 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4272 DUP2 PUSH2 0x3BB7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x4292 DUP2 PUSH2 0x3BF7 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x42B3 DUP2 DUP5 PUSH2 0x3C5D JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x42D0 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3CFC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x42EB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3D0B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x4306 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3D1A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x439E DUP3 PUSH2 0x440C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x43B0 DUP3 PUSH2 0x440C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH2 0x4407 DUP3 PUSH2 0x4538 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH9 0xFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4477 DUP3 PUSH2 0x4490 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4489 DUP3 PUSH2 0x43F9 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x449B DUP3 PUSH2 0x44A2 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44AD DUP3 PUSH2 0x440C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x44E1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x44C6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x44F0 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4501 DUP3 PUSH2 0x4508 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4513 DUP3 PUSH2 0x452B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x60 SHL SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 DUP2 LT PUSH2 0x4542 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST PUSH2 0x454E DUP2 PUSH2 0x4393 JUMP JUMPDEST DUP2 EQ PUSH2 0x4559 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x4565 DUP2 PUSH2 0x43A5 JUMP JUMPDEST DUP2 EQ PUSH2 0x4570 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x457C DUP2 PUSH2 0x43C3 JUMP JUMPDEST DUP2 EQ PUSH2 0x4587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x4593 DUP2 PUSH2 0x43CD JUMP JUMPDEST DUP2 EQ PUSH2 0x459E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45AA DUP2 PUSH2 0x442C JUMP JUMPDEST DUP2 EQ PUSH2 0x45B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45C1 DUP2 PUSH2 0x4436 JUMP JUMPDEST DUP2 EQ PUSH2 0x45CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45D8 DUP2 PUSH2 0x444A JUMP JUMPDEST DUP2 EQ PUSH2 0x45E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x45EF DUP2 PUSH2 0x445F JUMP JUMPDEST DUP2 EQ PUSH2 0x45FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MLOAD PUSH1 0x9 0x22 0x2E SGT PUSH20 0x2FB2B271E05E189EE935C032EEF285667F0C5E2A DUP10 0x24 0x2C 0xEB PUSH24 0x64736F6C6343000604003300000000000000000000000000 ",
"sourceMap": "538:18377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;11715:696:0;;;;;;;;;;;;;;;;:::i;:::-;;15989:631;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15989:631:0;;;;;;;;;;;;;;;;:::i;:::-;;13075:2371;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13075:2371:0;;;;;;;;;;;;;;;;:::i;:::-;;4280:112:8;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4280:112:8;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4642:223;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4642:223:8;;;;;;;;;;;;;;;;:::i;:::-;;5816:205;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5816:205:8;;;;;;;;;;;;;;;;:::i;:::-;;1350:65:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1350:65:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17279:1032;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17279:1032:0;;;;;;;;;;;;;;;;:::i;:::-;;18701:211;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18701:211:0;;;;;;;;;;;;;;;;:::i;:::-;;1142:46;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1142:46:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5671:176;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5671:176:0;;;;;;;;;;;;;;;;:::i;:::-;;1486:65;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1486:65:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4275:119;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4275:119:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;889:76:5;;5:9:-1;2:2;;;27:1;24;17:12;2:2;889:76:5;;;:::i;:::-;;;;;;;;;;;;;;;;4645:170:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4645:170:0;;;;;;;;;;;;;;;;:::i;:::-;;10982:304;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10982:304:0;;;;;;;;;;;;;;;;:::i;:::-;;1636:90;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1636:90:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;665:29;;5:9:-1;2:2;;;27:1;24;17:12;2:2;665:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;5003:75;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5003:75:0;;;:::i;:::-;;1231:62;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1231:62:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9265:200;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9265:200:0;;;;;;;;;;;;;;;;:::i;:::-;;3963:136:8;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3963:136:8;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10460:154:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10460:154:0;;;;;;;;;;;;;;;;:::i;:::-;;2948:137:8;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2948:137:8;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2432:64:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2432:64:0;;;:::i;:::-;;;;;;;;;;;;;;;;700:30;;5:9:-1;2:2;;;27:1;24;17:12;2:2;700:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;6738:290;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6738:290:0;;;;;;;;;;;;;;;;:::i;:::-;;1725:49:8;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1725:49:8;;;:::i;:::-;;;;;;;;;;;;;;;;10048:258:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10048:258:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;598:23;;5:9:-1;2:2;;;27:1;24;17:12;2:2;598:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;736:19;;5:9:-1;2:2;;;27:1;24;17:12;2:2;736:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;761:22;;5:9:-1;2:2;;;27:1;24;17:12;2:2;761:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;3253:125:8;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3253:125:8;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7569:298:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7569:298:0;;;;;;;;;;;;;;;;:::i;:::-;;6148:284;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6148:284:0;;;;;;;;;;;;;;;;:::i;:::-;;5099:226:8;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5099:226:8;;;;;;;;;;;;;;;;:::i;:::-;;627:32:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;627:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;8415:459;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8415:459:0;;;;;;;;;;;;;;;;:::i;:::-;;5268:79;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5268:79:0;;;:::i;:::-;;11715:696;1186:16:5;:14;:16::i;:::-;11861:4:0::1;;11848:9;:17;11840:52;;;;;;;;;;;;;;;;;;;;;;11903:15;11921:27;:39;11949:10;11921:39;;;;;;;;;;;;;;;;;;;;;11903:57;;11997:1;11978:21;;:7;:21;;;;11970:66;;;;;;;;;;;;;;;;;;;;;;12047:19;12071:14;:34;12086:18;12071:34;;;;;;;;;;;;;;;;12069:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12047:58;;12167:4;;12115:15;:29;12131:12;12115:29;;;;;;;;;;;;;;;:49;12145:18;12115:49;;;;;;;;;;;;;;;:56;;;;;;;:::i;:::-;;12182:30;12231:7;12182:57;;12249:14;:22;;;12272:10;12284:18;12304:12;12318:10;12330:4;;12249:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;12249:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;12249:86:0;;;;12391:12;12351:53;;12379:10;12359:18;12351:53;;;;;;;;;;;;1212:1:5;;;11715:696:0::0;;;;:::o;15989:631::-;2610:21;:19;:21::i;:::-;16103:17:::1;16160:7;16153:15;;16148:1;16131:12;16124:20;;:25;;;;16123:45;16103:65;;16178:25;16206:10;:22;16217:10;16206:22;;;;;;;;;;;;;;;:32;16229:8;16206:32;;;;;;;;;;;16178:60;;16277:24;16257:44:::0;::::1;;;;;;;:8;:16;;;;;;;;;;;;:44;;;;;;;;;;16249:83;;;;;;;;;;;;;;;;;;;;;;16395:7;;16350:42;16354:12;16368:8;:23;;;16350:3;:42::i;:::-;:52;16342:97;;;;;;;;;;;;;;;;;;;;;;16469:24;16450:8;:16;;;:43;;;;;;;;;;;;;;;;;;;;;;;;16545:24;16508:104:::0;::::1;;;;;;;16531:12;16508:104;;16522:7;16508:104;;;16571:8;:20;;;16593:8;:18;;;16508:104;;;;;;;;;;;;;;;;2641:1;;15989:631:::0;;;:::o;13075:2371::-;2689:15;:13;:15::i;:::-;1186:16:5::1;:14;:16::i;:::-;13218:17:0::2;13275:7;13268:15;;13263:1;13246:12;13239:20;;:25;;;;13238:45;13218:65;;13293:25;13321:10;:22;13332:10;13321:22;;;;;;;;;;;;;;;:32;13344:8;13321:32;;;;;;;;;;;13293:60;;13423:1;13372:53;;:27;:39;13400:10;13372:39;;;;;;;;;;;;;;;;;;;;;:53;;;;13364:91;;;;;;;;;;;;;;;;;;;;;;13499:1;13478:8;:16;;;;;;;;;;;;13473:22;;;;;;;;:27;;13465:82;;;;;;;;;;;;;;;;;;;;;;13566:19;:31;13586:10;13566:31;;;;;;;;;;;;;;;:41;13598:8;13566:41;;;;;;;;;;;:53;13608:10;13566:53;;;;;;;;;;;;;;;;;;;;;;;;;13565:54;13557:88;;;;;;;;;;;;;;;;;;;;;;13686:1;13665:8;:16;;;;;;;;;;;;13660:22;;;;;;;;:27;13656:1160;;;13705:15;;13703:17;;;;;;;;;;;13769:295;;;;;;;;13810:10;13769:295;;;;13850:8;13769:295;;;;13902:1;13888:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;156:4;148:6;144:17;134:27;;0:165;13888:16:0;;;;13769:295;;;;13947:1;13933:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;156:4;148:6;144:17;134:27;;0:165;13933:16:0;;;;13769:295;;;;13977:21;13769:295;;;;;;;;;;;;14033:12;13769:295;;::::0;13734:10:::2;:22;13745:10;13734:22;;;;;;;;;;;;;;;:32;13757:8;13734:32;;;;;;;;;;;:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14103:10;14079:8;:18;;14098:1;14079:21;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;14169:21;14132:81;;;;;;;;14155:12;14132:81;;14146:7;14132:81;;;14192:10;14204:8;14132:81;;;;;;;;;;;;;;;;13656:1160;;;14293:7;;14248:42;14252:12;14266:8;:23;;;14248:3;:42::i;:::-;:52;14244:561;;;14505:24;14486:8;:16;;;:43;;;;;;;;;;;;;;;;;;;;;;;;14589:24;14552:84:::0;::::2;;;;;;;14575:12;14552:84;;14566:7;14552:84;;;14615:10;14627:8;14552:84;;;;;;;;;;;;;;;;14244:561;;;14695:8;:18;;;14683:8;:30;14675:60;;;;;;;;;;;;;;;;;;;;;;14753:8;:18;;14777:10;14753:35;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;14753:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14244:561;13656:1160;14849:24;14829:44:::0;::::2;;;;;;;:8;:16;;;;;;;;;;;;:44;;;;;;;;;14825:614;;14945:4;14889:19;:31;14909:10;14889:31;;;;;;;;;;;;;;;:41;14921:8;14889:41;;;;;;;;;;;:53;14931:10;14889:53;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;15004:8;:16;;;;;;;;;;;;14968:65;;;;;;;;14990:12;14968:65;;14981:7;14968:65;;;15022:10;14968:65;;;;;;;;;;;;;;;15198:1;15177:17;;:22;;:72;;;;15232:17;;15203:8;:18;;:25;;;;:46;;15177:72;15173:256;;;15288:21;15269:8;:16;;;:40;;;;;;;;;;;;;;;;;;;;;;;;15370:21;15333:81;;;;;;;;15356:12;15333:81;;15347:7;15333:81;;;15393:10;15405:8;15333:81;;;;;;;;;;;;;;;;15173:256;14825:614;1212:1:5;;13075:2371:0::0;;;;:::o;4280:112:8:-;4337:7;4363:6;:12;4370:4;4363:12;;;;;;;;;;;:22;;;4356:29;;4280:112;;;:::o;4642:223::-;4725:45;4733:6;:12;4740:4;4733:12;;;;;;;;;;;:22;;;4757:12;:10;:12::i;:::-;4725:7;:45::i;:::-;4717:105;;;;;;;;;;;;;;;;;;;;;;4833:25;4844:4;4850:7;4833:10;:25::i;:::-;4642:223;;:::o;5816:205::-;5913:12;:10;:12::i;:::-;5902:23;;:7;:23;;;5894:83;;;;;;;;;;;;;;;;;;;;;;5988:26;6000:4;6006:7;5988:11;:26::i;:::-;5816:205;;:::o;1350:65:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17279:1032::-;2689:15;:13;:15::i;:::-;1186:16:5::1;:14;:16::i;:::-;17427:15:0::2;17445:27;:39;17473:10;17445:39;;;;;;;;;;;;;;;;;;;;;17427:57;;17494:17;17551:7;17544:15;;17539:1;17522:12;17515:20;;:25;;;;17514:45;17494:65;;17569:16;17615:7;17624:4;;17598:31;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17598:31:0;;;17588:42;;;;;;17569:61;;17640:25;17668:10;:22;17679:10;17668:22;;;;;;;;;;;;;;;:32;17691:8;17668:32;;;;;;;;;;;17640:60;;17739:23;17719:43;;;;;;;;:8;:16;;;;;;;;;;;;:43;;;;;;;;;;17711:78;;;;;;;;;;;;;;;;;;;;;;17827:21;17807:41;;;;;;;;:8;:16;;;;;;;;;;;;:41;;;;;;;;;17799:82;;;;;;;;;;;;;;;;;;;;;;17911:8;:18;;;17899:8;:30;17891:70;;;;;;;;;;;;;;;;;;;;;;17991:23;17972:8;:16;;;:42;;;;;;;;;;;;;;;;;;;;;;;;18025:30;18074:27;:49;18102:8;:20;;;18074:49;;;;;;;;;;;;;;;;;;;;;18025:99;;18134:14;:30;;;18165:8;:20;;;18187:4;;18134:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;18134:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;18134:58:0;;;;18245:8;:16;;;;;;;;;;;;18208:96;;;;;;;;18231:12;18208:96;;18222:7;18208:96;;;18263:8;:20;;;18285:8;:18;;;18208:96;;;;;;;;;;;;;;;;1212:1:5;;;;;17279:1032:0::0;;;;;:::o;18701:211::-;2534:12;:10;:12::i;:::-;18817:6:::1;18826:1:::0;18817:10:::1;;18812:94;18833:5;;:12;;18829:1;:16;18812:94;;;18866:5;;18872:1;18866:8;;;;;;;;;;;;;;;;;;;;;;:17;;:29;18884:7;;18892:1;18884:10;;;;;;;;;;;;;18866:29;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18866:29:0;18847:3;;;;;;;18812:94;;;;18701:211:::0;;;;:::o;1142:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;5671:176::-;2534:12;:10;:12::i;:::-;5776::::1;5756:17;:32;;;;5827:12;5803:37;;;;;;;;;;5671:176:::0;:::o;1486:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4275:119::-;4334:4;4357:30;2471:25;;;;;;;;;;;;;;4379:7;4357;:30::i;:::-;4350:37;;4275:119;;;:::o;889:76:5:-;928:4;951:7;;;;;;;;;;;944:14;;889:76;:::o;4645:170:0:-;2534:12;:10;:12::i;:::-;4715:39:::1;1770:4:8;4725:18:0::0;::::1;4745:8;4715:9;:39::i;:::-;4764:44;1770:4:8;4777:18:0::0;::::1;4797:10;4764:12;:44::i;:::-;4645:170:::0;:::o;10982:304::-;2534:12;:10;:12::i;:::-;11162:19:::1;11196:14;11162:49;;11221:7;:16;;;11238:12;11252:9;11263:15;11221:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;11221:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;11221:58:0;;;;2556:1;10982:304:::0;;;;:::o;1636:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;665:29::-;;;;:::o;5003:75::-;2534:12;:10;:12::i;:::-;5063:8:::1;:6;:8::i;:::-;5003:75::o:0;1231:62::-;;;;;;;;;;;;;;;;;;;;;;:::o;9265:200::-;2534:12;:10;:12::i;:::-;9366:19:::1;9400:14;9366:49;;9425:7;:19;;;9445:12;9425:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;9425:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;9425:33:0;;;;2556:1;9265:200:::0;;:::o;3963:136:8:-;4036:7;4062:30;4086:5;4062:6;:12;4069:4;4062:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;4055:37;;3963:136;;;;:::o;10460:154:0:-;2534:12;:10;:12::i;:::-;10542:6:::1;10534:4;;:14;;10526:58;;;;;;;;;;;;;;;;;;;;;;10601:6;10594:4;:13;;;;10460:154:::0;:::o;2948:137:8:-;3017:4;3040:38;3070:7;3040:6;:12;3047:4;3040:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;3033:45;;2948:137;;;;:::o;2432:64:0:-;2471:25;;;;;;;;;;;;;;2432:64;:::o;700:30::-;;;;:::o;6738:290::-;2534:12;:10;:12::i;:::-;6827:37:::1;2471:25;;;;;;;;;;;;;;6849:14;6827:7;:37::i;:::-;6819:81;;;;;;;;;;;;;;;;;;;;;;6910:40;2471:25;;;;;;;;;;;;;;6935:14;6910:10;:40::i;:::-;6980:14;6965:30;;;;;;;;;;;;7005:14;;:16;;;;;;;;;;;;;;6738:290:::0;:::o;1725:49:8:-;1770:4;1725:49;;;:::o;10048:258:0:-;10152:15;;:::i;:::-;10179:17;10236:13;10229:21;;10224:1;10207:12;10200:20;;:25;;;;10199:51;10179:71;;10267:10;:22;10278:10;10267:22;;;;;;;;;;;;;;;:32;10290:8;10267:32;;;;;;;;;;;10260:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10048:258;;;;;:::o;598:23::-;;;;;;;;;;;;;:::o;736:19::-;;;;:::o;761:22::-;;;;:::o;3253:125:8:-;3316:7;3342:29;:6;:12;3349:4;3342:12;;;;;;;;;;;:20;;:27;:29::i;:::-;3335:36;;3253:125;;;:::o;7569:298:0:-;2534:12;:10;:12::i;:::-;7732:14:::1;7690:27;:39;7718:10;7690:39;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;7756:19;7790:14;7756:49;;7815:7;:19;;;7835:10;7847:12;7815:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;7815:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;7815:45:0;;;;2556:1;7569:298:::0;;;:::o;6148:284::-;2534:12;:10;:12::i;:::-;6235:37:::1;2471:25;;;;;;;;;;;;;;6257:14;6235:7;:37::i;:::-;6234:38;6226:81;;;;;;;;;;;;;;;;;;;;;;6317:39;2471:25;;;;;;;;;;;;;;6341:14;6317:9;:39::i;:::-;6384:14;6371:28;;;;;;;;;;;;6409:14;;:16;;;;;;;;;;;;;6148:284:::0;:::o;5099:226:8:-;5183:45;5191:6;:12;5198:4;5191:12;;;;;;;;;;;:22;;;5215:12;:10;:12::i;:::-;5183:7;:45::i;:::-;5175:106;;;;;;;;;;;;;;;;;;;;;;5292:26;5304:4;5310:7;5292:11;:26::i;:::-;5099:226;;:::o;627:32:0:-;;;;:::o;8415:459::-;2534:12;:10;:12::i;:::-;8688:14:::1;8646:27;:39;8674:10;8646:39;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;8712:23;8754:14;8712:57;;8779:7;:19;;;8799:10;8811:15;8828:18;8848;8779:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;8779:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;8779:88:0;;;;2556:1;8415:459:::0;;;;;:::o;5268:79::-;2534:12;:10;:12::i;:::-;5330:10:::1;:8;:10::i;:::-;5268:79::o:0;1226:93:5:-;1284:7;;;;;;;;;;;1283:8;1275:37;;;;;;;;;;;;;;;;;;;;;;1226:93::o;2728:187:0:-;2785:39;1770:4:8;2793:18:0;;2813:10;2785:7;:39::i;:::-;:76;;;;2828:33;2471:25;;;;;;;;;;;;;;2850:10;2828:7;:33::i;:::-;2785:76;2777:131;;;;;;;;;;;;;;;;;;;;;;2728:187::o;610:135:6:-;668:7;694:44;699:1;702;694:44;;;;;;;;;;;;;;;;;:4;:44::i;:::-;687:51;;610:135;;;;:::o;3056:128:0:-;3107:33;2471:25;;;;;;;;;;;;;;3129:10;3107:7;:33::i;:::-;3099:78;;;;;;;;;;;;;;;;;;;;;;3056:128::o;598:104:7:-;651:15;685:10;678:17;;598:104;:::o;7023:184:8:-;7096:33;7121:7;7096:6;:12;7103:4;7096:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;7092:109;;;7177:12;:10;:12::i;:::-;7150:40;;7168:7;7150:40;;7162:4;7150:40;;;;;;;;;;7092:109;7023:184;;:::o;7213:188::-;7287:36;7315:7;7287:6;:12;7294:4;7287:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;7283:112;;;7371:12;:10;:12::i;:::-;7344:40;;7362:7;7344:40;;7356:4;7344:40;;;;;;;;;;7283:112;7213:188;;:::o;2921:129:0:-;2969:39;1770:4:8;2977:18:0;;2997:10;2969:7;:39::i;:::-;2961:82;;;;;;;;;;;;;;;;;;;;;;2921:129::o;1802:113:5:-;1186:16;:14;:16::i;:::-;1871:4:::1;1861:7;::::0;:14:::1;;;;;;;;;;;;;;;;;;1890:18;1897:10;1890:18;;;;;;;;;;;;;;;1802:113::o:0;7650:147:10:-;7724:7;7766:22;7770:3;:10;;7782:5;7766:3;:22::i;:::-;7758:31;;7743:47;;7650:147;;;;:::o;6966:156::-;7046:4;7069:46;7079:3;:10;;7107:5;7099:14;;7091:23;;7069:9;:46::i;:::-;7062:53;;6966:156;;;;:::o;7203:115::-;7266:7;7292:19;7300:3;:10;;7292:7;:19::i;:::-;7285:26;;7203:115;;;:::o;2047::5:-;1537:13;:11;:13::i;:::-;2115:5:::1;2105:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;2135:20;2144:10;2135:20;;;;;;;;;;;;;;;2047:115::o:0;1029:188:6:-;1116:7;1148:1;1143;:6;;1151:12;1135:29;;;;;;;;;;;;;;;;;;;;;;;;;1174:9;1190:1;1186;:5;1174:17;;1209:1;1202:8;;;1029:188;;;;;:::o;6429:141:10:-;6499:4;6522:41;6527:3;:10;;6555:5;6547:14;;6539:23;;6522:4;:41::i;:::-;6515:48;;6429:141;;;;:::o;6738:147::-;6811:4;6834:44;6842:3;:10;;6870:5;6862:14;;6854:23;;6834:7;:44::i;:::-;6827:51;;6738:147;;;;:::o;4452:201::-;4519:7;4567:5;4546:3;:11;;:18;;;;:26;4538:73;;;;;;;;;;;;;;;;;;;;;;4628:3;:11;;4640:5;4628:18;;;;;;;;;;;;;;;;4621:25;;4452:201;;;;:::o;3805:127::-;3878:4;3924:1;3901:3;:12;;:19;3914:5;3901:19;;;;;;;;;;;;:24;;3894:31;;3805:127;;;;:::o;4013:107::-;4069:7;4095:3;:11;;:18;;;;4088:25;;4013:107;;;:::o;1574:93:5:-;1628:7;;;;;;;;;;;1620:40;;;;;;;;;;;;;;;;;;;;;;1574:93::o;1640:404:10:-;1703:4;1724:21;1734:3;1739:5;1724:9;:21::i;:::-;1719:319;;1761:3;:11;;1778:5;1761:23;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1761:23:10;;;;;;;;;;;;;;;;;;;1941:3;:11;;:18;;;;1919:3;:12;;:19;1932:5;1919:19;;;;;;;;;;;:40;;;;1980:4;1973:11;;;;1719:319;2022:5;2015:12;;1640:404;;;;;:::o;2212:1512::-;2278:4;2394:18;2415:3;:12;;:19;2428:5;2415:19;;;;;;;;;;;;2394:40;;2463:1;2449:10;:15;2445:1273;;2806:21;2843:1;2830:10;:14;2806:38;;2858:17;2899:1;2878:3;:11;;:18;;;;:22;2858:42;;3140:17;3160:3;:11;;3172:9;3160:22;;;;;;;;;;;;;;;;3140:42;;3303:9;3274:3;:11;;3286:13;3274:26;;;;;;;;;;;;;;;:38;;;;3420:1;3404:13;:17;3378:3;:12;;:23;3391:9;3378:23;;;;;;;;;;;:43;;;;3527:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;3619:3;:12;;:19;3632:5;3619:19;;;;;;;;;;;3612:26;;;3660:4;3653:11;;;;;;;;2445:1273;3702:5;3695:12;;;2212:1512;;;;;:::o;538:18377:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:146;;230:6;217:20;208:29;;242:41;277:5;242:41;;;202:86;;;;;321:360;;;459:3;452:4;444:6;440:17;436:27;426:2;;477:1;474;467:12;426:2;510:6;497:20;487:30;;537:18;529:6;526:30;523:2;;;569:1;566;559:12;523:2;603:4;595:6;591:17;579:29;;654:3;646:4;638:6;634:17;624:8;620:32;617:41;614:2;;;671:1;668;661:12;614:2;419:262;;;;;;707:352;;;837:3;830:4;822:6;818:17;814:27;804:2;;855:1;852;845:12;804:2;888:6;875:20;865:30;;915:18;907:6;904:30;901:2;;;947:1;944;937:12;901:2;981:4;973:6;969:17;957:29;;1032:3;1024:4;1016:6;1012:17;1002:8;998:32;995:41;992:2;;;1049:1;1046;1039:12;992:2;797:262;;;;;;1067:130;;1147:6;1134:20;1125:29;;1159:33;1186:5;1159:33;;;1119:78;;;;;1204:128;;1283:6;1270:20;1261:29;;1295:32;1321:5;1295:32;;;1255:77;;;;;1353:336;;;1467:3;1460:4;1452:6;1448:17;1444:27;1434:2;;1485:1;1482;1475:12;1434:2;1518:6;1505:20;1495:30;;1545:18;1537:6;1534:30;1531:2;;;1577:1;1574;1567:12;1531:2;1611:4;1603:6;1599:17;1587:29;;1662:3;1654:4;1646:6;1642:17;1632:8;1628:32;1625:41;1622:2;;;1679:1;1676;1669:12;1622:2;1427:262;;;;;;1697:130;;1777:6;1764:20;1755:29;;1789:33;1816:5;1789:33;;;1749:78;;;;;1834:128;;1913:6;1900:20;1891:29;;1925:32;1951:5;1925:32;;;1885:77;;;;;1969:128;;2048:6;2035:20;2026:29;;2060:32;2086:5;2060:32;;;2020:77;;;;;2104:126;;2182:6;2169:20;2160:29;;2194:31;2219:5;2194:31;;;2154:76;;;;;2237:241;;2341:2;2329:9;2320:7;2316:23;2312:32;2309:2;;;2357:1;2354;2347:12;2309:2;2392:1;2409:53;2454:7;2445:6;2434:9;2430:22;2409:53;;;2399:63;;2371:97;2303:175;;;;;2485:257;;2597:2;2585:9;2576:7;2572:23;2568:32;2565:2;;;2613:1;2610;2603:12;2565:2;2648:1;2665:61;2718:7;2709:6;2698:9;2694:22;2665:61;;;2655:71;;2627:105;2559:183;;;;;2749:366;;;2870:2;2858:9;2849:7;2845:23;2841:32;2838:2;;;2886:1;2883;2876:12;2838:2;2921:1;2938:53;2983:7;2974:6;2963:9;2959:22;2938:53;;;2928:63;;2900:97;3028:2;3046:53;3091:7;3082:6;3071:9;3067:22;3046:53;;;3036:63;;3007:98;2832:283;;;;;;3122:617;;;;;3277:3;3265:9;3256:7;3252:23;3248:33;3245:2;;;3294:1;3291;3284:12;3245:2;3329:1;3346:53;3391:7;3382:6;3371:9;3367:22;3346:53;;;3336:63;;3308:97;3436:2;3454:53;3499:7;3490:6;3479:9;3475:22;3454:53;;;3444:63;;3415:98;3544:2;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;;;3552:63;;3523:98;3652:2;3670:53;3715:7;3706:6;3695:9;3691:22;3670:53;;;3660:63;;3631:98;3239:500;;;;;;;;3746:491;;;;3884:2;3872:9;3863:7;3859:23;3855:32;3852:2;;;3900:1;3897;3890:12;3852:2;3935:1;3952:53;3997:7;3988:6;3977:9;3973:22;3952:53;;;3942:63;;3914:97;4042:2;4060:53;4105:7;4096:6;4085:9;4081:22;4060:53;;;4050:63;;4021:98;4150:2;4168:53;4213:7;4204:6;4193:9;4189:22;4168:53;;;4158:63;;4129:98;3846:391;;;;;;4244:739;;;;;;4414:3;4402:9;4393:7;4389:23;4385:33;4382:2;;;4431:1;4428;4421:12;4382:2;4466:1;4483:53;4528:7;4519:6;4508:9;4504:22;4483:53;;;4473:63;;4445:97;4573:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;;;4581:63;;4552:98;4681:2;4699:53;4744:7;4735:6;4724:9;4720:22;4699:53;;;4689:63;;4660:98;4789:2;4807:52;4851:7;4842:6;4831:9;4827:22;4807:52;;;4797:62;;4768:97;4896:3;4915:52;4959:7;4950:6;4939:9;4935:22;4915:52;;;4905:62;;4875:98;4376:607;;;;;;;;;4990:694;;;;;5189:2;5177:9;5168:7;5164:23;5160:32;5157:2;;;5205:1;5202;5195:12;5157:2;5268:1;5257:9;5253:17;5240:31;5291:18;5283:6;5280:30;5277:2;;;5323:1;5320;5313:12;5277:2;5351:88;5431:7;5422:6;5411:9;5407:22;5351:88;;;5341:98;;;;5219:226;5504:2;5493:9;5489:18;5476:32;5528:18;5520:6;5517:30;5514:2;;;5560:1;5557;5550:12;5514:2;5588:80;5660:7;5651:6;5640:9;5636:22;5588:80;;;5578:90;;;;5455:219;5151:533;;;;;;;;5691:241;;5795:2;5783:9;5774:7;5770:23;5766:32;5763:2;;;5811:1;5808;5801:12;5763:2;5846:1;5863:53;5908:7;5899:6;5888:9;5884:22;5863:53;;;5853:63;;5825:97;5757:175;;;;;5939:366;;;6060:2;6048:9;6039:7;6035:23;6031:32;6028:2;;;6076:1;6073;6066:12;6028:2;6111:1;6128:53;6173:7;6164:6;6153:9;6149:22;6128:53;;;6118:63;;6090:97;6218:2;6236:53;6281:7;6272:6;6261:9;6257:22;6236:53;;;6226:63;;6197:98;6022:283;;;;;;6312:366;;;6433:2;6421:9;6412:7;6408:23;6404:32;6401:2;;;6449:1;6446;6439:12;6401:2;6484:1;6501:53;6546:7;6537:6;6526:9;6522:22;6501:53;;;6491:63;;6463:97;6591:2;6609:53;6654:7;6645:6;6634:9;6630:22;6609:53;;;6599:63;;6570:98;6395:283;;;;;;6685:241;;6789:2;6777:9;6768:7;6764:23;6760:32;6757:2;;;6805:1;6802;6795:12;6757:2;6840:1;6857:53;6902:7;6893:6;6882:9;6878:22;6857:53;;;6847:63;;6819:97;6751:175;;;;;6933:360;;;7051:2;7039:9;7030:7;7026:23;7022:32;7019:2;;;7067:1;7064;7057:12;7019:2;7102:1;7119:52;7163:7;7154:6;7143:9;7139:22;7119:52;;;7109:62;;7081:96;7208:2;7226:51;7269:7;7260:6;7249:9;7245:22;7226:51;;;7216:61;;7187:96;7013:280;;;;;;7300:364;;;7420:2;7408:9;7399:7;7395:23;7391:32;7388:2;;;7436:1;7433;7426:12;7388:2;7471:1;7488:52;7532:7;7523:6;7512:9;7508:22;7488:52;;;7478:62;;7450:96;7577:2;7595:53;7640:7;7631:6;7620:9;7616:22;7595:53;;;7585:63;;7556:98;7382:282;;;;;;7671:489;;;;7808:2;7796:9;7787:7;7783:23;7779:32;7776:2;;;7824:1;7821;7814:12;7776:2;7859:1;7876:52;7920:7;7911:6;7900:9;7896:22;7876:52;;;7866:62;;7838:96;7965:2;7983:53;8028:7;8019:6;8008:9;8004:22;7983:53;;;7973:63;;7944:98;8073:2;8091:53;8136:7;8127:6;8116:9;8112:22;8091:53;;;8081:63;;8052:98;7770:390;;;;;;8167:237;;8269:2;8257:9;8248:7;8244:23;8240:32;8237:2;;;8285:1;8282;8275:12;8237:2;8320:1;8337:51;8380:7;8371:6;8360:9;8356:22;8337:51;;;8327:61;;8299:95;8231:173;;;;;8411:611;;;;;8566:2;8554:9;8545:7;8541:23;8537:32;8534:2;;;8582:1;8579;8572:12;8534:2;8617:1;8634:51;8677:7;8668:6;8657:9;8653:22;8634:51;;;8624:61;;8596:95;8722:2;8740:53;8785:7;8776:6;8765:9;8761:22;8740:53;;;8730:63;;8701:98;8858:2;8847:9;8843:18;8830:32;8882:18;8874:6;8871:30;8868:2;;;8914:1;8911;8904:12;8868:2;8942:64;8998:7;8989:6;8978:9;8974:22;8942:64;;;8932:74;;;;8809:203;8528:494;;;;;;;;9029:485;;;;9164:2;9152:9;9143:7;9139:23;9135:32;9132:2;;;9180:1;9177;9170:12;9132:2;9215:1;9232:51;9275:7;9266:6;9255:9;9251:22;9232:51;;;9222:61;;9194:95;9320:2;9338:52;9382:7;9373:6;9362:9;9358:22;9338:52;;;9328:62;;9299:97;9427:2;9445:53;9490:7;9481:6;9470:9;9466:22;9445:53;;;9435:63;;9406:98;9126:388;;;;;;9521:611;;;;;9673:3;9661:9;9652:7;9648:23;9644:33;9641:2;;;9690:1;9687;9680:12;9641:2;9725:1;9742:51;9785:7;9776:6;9765:9;9761:22;9742:51;;;9732:61;;9704:95;9830:2;9848:52;9892:7;9883:6;9872:9;9868:22;9848:52;;;9838:62;;9809:97;9937:2;9955:53;10000:7;9991:6;9980:9;9976:22;9955:53;;;9945:63;;9916:98;10045:2;10063:53;10108:7;10099:6;10088:9;10084:22;10063:53;;;10053:63;;10024:98;9635:497;;;;;;;;10139:735;;;;;;10310:3;10298:9;10289:7;10285:23;10281:33;10278:2;;;10327:1;10324;10317:12;10278:2;10362:1;10379:51;10422:7;10413:6;10402:9;10398:22;10379:51;;;10369:61;;10341:95;10467:2;10485:52;10529:7;10520:6;10509:9;10505:22;10485:52;;;10475:62;;10446:97;10602:2;10591:9;10587:18;10574:32;10626:18;10618:6;10615:30;10612:2;;;10658:1;10655;10648:12;10612:2;10686:64;10742:7;10733:6;10722:9;10718:22;10686:64;;;10676:74;;;;10553:203;10787:2;10805:53;10850:7;10841:6;10830:9;10826:22;10805:53;;;10795:63;;10766:98;10272:602;;;;;;;;;10882:173;;10969:46;11011:3;11003:6;10969:46;;;11044:4;11039:3;11035:14;11021:28;;10962:93;;;;;11063:142;11154:45;11193:5;11154:45;;;11149:3;11142:58;11136:69;;;11212:103;11285:24;11303:5;11285:24;;;11280:3;11273:37;11267:48;;;11322:113;11405:24;11423:5;11405:24;;;11400:3;11393:37;11387:48;;;11442:152;11543:45;11563:24;11581:5;11563:24;;;11543:45;;;11538:3;11531:58;11525:69;;;11632:654;;11763:50;11807:5;11763:50;;;11826:76;11895:6;11890:3;11826:76;;;11819:83;;11923:52;11969:5;11923:52;;;11995:7;12023:1;12008:256;12033:6;12030:1;12027:13;12008:256;;;12100:6;12094:13;12121:63;12180:3;12165:13;12121:63;;;12114:70;;12201:56;12250:6;12201:56;;;12191:66;;12065:199;12055:1;12052;12048:9;12043:14;;12008:256;;;12012:14;12277:3;12270:10;;11742:544;;;;;;;;12294:104;12371:21;12386:5;12371:21;;;12366:3;12359:34;12353:45;;;12405:103;12478:24;12496:5;12478:24;;;12473:3;12466:37;12460:48;;;12515:113;12598:24;12616:5;12598:24;;;12593:3;12586:37;12580:48;;;12635:110;12716:23;12733:5;12716:23;;;12711:3;12704:36;12698:47;;;12775:297;;12889:70;12952:6;12947:3;12889:70;;;12882:77;;12971:43;13007:6;13002:3;12995:5;12971:43;;;13036:29;13058:6;13036:29;;;13031:3;13027:39;13020:46;;12875:197;;;;;;13103:310;;13235:88;13316:6;13311:3;13235:88;;;13228:95;;13335:43;13371:6;13366:3;13359:5;13335:43;;;13400:6;13395:3;13391:16;13384:23;;13221:192;;;;;;13421:335;;13527:34;13555:5;13527:34;;;13573:70;13636:6;13631:3;13573:70;;;13566:77;;13648:52;13693:6;13688:3;13681:4;13674:5;13670:16;13648:52;;;13721:29;13743:6;13721:29;;;13716:3;13712:39;13705:46;;13507:249;;;;;;13763:146;13851:52;13897:5;13851:52;;;13846:3;13839:65;13833:76;;;13916:156;14014:52;14060:5;14014:52;;;14009:3;14002:65;13996:76;;;14079:347;;14191:39;14224:5;14191:39;;;14242:71;14306:6;14301:3;14242:71;;;14235:78;;14318:52;14363:6;14358:3;14351:4;14344:5;14340:16;14318:52;;;14391:29;14413:6;14391:29;;;14386:3;14382:39;14375:46;;14171:255;;;;;;14434:328;;14594:67;14658:2;14653:3;14594:67;;;14587:74;;14694:30;14690:1;14685:3;14681:11;14674:51;14753:2;14748:3;14744:12;14737:19;;14580:182;;;;14771:322;;14931:67;14995:2;14990:3;14931:67;;;14924:74;;15031:24;15027:1;15022:3;15018:11;15011:45;15084:2;15079:3;15075:12;15068:19;;14917:176;;;;15102:371;;15262:67;15326:2;15321:3;15262:67;;;15255:74;;15362:34;15358:1;15353:3;15349:11;15342:55;15431:4;15426:2;15421:3;15417:12;15410:26;15464:2;15459:3;15455:12;15448:19;;15248:225;;;;15482:330;;15642:67;15706:2;15701:3;15642:67;;;15635:74;;15742:32;15738:1;15733:3;15729:11;15722:53;15803:2;15798:3;15794:12;15787:19;;15628:184;;;;15821:384;;15981:67;16045:2;16040:3;15981:67;;;15974:74;;16081:34;16077:1;16072:3;16068:11;16061:55;16150:17;16145:2;16140:3;16136:12;16129:39;16196:2;16191:3;16187:12;16180:19;;15967:238;;;;16214:321;;16374:67;16438:2;16433:3;16374:67;;;16367:74;;16474:23;16470:1;16465:3;16461:11;16454:44;16526:2;16521:3;16517:12;16510:19;;16360:175;;;;16544:320;;16704:67;16768:2;16763:3;16704:67;;;16697:74;;16804:22;16800:1;16795:3;16791:11;16784:43;16855:2;16850:3;16846:12;16839:19;;16690:174;;;;16873:331;;17033:67;17097:2;17092:3;17033:67;;;17026:74;;17133:33;17129:1;17124:3;17120:11;17113:54;17195:2;17190:3;17186:12;17179:19;;17019:185;;;;17213:322;;17373:67;17437:2;17432:3;17373:67;;;17366:74;;17473:24;17469:1;17464:3;17460:11;17453:45;17526:2;17521:3;17517:12;17510:19;;17359:176;;;;17544:327;;17704:67;17768:2;17763:3;17704:67;;;17697:74;;17804:29;17800:1;17795:3;17791:11;17784:50;17862:2;17857:3;17853:12;17846:19;;17690:181;;;;17880:326;;18040:67;18104:2;18099:3;18040:67;;;18033:74;;18140:28;18136:1;18131:3;18127:11;18120:49;18197:2;18192:3;18188:12;18181:19;;18026:180;;;;18215:332;;18375:67;18439:2;18434:3;18375:67;;;18368:74;;18475:34;18471:1;18466:3;18462:11;18455:55;18538:2;18533:3;18529:12;18522:19;;18361:186;;;;18556:385;;18716:67;18780:2;18775:3;18716:67;;;18709:74;;18816:34;18812:1;18807:3;18803:11;18796:55;18885:18;18880:2;18875:3;18871:12;18864:40;18932:2;18927:3;18923:12;18916:19;;18702:239;;;;18950:332;;19110:67;19174:2;19169:3;19110:67;;;19103:74;;19210:34;19206:1;19201:3;19197:11;19190:55;19273:2;19268:3;19264:12;19257:19;;19096:186;;;;19291:316;;19451:67;19515:2;19510:3;19451:67;;;19444:74;;19551:18;19547:1;19542:3;19538:11;19531:39;19598:2;19593:3;19589:12;19582:19;;19437:170;;;;19616:330;;19776:67;19840:2;19835:3;19776:67;;;19769:74;;19876:32;19872:1;19867:3;19863:11;19856:53;19937:2;19932:3;19928:12;19921:19;;19762:184;;;;19955:379;;20115:67;20179:2;20174:3;20115:67;;;20108:74;;20215:34;20211:1;20206:3;20202:11;20195:55;20284:12;20279:2;20274:3;20270:12;20263:34;20325:2;20320:3;20316:12;20309:19;;20101:233;;;;20343:332;;20503:67;20567:2;20562:3;20503:67;;;20496:74;;20603:34;20599:1;20594:3;20590:11;20583:55;20666:2;20661:3;20657:12;20650:19;;20489:186;;;;20684:330;;20844:67;20908:2;20903:3;20844:67;;;20837:74;;20944:32;20940:1;20935:3;20931:11;20924:53;21005:2;21000:3;20996:12;20989:19;;20830:184;;;;21023:331;;21183:67;21247:2;21242:3;21183:67;;;21176:74;;21283:33;21279:1;21274:3;21270:11;21263:54;21345:2;21340:3;21336:12;21329:19;;21169:185;;;;21363:348;;21541:85;21623:2;21618:3;21541:85;;;21534:92;;21659:14;21655:1;21650:3;21646:11;21639:35;21702:2;21697:3;21693:12;21686:19;;21527:184;;;;21720:317;;21880:67;21944:2;21939:3;21880:67;;;21873:74;;21980:19;21976:1;21971:3;21967:11;21960:40;22028:2;22023:3;22019:12;22012:19;;21866:171;;;;22046:325;;22206:67;22270:2;22265:3;22206:67;;;22199:74;;22306:27;22302:1;22297:3;22293:11;22286:48;22362:2;22357:3;22353:12;22346:19;;22192:179;;;;22380:384;;22540:67;22604:2;22599:3;22540:67;;;22533:74;;22640:34;22636:1;22631:3;22627:11;22620:55;22709:17;22704:2;22699:3;22695:12;22688:39;22755:2;22750:3;22746:12;22739:19;;22526:238;;;;22827:1362;;22976:4;22971:3;22967:14;23066:4;23059:5;23055:16;23049:23;23078:63;23135:4;23130:3;23126:14;23112:12;23078:63;;;22996:151;23225:4;23218:5;23214:16;23208:23;23237:63;23294:4;23289:3;23285:14;23271:12;23237:63;;;23157:149;23384:4;23377:5;23373:16;23367:23;23436:3;23430:4;23426:14;23419:4;23414:3;23410:14;23403:38;23456:99;23550:4;23536:12;23456:99;;;23448:107;;23316:251;23644:4;23637:5;23633:16;23627:23;23696:3;23690:4;23686:14;23679:4;23674:3;23670:14;23663:38;23716:99;23810:4;23796:12;23716:99;;;23708:107;;23577:250;23903:4;23896:5;23892:16;23886:23;23915:78;23987:4;23982:3;23978:14;23964:12;23915:78;;;23837:162;24082:4;24075:5;24071:16;24065:23;24094:63;24151:4;24146:3;24142:14;24128:12;24094:63;;;24009:154;24180:4;24173:11;;22949:1240;;;;;;24196:103;24269:24;24287:5;24269:24;;;24264:3;24257:37;24251:48;;;24306:113;24389:24;24407:5;24389:24;;;24384:3;24377:37;24371:48;;;24426:110;24507:23;24524:5;24507:23;;;24502:3;24495:36;24489:47;;;24543:107;24622:22;24638:5;24622:22;;;24617:3;24610:35;24604:46;;;24657:421;;24832:75;24903:3;24894:6;24832:75;;;24929:2;24924:3;24920:12;24913:19;;24950:103;25049:3;25040:6;25032;24950:103;;;24943:110;;25070:3;25063:10;;24820:258;;;;;;;25085:372;;25284:148;25428:3;25284:148;;;25277:155;;25449:3;25442:10;;25265:192;;;;25464:213;;25582:2;25571:9;25567:18;25559:26;;25596:71;25664:1;25653:9;25649:17;25640:6;25596:71;;;25553:124;;;;;25684:229;;25810:2;25799:9;25795:18;25787:26;;25824:79;25900:1;25889:9;25885:17;25876:6;25824:79;;;25781:132;;;;;25920:435;;26094:2;26083:9;26079:18;26071:26;;26108:71;26176:1;26165:9;26161:17;26152:6;26108:71;;;26190:72;26258:2;26247:9;26243:18;26234:6;26190:72;;;26273;26341:2;26330:9;26326:18;26317:6;26273:72;;;26065:290;;;;;;;26362:201;;26474:2;26463:9;26459:18;26451:26;;26488:65;26550:1;26539:9;26535:17;26526:6;26488:65;;;26445:118;;;;;26570:213;;26688:2;26677:9;26673:18;26665:26;;26702:71;26770:1;26759:9;26755:17;26746:6;26702:71;;;26659:124;;;;;26790:324;;26936:2;26925:9;26921:18;26913:26;;26950:71;27018:1;27007:9;27003:17;26994:6;26950:71;;;27032:72;27100:2;27089:9;27085:18;27076:6;27032:72;;;26907:207;;;;;;27121:539;;27319:3;27308:9;27304:19;27296:27;;27334:71;27402:1;27391:9;27387:17;27378:6;27334:71;;;27416:72;27484:2;27473:9;27469:18;27460:6;27416:72;;;27499:70;27565:2;27554:9;27550:18;27541:6;27499:70;;;27580;27646:2;27635:9;27631:18;27622:6;27580:70;;;27290:370;;;;;;;;27667:324;;27813:2;27802:9;27798:18;27790:26;;27827:71;27895:1;27884:9;27880:17;27871:6;27827:71;;;27909:72;27977:2;27966:9;27962:18;27953:6;27909:72;;;27784:207;;;;;;27998:577;;28215:3;28204:9;28200:19;28192:27;;28230:71;28298:1;28287:9;28283:17;28274:6;28230:71;;;28312:72;28380:2;28369:9;28365:18;28356:6;28312:72;;;28395:87;28478:2;28467:9;28463:18;28454:6;28395:87;;;28493:72;28561:2;28550:9;28546:18;28537:6;28493:72;;;28186:389;;;;;;;;28582:428;;28756:2;28745:9;28741:18;28733:26;;28770:71;28838:1;28827:9;28823:17;28814:6;28770:71;;;28889:9;28883:4;28879:20;28874:2;28863:9;28859:18;28852:48;28914:86;28995:4;28986:6;28978;28914:86;;;28906:94;;28727:283;;;;;;;29017:767;;29277:3;29266:9;29262:19;29254:27;;29292:71;29360:1;29349:9;29345:17;29336:6;29292:71;;;29374:68;29438:2;29427:9;29423:18;29414:6;29374:68;;;29453:70;29519:2;29508:9;29504:18;29495:6;29453:70;;;29534:80;29610:2;29599:9;29595:18;29586:6;29534:80;;;29663:9;29657:4;29653:20;29647:3;29636:9;29632:19;29625:49;29688:86;29769:4;29760:6;29752;29688:86;;;29680:94;;29248:536;;;;;;;;;;29791:289;;29923:2;29912:9;29908:18;29900:26;;29973:9;29967:4;29963:20;29959:1;29948:9;29944:17;29937:47;29998:72;30065:4;30056:6;29998:72;;;29990:80;;29894:186;;;;;30087:301;;30225:2;30214:9;30210:18;30202:26;;30275:9;30269:4;30265:20;30261:1;30250:9;30246:17;30239:47;30300:78;30373:4;30364:6;30300:78;;;30292:86;;30196:192;;;;;30395:407;;30586:2;30575:9;30571:18;30563:26;;30636:9;30630:4;30626:20;30622:1;30611:9;30607:17;30600:47;30661:131;30787:4;30661:131;;;30653:139;;30557:245;;;;30809:407;;31000:2;30989:9;30985:18;30977:26;;31050:9;31044:4;31040:20;31036:1;31025:9;31021:17;31014:47;31075:131;31201:4;31075:131;;;31067:139;;30971:245;;;;31223:407;;31414:2;31403:9;31399:18;31391:26;;31464:9;31458:4;31454:20;31450:1;31439:9;31435:17;31428:47;31489:131;31615:4;31489:131;;;31481:139;;31385:245;;;;31637:407;;31828:2;31817:9;31813:18;31805:26;;31878:9;31872:4;31868:20;31864:1;31853:9;31849:17;31842:47;31903:131;32029:4;31903:131;;;31895:139;;31799:245;;;;32051:407;;32242:2;32231:9;32227:18;32219:26;;32292:9;32286:4;32282:20;32278:1;32267:9;32263:17;32256:47;32317:131;32443:4;32317:131;;;32309:139;;32213:245;;;;32465:407;;32656:2;32645:9;32641:18;32633:26;;32706:9;32700:4;32696:20;32692:1;32681:9;32677:17;32670:47;32731:131;32857:4;32731:131;;;32723:139;;32627:245;;;;32879:407;;33070:2;33059:9;33055:18;33047:26;;33120:9;33114:4;33110:20;33106:1;33095:9;33091:17;33084:47;33145:131;33271:4;33145:131;;;33137:139;;33041:245;;;;33293:407;;33484:2;33473:9;33469:18;33461:26;;33534:9;33528:4;33524:20;33520:1;33509:9;33505:17;33498:47;33559:131;33685:4;33559:131;;;33551:139;;33455:245;;;;33707:407;;33898:2;33887:9;33883:18;33875:26;;33948:9;33942:4;33938:20;33934:1;33923:9;33919:17;33912:47;33973:131;34099:4;33973:131;;;33965:139;;33869:245;;;;34121:407;;34312:2;34301:9;34297:18;34289:26;;34362:9;34356:4;34352:20;34348:1;34337:9;34333:17;34326:47;34387:131;34513:4;34387:131;;;34379:139;;34283:245;;;;34535:407;;34726:2;34715:9;34711:18;34703:26;;34776:9;34770:4;34766:20;34762:1;34751:9;34747:17;34740:47;34801:131;34927:4;34801:131;;;34793:139;;34697:245;;;;34949:407;;35140:2;35129:9;35125:18;35117:26;;35190:9;35184:4;35180:20;35176:1;35165:9;35161:17;35154:47;35215:131;35341:4;35215:131;;;35207:139;;35111:245;;;;35363:407;;35554:2;35543:9;35539:18;35531:26;;35604:9;35598:4;35594:20;35590:1;35579:9;35575:17;35568:47;35629:131;35755:4;35629:131;;;35621:139;;35525:245;;;;35777:407;;35968:2;35957:9;35953:18;35945:26;;36018:9;36012:4;36008:20;36004:1;35993:9;35989:17;35982:47;36043:131;36169:4;36043:131;;;36035:139;;35939:245;;;;36191:407;;36382:2;36371:9;36367:18;36359:26;;36432:9;36426:4;36422:20;36418:1;36407:9;36403:17;36396:47;36457:131;36583:4;36457:131;;;36449:139;;36353:245;;;;36605:407;;36796:2;36785:9;36781:18;36773:26;;36846:9;36840:4;36836:20;36832:1;36821:9;36817:17;36810:47;36871:131;36997:4;36871:131;;;36863:139;;36767:245;;;;37019:407;;37210:2;37199:9;37195:18;37187:26;;37260:9;37254:4;37250:20;37246:1;37235:9;37231:17;37224:47;37285:131;37411:4;37285:131;;;37277:139;;37181:245;;;;37433:407;;37624:2;37613:9;37609:18;37601:26;;37674:9;37668:4;37664:20;37660:1;37649:9;37645:17;37638:47;37699:131;37825:4;37699:131;;;37691:139;;37595:245;;;;37847:407;;38038:2;38027:9;38023:18;38015:26;;38088:9;38082:4;38078:20;38074:1;38063:9;38059:17;38052:47;38113:131;38239:4;38113:131;;;38105:139;;38009:245;;;;38261:407;;38452:2;38441:9;38437:18;38429:26;;38502:9;38496:4;38492:20;38488:1;38477:9;38473:17;38466:47;38527:131;38653:4;38527:131;;;38519:139;;38423:245;;;;38675:407;;38866:2;38855:9;38851:18;38843:26;;38916:9;38910:4;38906:20;38902:1;38891:9;38887:17;38880:47;38941:131;39067:4;38941:131;;;38933:139;;38837:245;;;;39089:407;;39280:2;39269:9;39265:18;39257:26;;39330:9;39324:4;39320:20;39316:1;39305:9;39301:17;39294:47;39355:131;39481:4;39355:131;;;39347:139;;39251:245;;;;39503:407;;39694:2;39683:9;39679:18;39671:26;;39744:9;39738:4;39734:20;39730:1;39719:9;39715:17;39708:47;39769:131;39895:4;39769:131;;;39761:139;;39665:245;;;;39917:357;;40083:2;40072:9;40068:18;40060:26;;40133:9;40127:4;40123:20;40119:1;40108:9;40104:17;40097:47;40158:106;40259:4;40250:6;40158:106;;;40150:114;;40054:220;;;;;40281:213;;40399:2;40388:9;40384:18;40376:26;;40413:71;40481:1;40470:9;40466:17;40457:6;40413:71;;;40370:124;;;;;40501:209;;40617:2;40606:9;40602:18;40594:26;;40631:69;40697:1;40686:9;40682:17;40673:6;40631:69;;;40588:122;;;;;40717:205;;40831:2;40820:9;40816:18;40808:26;;40845:67;40909:1;40898:9;40894:17;40885:6;40845:67;;;40802:120;;;;;40929:147;;41011:3;41003:11;;41049:4;41044:3;41040:14;41032:22;;40997:79;;;;41083:133;;41188:5;41182:12;41172:22;;41153:63;;;;41223:117;;41312:5;41306:12;41296:22;;41277:63;;;;41347:122;;41441:5;41435:12;41425:22;;41406:63;;;;41476:104;;41570:4;41565:3;41561:14;41553:22;;41547:33;;;;41588:168;;41708:6;41703:3;41696:19;41745:4;41740:3;41736:14;41721:29;;41689:67;;;;;41765:162;;41879:6;41874:3;41867:19;41916:4;41911:3;41907:14;41892:29;;41860:67;;;;;41936:144;;42071:3;42056:18;;42049:31;;;;;42089:163;;42204:6;42199:3;42192:19;42241:4;42236:3;42232:14;42217:29;;42185:67;;;;;42261:145;;42397:3;42382:18;;42375:31;;;;;42414:91;;42476:24;42494:5;42476:24;;;42465:35;;42459:46;;;;42512:99;;42582:24;42600:5;42582:24;;;42571:35;;42565:46;;;;42618:85;;42691:5;42684:13;42677:21;42666:32;;42660:43;;;;42710:72;;42772:5;42761:16;;42755:27;;;;42789:144;;42861:66;42854:5;42850:78;42839:89;;42833:100;;;;42940:140;;43019:5;43008:16;;43025:50;43069:5;43025:50;;;43002:78;;;;43087:121;;43160:42;43153:5;43149:54;43138:65;;43132:76;;;;43215:72;;43277:5;43266:16;;43260:27;;;;43294:96;;43366:18;43359:5;43355:30;43344:41;;43338:52;;;;43397:98;;43469:20;43462:5;43458:32;43447:43;;43441:54;;;;43502:81;;43573:4;43566:5;43562:16;43551:27;;43545:38;;;;43590:129;;43677:37;43708:5;43677:37;;;43664:50;;43658:61;;;;43726:140;;43820:41;43855:5;43820:41;;;43807:54;;43801:65;;;;43873:121;;43952:37;43983:5;43952:37;;;43939:50;;43933:61;;;;44001:108;;44080:24;44098:5;44080:24;;;44067:37;;44061:48;;;;44117:145;44198:6;44193:3;44188;44175:30;44254:1;44245:6;44240:3;44236:16;44229:27;44168:94;;;;44271:268;44336:1;44343:101;44357:6;44354:1;44351:13;44343:101;;;44433:1;44428:3;44424:11;44418:18;44414:1;44409:3;44405:11;44398:39;44379:2;44376:1;44372:10;44367:15;;44343:101;;;44459:6;44456:1;44453:13;44450:2;;;44524:1;44515:6;44510:3;44506:16;44499:27;44450:2;44320:219;;;;;44547:95;;44611:26;44631:5;44611:26;;;44600:37;;44594:48;;;;44649:89;;44713:20;44727:5;44713:20;;;44702:31;;44696:42;;;;44745:97;;44833:2;44829:7;44824:2;44817:5;44813:14;44809:28;44799:38;;44793:49;;;;44850:94;;44928:5;44924:2;44920:14;44898:36;;44892:52;;;;44952:108;45038:1;45031:5;45028:12;45018:2;;45044:9;45018:2;45012:48;;45067:117;45136:24;45154:5;45136:24;;;45129:5;45126:35;45116:2;;45175:1;45172;45165:12;45116:2;45110:74;;45191:133;45268:32;45294:5;45268:32;;;45261:5;45258:43;45248:2;;45315:1;45312;45305:12;45248:2;45242:82;;45331:117;45400:24;45418:5;45400:24;;;45393:5;45390:35;45380:2;;45439:1;45436;45429:12;45380:2;45374:74;;45455:115;45523:23;45540:5;45523:23;;;45516:5;45513:34;45503:2;;45561:1;45558;45551:12;45503:2;45497:73;;45577:117;45646:24;45664:5;45646:24;;;45639:5;45636:35;45626:2;;45685:1;45682;45675:12;45626:2;45620:74;;45701:115;45769:23;45786:5;45769:23;;;45762:5;45759:34;45749:2;;45807:1;45804;45797:12;45749:2;45743:73;;45823:115;45891:23;45908:5;45891:23;;;45884:5;45881:34;45871:2;;45929:1;45926;45919:12;45871:2;45865:73;;45945:113;46012:22;46028:5;46012:22;;;46005:5;46002:33;45992:2;;46049:1;46046;46039:12;45992:2;45986:72;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "3594200",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"DEFAULT_ADMIN_ROLE()": "446",
"RELAYER_ROLE()": "605",
"_chainID()": "1216",
"_depositCounts(uint8)": "1548",
"_depositRecords(uint64,uint8)": "infinite",
"_expiry()": "1218",
"_fee()": "1196",
"_hasVotedOnProposal(uint72,bytes32,address)": "2115",
"_proposals(uint72,bytes32)": "infinite",
"_relayerThreshold()": "1217",
"_resourceIDToHandlerAddress(bytes32)": "1585",
"_totalProposals()": "1196",
"_totalRelayers()": "1240",
"adminAddRelayer(address)": "infinite",
"adminChangeFee(uint256)": "infinite",
"adminChangeRelayerThreshold(uint256)": "infinite",
"adminPauseTransfers()": "infinite",
"adminRemoveRelayer(address)": "infinite",
"adminSetBurnable(address,address)": "infinite",
"adminSetGenericResource(address,bytes32,address,bytes4,bytes4)": "infinite",
"adminSetResource(address,bytes32,address)": "infinite",
"adminUnpauseTransfers()": "infinite",
"adminWithdraw(address,address,address,uint256)": "infinite",
"cancelProposal(uint8,uint64,bytes32)": "infinite",
"deposit(uint8,bytes32,bytes)": "infinite",
"executeProposal(uint8,uint64,bytes,bytes32)": "infinite",
"getProposal(uint8,uint64,bytes32)": "infinite",
"getRoleAdmin(bytes32)": "infinite",
"getRoleMember(bytes32,uint256)": "infinite",
"getRoleMemberCount(bytes32)": "1703",
"grantRole(bytes32,address)": "infinite",
"hasRole(bytes32,address)": "infinite",
"isRelayer(address)": "infinite",
"paused()": "1313",
"renounceAdmin(address)": "infinite",
"renounceRole(bytes32,address)": "infinite",
"revokeRole(bytes32,address)": "infinite",
"transferFunds(address[],uint256[])": "infinite",
"voteProposal(uint8,uint64,bytes32,bytes32)": "infinite"
},
"internal": {
"_onlyAdmin()": "infinite",
"_onlyAdminOrRelayer()": "infinite",
"_onlyRelayers()": "infinite"
}
},
"methodIdentifiers": {
"DEFAULT_ADMIN_ROLE()": "a217fddf",
"RELAYER_ROLE()": "926d7d7f",
"_chainID()": "beab7131",
"_depositCounts(uint8)": "4b0b919d",
"_depositRecords(uint64,uint8)": "3ee7094a",
"_expiry()": "c5ec8970",
"_fee()": "c5b37c22",
"_hasVotedOnProposal(uint72,bytes32,address)": "7febe63f",
"_proposals(uint72,bytes32)": "50598719",
"_relayerThreshold()": "d7a9cd79",
"_resourceIDToHandlerAddress(bytes32)": "84db809f",
"_totalProposals()": "9d5773e0",
"_totalRelayers()": "802aabe8",
"adminAddRelayer(address)": "cdb0f73a",
"adminChangeFee(uint256)": "91c404ac",
"adminChangeRelayerThreshold(uint256)": "4e056005",
"adminPauseTransfers()": "80ae1c28",
"adminRemoveRelayer(address)": "9d82dd63",
"adminSetBurnable(address,address)": "8c0c2631",
"adminSetGenericResource(address,bytes32,address,bytes4,bytes4)": "e8437ee7",
"adminSetResource(address,bytes32,address)": "cb10f215",
"adminUnpauseTransfers()": "ffaac0eb",
"adminWithdraw(address,address,address,uint256)": "780cf004",
"cancelProposal(uint8,uint64,bytes32)": "17f03ce5",
"deposit(uint8,bytes32,bytes)": "05e2ca17",
"executeProposal(uint8,uint64,bytes,bytes32)": "4454b20d",
"getProposal(uint8,uint64,bytes32)": "a9cf69fa",
"getRoleAdmin(bytes32)": "248a9ca3",
"getRoleMember(bytes32,uint256)": "9010d07c",
"getRoleMemberCount(bytes32)": "ca15c873",
"grantRole(bytes32,address)": "2f2ff15d",
"hasRole(bytes32,address)": "91d14854",
"isRelayer(address)": "541d5548",
"paused()": "5c975abb",
"renounceAdmin(address)": "5e1fab0f",
"renounceRole(bytes32,address)": "36568abe",
"revokeRole(bytes32,address)": "d547741f",
"transferFunds(address[],uint256[])": "4603ae38",
"voteProposal(uint8,uint64,bytes32,bytes32)": "1ff013f1"
}
},
"abi": [
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "address[]",
"name": "initialRelayers",
"type": "address[]"
},
{
"internalType": "uint256",
"name": "initialRelayerThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "originChainID",
"type": "uint8"
},
{
"indexed": true,
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"indexed": true,
"internalType": "enum Bridge.ProposalStatus",
"name": "status",
"type": "uint8"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "ProposalEvent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "originChainID",
"type": "uint8"
},
{
"indexed": true,
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"indexed": true,
"internalType": "enum Bridge.ProposalStatus",
"name": "status",
"type": "uint8"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
}
],
"name": "ProposalVote",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "relayer",
"type": "address"
}
],
"name": "RelayerAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "relayer",
"type": "address"
}
],
"name": "RelayerRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "newThreshold",
"type": "uint256"
}
],
"name": "RelayerThresholdChanged",
"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": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RELAYER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_chainID",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"name": "_depositCounts",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
},
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"name": "_depositRecords",
"outputs": [
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_expiry",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_fee",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint72",
"name": "",
"type": "uint72"
},
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_hasVotedOnProposal",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint72",
"name": "",
"type": "uint72"
},
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_proposals",
"outputs": [
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_dataHash",
"type": "bytes32"
},
{
"internalType": "enum Bridge.ProposalStatus",
"name": "_status",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "_proposedBlock",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_relayerThreshold",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToHandlerAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_totalProposals",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_totalRelayers",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "relayerAddress",
"type": "address"
}
],
"name": "adminAddRelayer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newFee",
"type": "uint256"
}
],
"name": "adminChangeFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newThreshold",
"type": "uint256"
}
],
"name": "adminChangeRelayerThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "adminPauseTransfers",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "relayerAddress",
"type": "address"
}
],
"name": "adminRemoveRelayer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "adminSetBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "bytes4",
"name": "depositFunctionSig",
"type": "bytes4"
},
{
"internalType": "bytes4",
"name": "executeFunctionSig",
"type": "bytes4"
}
],
"name": "adminSetGenericResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "adminSetResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "adminUnpauseTransfers",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOrTokenID",
"type": "uint256"
}
],
"name": "adminWithdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "cancelProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "originChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "getProposal",
"outputs": [
{
"components": [
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_dataHash",
"type": "bytes32"
},
{
"internalType": "address[]",
"name": "_yesVotes",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "_noVotes",
"type": "address[]"
},
{
"internalType": "enum Bridge.ProposalStatus",
"name": "_status",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "_proposedBlock",
"type": "uint256"
}
],
"internalType": "struct Bridge.Proposal",
"name": "",
"type": "tuple"
}
],
"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": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "getRoleMember",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleMemberCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "address",
"name": "relayer",
"type": "address"
}
],
"name": "isRelayer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "renounceAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"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": "address payable[]",
"name": "addrs",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"name": "transferFunds",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "voteProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "address[]",
"name": "initialRelayers",
"type": "address[]"
},
{
"internalType": "uint256",
"name": "initialRelayerThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "originChainID",
"type": "uint8"
},
{
"indexed": true,
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"indexed": true,
"internalType": "enum Bridge.ProposalStatus",
"name": "status",
"type": "uint8"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "ProposalEvent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "originChainID",
"type": "uint8"
},
{
"indexed": true,
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"indexed": true,
"internalType": "enum Bridge.ProposalStatus",
"name": "status",
"type": "uint8"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
}
],
"name": "ProposalVote",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "relayer",
"type": "address"
}
],
"name": "RelayerAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "relayer",
"type": "address"
}
],
"name": "RelayerRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "newThreshold",
"type": "uint256"
}
],
"name": "RelayerThresholdChanged",
"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": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RELAYER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_chainID",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"name": "_depositCounts",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
},
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"name": "_depositRecords",
"outputs": [
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_expiry",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_fee",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint72",
"name": "",
"type": "uint72"
},
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_hasVotedOnProposal",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint72",
"name": "",
"type": "uint72"
},
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_proposals",
"outputs": [
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_dataHash",
"type": "bytes32"
},
{
"internalType": "enum Bridge.ProposalStatus",
"name": "_status",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "_proposedBlock",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_relayerThreshold",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToHandlerAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_totalProposals",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_totalRelayers",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "relayerAddress",
"type": "address"
}
],
"name": "adminAddRelayer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newFee",
"type": "uint256"
}
],
"name": "adminChangeFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newThreshold",
"type": "uint256"
}
],
"name": "adminChangeRelayerThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "adminPauseTransfers",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "relayerAddress",
"type": "address"
}
],
"name": "adminRemoveRelayer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "adminSetBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "bytes4",
"name": "depositFunctionSig",
"type": "bytes4"
},
{
"internalType": "bytes4",
"name": "executeFunctionSig",
"type": "bytes4"
}
],
"name": "adminSetGenericResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "adminSetResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "adminUnpauseTransfers",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "handlerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOrTokenID",
"type": "uint256"
}
],
"name": "adminWithdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "cancelProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "originChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "getProposal",
"outputs": [
{
"components": [
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_dataHash",
"type": "bytes32"
},
{
"internalType": "address[]",
"name": "_yesVotes",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "_noVotes",
"type": "address[]"
},
{
"internalType": "enum Bridge.ProposalStatus",
"name": "_status",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "_proposedBlock",
"type": "uint256"
}
],
"internalType": "struct Bridge.Proposal",
"name": "",
"type": "tuple"
}
],
"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": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "getRoleMember",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleMemberCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "address",
"name": "relayer",
"type": "address"
}
],
"name": "isRelayer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "renounceAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"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": "address payable[]",
"name": "addrs",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"name": "transferFunds",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "chainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "dataHash",
"type": "bytes32"
}
],
"name": "voteProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"adminAddRelayer(address)": {
"params": {
"relayerAddress": "Address of relayer to be added."
}
},
"adminChangeFee(uint256)": {
"params": {
"newFee": "Value {_fee} will be updated to."
}
},
"adminChangeRelayerThreshold(uint256)": {
"params": {
"newThreshold": "Value {_relayerThreshold} will be changed to."
}
},
"adminRemoveRelayer(address)": {
"params": {
"relayerAddress": "Address of relayer to be removed."
}
},
"adminSetBurnable(address,address)": {
"params": {
"handlerAddress": "Address of handler resource will be set for.",
"tokenAddress": "Address of contract to be called when a deposit is made and a deposited is executed."
}
},
"adminSetGenericResource(address,bytes32,address,bytes4,bytes4)": {
"params": {
"contractAddress": "Address of contract to be called when a deposit is made and a deposited is executed.",
"handlerAddress": "Address of handler resource will be set for.",
"resourceID": "ResourceID to be used when making deposits."
}
},
"adminSetResource(address,bytes32,address)": {
"params": {
"handlerAddress": "Address of handler resource will be set for.",
"resourceID": "ResourceID to be used when making deposits.",
"tokenAddress": "Address of contract to be called when a deposit is made and a deposited is executed."
}
},
"adminWithdraw(address,address,address,uint256)": {
"params": {
"amountOrTokenID": "Either the amount of ERC20 tokens or the ERC721 token ID to withdraw.",
"handlerAddress": "Address of handler to withdraw from.",
"recipient": "Address to withdraw tokens to.",
"tokenAddress": "Address of token to withdraw."
}
},
"cancelProposal(uint8,uint64,bytes32)": {
"params": {
"chainID": "ID of chain deposit originated from.",
"dataHash": "Hash of data originally provided when deposit was made.",
"depositNonce": "ID of deposited generated by origin Bridge contract."
}
},
"constructor": {
"params": {
"chainID": "ID of chain the Bridge contract exists on.",
"initialRelayerThreshold": "Number of votes needed for a deposit proposal to be considered passed.",
"initialRelayers": "Addresses that should be initially granted the relayer role."
}
},
"deposit(uint8,bytes32,bytes)": {
"params": {
"data": "Additional data to be passed to specified handler.",
"destinationChainID": "ID of chain deposit will be bridged to.",
"resourceID": "ResourceID used to find address of handler to be used for deposit."
}
},
"executeProposal(uint8,uint64,bytes,bytes32)": {
"params": {
"chainID": "ID of chain deposit originated from.",
"data": "Data originally provided when deposit was made.",
"depositNonce": "ID of deposited generated by origin Bridge contract.",
"resourceID": "ResourceID to be used when making deposits."
}
},
"getProposal(uint8,uint64,bytes32)": {
"params": {
"dataHash": "Hash of data to be provided when deposit proposal is executed.",
"depositNonce": "ID of proposal generated by proposal's origin Bridge contract.",
"originChainID": "Chain ID deposit originated from."
},
"returns": {
"_0": "Proposal which consists of: - _dataHash Hash of data to be provided when deposit proposal is executed. - _yesVotes Number of votes in favor of proposal. - _noVotes Number of votes against proposal. - _status Current status of proposal."
}
},
"getRoleAdmin(bytes32)": {
"details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. * To change a role's admin, use {_setRoleAdmin}."
},
"getRoleMember(bytes32,uint256)": {
"details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. * Role bearers are not sorted in any particular way, and their ordering may change at any point. * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information."
},
"getRoleMemberCount(bytes32)": {
"details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role."
},
"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."
},
"hasRole(bytes32,address)": {
"details": "Returns `true` if `account` has been granted `role`."
},
"isRelayer(address)": {
"params": {
"relayer": "Address to check."
}
},
"paused()": {
"details": "Returns true if the contract is paused, and false otherwise."
},
"renounceAdmin(address)": {
"params": {
"newAdmin": "Address that admin role will be granted to."
}
},
"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 granted `role`, emits a {RoleRevoked} event. * Requirements: * - the caller must be `account`."
},
"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."
},
"transferFunds(address[],uint256[])": {
"params": {
"addrs": "Array of addresses to transfer {amounts} to.",
"amounts": "Array of amonuts to transfer to {addrs}."
}
},
"voteProposal(uint8,uint64,bytes32,bytes32)": {
"params": {
"chainID": "ID of chain deposit originated from.",
"dataHash": "Hash of data provided when deposit was made.",
"depositNonce": "ID of deposited generated by origin Bridge contract."
}
}
},
"title": "Facilitates deposits, creation and votiing of deposit proposals, and deposit executions."
},
"userdoc": {
"methods": {
"adminAddRelayer(address)": {
"notice": "Grants {relayerAddress} the relayer role and increases {_totalRelayer} count.Only callable by an address that currently has the admin role.Emits {RelayerAdded} event."
},
"adminChangeFee(uint256)": {
"notice": "Changes deposit fee.Only callable by admin."
},
"adminChangeRelayerThreshold(uint256)": {
"notice": "Modifies the number of votes required for a proposal to be considered passed.Only callable by an address that currently has the admin role.Emits {RelayerThresholdChanged} event."
},
"adminPauseTransfers()": {
"notice": "Pauses deposits, proposal creation and voting, and deposit executions.Only callable by an address that currently has the admin role."
},
"adminRemoveRelayer(address)": {
"notice": "Removes relayer role for {relayerAddress} and decreases {_totalRelayer} count.Only callable by an address that currently has the admin role.Emits {RelayerRemoved} event."
},
"adminSetBurnable(address,address)": {
"notice": "Sets a resource as burnable for handler contracts that use the IERCHandler interface.Only callable by an address that currently has the admin role."
},
"adminSetGenericResource(address,bytes32,address,bytes4,bytes4)": {
"notice": "Sets a new resource for handler contracts that use the IGenericHandler interface, and maps the {handlerAddress} to {resourceID} in {_resourceIDToHandlerAddress}.Only callable by an address that currently has the admin role."
},
"adminSetResource(address,bytes32,address)": {
"notice": "Sets a new resource for handler contracts that use the IERCHandler interface, and maps the {handlerAddress} to {resourceID} in {_resourceIDToHandlerAddress}.Only callable by an address that currently has the admin role."
},
"adminUnpauseTransfers()": {
"notice": "Unpauses deposits, proposal creation and voting, and deposit executions.Only callable by an address that currently has the admin role."
},
"adminWithdraw(address,address,address,uint256)": {
"notice": "Used to manually withdraw funds from ERC safes."
},
"cancelProposal(uint8,uint64,bytes32)": {
"notice": "Executes a deposit proposal that is considered passed using a specified handler contract.Only callable by relayers when Bridge is not paused.Proposal must be past expiry threshold.Emits {ProposalEvent} event with status {Cancelled}."
},
"constructor": "Initializes Bridge, creates and grants {msg.sender} the admin role, creates and grants {initialRelayers} the relayer role.",
"deposit(uint8,bytes32,bytes)": {
"notice": "Initiates a transfer using a specified handler contract.Only callable when Bridge is not paused.Emits {Deposit} event."
},
"executeProposal(uint8,uint64,bytes,bytes32)": {
"notice": "Executes a deposit proposal that is considered passed using a specified handler contract.Only callable by relayers when Bridge is not paused.Proposal must have Passed status.Hash of {data} must equal proposal's {dataHash}.Emits {ProposalEvent} event with status {Executed}."
},
"getProposal(uint8,uint64,bytes32)": {
"notice": "Returns a proposal."
},
"isRelayer(address)": {
"notice": "Returns true if {relayer} has the relayer role."
},
"renounceAdmin(address)": {
"notice": "Removes admin role from {msg.sender} and grants it to {newAdmin}.Only callable by an address that currently has the admin role."
},
"transferFunds(address[],uint256[])": {
"notice": "Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1. This means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0."
},
"voteProposal(uint8,uint64,bytes32,bytes32)": {
"notice": "When called, {msg.sender} will be marked as voting in favor of proposal.Only callable by relayers when Bridge is not paused.Proposal must not have already been passed or executed.{msg.sender} must not have already voted on proposal.Emits {ProposalEvent} event with status indicating the proposal status.Emits {ProposalVote} event."
}
}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/Bridge.sol": "Bridge"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/Bridge.sol": {
"keccak256": "0x85b2a1c37bee789ab028502c4d8f211a0c4262d4e386dd4238e3289942ae0f75",
"urls": [
"bzz-raw://a9191ea100092a9543d1f22ee5d382bfc670793c4a1dbe176f46f9d93a179401",
"dweb:/ipfs/QmSYWGkNafTk2WDEugXa1zRUyrV5Zy7FijuRgj6oturu2R"
]
},
"chain-bridge-solidity/interfaces/IBridge.sol": {
"keccak256": "0x69acbf5e85d70afb39f819efa08ff2442e8b122f35a012f6e37ed96fb35222b6",
"urls": [
"bzz-raw://02c37de0e9beefc6cf988b43980aaee9f68b2b60b34cc889aa374aeee135c13c",
"dweb:/ipfs/QmVZFyHbMq8KgMyboAspK1VK25kR2uXv6x6t6nh5dfERHF"
]
},
"chain-bridge-solidity/interfaces/IDepositExecute.sol": {
"keccak256": "0x0e294346387f78e5762ed8f30ef4ba23c577abc9e2dfbaeb29e97b1b5099aa35",
"urls": [
"bzz-raw://896aa03012baece6caca18cf66386717e1cd47e5700ea24f1a31589b3513d814",
"dweb:/ipfs/QmVJWiXZgEjFiZB21wsvkhHAUupNqBJ8FvZuJcB4X4NEvj"
]
},
"chain-bridge-solidity/interfaces/IERCHandler.sol": {
"keccak256": "0xae4a0687ed7310b0e5b1e82074b38bd492de3c14f33acf12486f7380cd523578",
"urls": [
"bzz-raw://0e4195985bfa8305ea9ca1ecd40d34023846a89f3313104e84aedb84069a2926",
"dweb:/ipfs/QmcrKQzMC6YnXRZeE8Wau4rYB815kXrFTpPWVJBkmSS4SV"
]
},
"chain-bridge-solidity/interfaces/IGenericHandler.sol": {
"keccak256": "0xaeb0f50bc06faa2cacce837cc232d486458c00e6891c038b36bb93c407ab626e",
"urls": [
"bzz-raw://638424b4684970cad852a437477e86b035f443f9f2dbb03a2d9f886a1488eec8",
"dweb:/ipfs/Qmcnas9wLSRaZVDdggHLRDrC5qvbh8e2NUmnoXtAtJ38Fh"
]
},
"chain-bridge-solidity/utils/Pausable.sol": {
"keccak256": "0xd995bcc6b4067ac18db610e47a2a969e8009cb311b017cdd34fc2b46c3be7020",
"urls": [
"bzz-raw://53e0d1dc839eb40ba23a887d302f26764eed0fe035d0e519be6a1099a1237b33",
"dweb:/ipfs/QmbMhz1VEBxhRsz6par2rKgErxFphimiCqrmCREiusVDHv"
]
},
"chain-bridge-solidity/utils/SafeMath.sol": {
"keccak256": "0x0f714e07671743649ebdc961f0380ecb7b86b9572e4a43f77e18c77c015e2977",
"urls": [
"bzz-raw://d39b51548731cf4968c01ad302330697df92c297d4edace1c4c020017178264d",
"dweb:/ipfs/QmeNowPEdLsw558fStna6zoh4actw95gVXB5pU5YAoqAzg"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/GSN/Context.sol": {
"keccak256": "0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0",
"urls": [
"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f",
"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/access/AccessControl.sol": {
"keccak256": "0x37ff88aa5ca8f533e31b9e1cb5354816b15bb7d41c904ea1c8f5dd5a78d6da25",
"urls": [
"bzz-raw://f3731db435ced7084f2cb3947e708371c10a2e3f654dcfe2a237fc8fbdafbe5f",
"dweb:/ipfs/QmUyiwkuiP2fYBVaTwwY82sJKxJyPQaBqAtS4uG6iaUSP7"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/Address.sol": {
"keccak256": "0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8",
"urls": [
"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0",
"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/EnumerableSet.sol": {
"keccak256": "0xae0992eb1ec30fd1ecdf2e04a6036decfc9797bf11dc1ec84b546b74318d5ec2",
"urls": [
"bzz-raw://3b61f99a64e999682ad7bfbb3a1c762a20a0a5b30f9f2011693fa857969af61f",
"dweb:/ipfs/QmZystFY76wkWCf7V3yKh3buZuKVKbswiE7y6yU62kk3zi"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b506103af806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806395601f0914610030575b600080fd5b61009c6004803603606081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061009e565b005b60008390506100af818430856100b5565b50505050565b61019c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506101a2565b50505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106101f157805182526020820191506020810190506020830392506101ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610253576040519150601f19603f3d011682016040523d82523d6000602084013e610258565b606091505b5091509150816102d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f45524332303a2063616c6c206661696c6564000000000000000000000000000081525060200191505060405180910390fd5b600081511115610373578080602001905160208110156102ef57600080fd5b8101908080519060200190929190505050610372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f45524332303a206f7065726174696f6e20646964206e6f74207375636365656481525060200191505060405180910390fd5b5b5050505056fea2646970667358221220c558fc008fca4a116b01ecb3c46fce52bb42e275a99b56b4cb6b10abb5bf815964736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3AF DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95601F09 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9E JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP PUSH2 0xAF DUP2 DUP5 ADDRESS DUP6 PUSH2 0xB5 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x19C DUP5 PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH2 0x1A2 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1F1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1CE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x253 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x258 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x45524332303A2063616C6C206661696C65640000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x373 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x372 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x45524332303A206F7065726174696F6E20646964206E6F742073756363656564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 PC 0xFC STOP DUP16 0xCA 0x4A GT PUSH12 0x1ECB3C46FCE52BB42E275A9 SWAP12 JUMP 0xB4 0xCB PUSH12 0x10ABB5BF815964736F6C6343 STOP MOD DIV STOP CALLER ",
"sourceMap": "657:3612:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;657:3612:0;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c806395601f0914610030575b600080fd5b61009c6004803603606081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061009e565b005b60008390506100af818430856100b5565b50505050565b61019c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506101a2565b50505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106101f157805182526020820191506020810190506020830392506101ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610253576040519150601f19603f3d011682016040523d82523d6000602084013e610258565b606091505b5091509150816102d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f45524332303a2063616c6c206661696c6564000000000000000000000000000081525060200191505060405180910390fd5b600081511115610373578080602001905160208110156102ef57600080fd5b8101908080519060200190929190505050610372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f45524332303a206f7065726174696f6e20646964206e6f74207375636365656481525060200191505060405180910390fd5b5b5050505056fea2646970667358221220c558fc008fca4a116b01ecb3c46fce52bb42e275a99b56b4cb6b10abb5bf815964736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95601F09 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9E JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP PUSH2 0xAF DUP2 DUP5 ADDRESS DUP6 PUSH2 0xB5 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x19C DUP5 PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH2 0x1A2 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1F1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1CE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x253 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x258 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x45524332303A2063616C6C206661696C65640000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x373 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x372 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x45524332303A206F7065726174696F6E20646964206E6F742073756363656564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 PC 0xFC STOP DUP16 0xCA 0x4A GT PUSH12 0x1ECB3C46FCE52BB42E275A9 SWAP12 JUMP 0xB4 0xCB PUSH12 0x10ABB5BF815964736F6C6343 STOP MOD DIV STOP CALLER ",
"sourceMap": "657:3612:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;657:3612:0;;;;;;;;;;;;;;;;12:1:-1;9;2:12;967:195:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;967:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1056:12;1078;1056:35;;1101:54;1119:5;1126;1141:4;1148:6;1101:17;:54::i;:::-;967:195;;;;:::o;3574:193::-;3674:86;3684:5;3714:27;;;3743:4;3749:2;3753:5;3691:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3691:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;3691:68:0;3674:9;:86::i;:::-;3574:193;;;;:::o;3928:338::-;4007:12;4021:23;4056:5;4048:19;;4068:4;4048:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4048:25:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;4006:67:0;;;;4091:7;4083:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4156:1;4136:10;:17;:21;4132:128;;;4193:10;4182:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;4182:30:0;;;;;;;;;;;;;;;;4174:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4132:128;3928:338;;;;:::o"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "188600",
"executionCost": "232",
"totalCost": "188832"
},
"external": {
"fundERC20(address,address,uint256)": "infinite"
},
"internal": {
"_safeCall(contract IERC20,bytes memory)": "infinite",
"_safeTransfer(contract IERC20,address,uint256)": "infinite",
"_safeTransferFrom(contract IERC20,address,address,uint256)": "infinite",
"burnERC20(address,address,uint256)": "infinite",
"lockERC20(address,address,address,uint256)": "infinite",
"mintERC20(address,address,uint256)": "infinite",
"releaseERC20(address,address,uint256)": "infinite"
}
},
"methodIdentifiers": {
"fundERC20(address,address,uint256)": "95601f09"
}
},
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "fundERC20",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "fundERC20",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"fundERC20(address,address,uint256)": {
"params": {
"amount": "Amount of tokens to transfer.",
"owner": "Address of current token owner.",
"tokenAddress": "Address of ERC20 to transfer."
}
}
},
"title": "Manages deposited ERC20s."
},
"userdoc": {
"methods": {
"fundERC20(address,address,uint256)": {
"notice": "Used to transfer tokens into the safe to fund proposals."
}
},
"notice": "This contract is intended to be used with ERC20Handler contract."
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/ERC20Safe.sol": "ERC20Safe"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/ERC20Safe.sol": {
"keccak256": "0x1b7664798e097b6e442236e1a7e722d9fe30d54086a86a9c200fb94cb3aa2e4a",
"urls": [
"bzz-raw://e8ee9c497f830dc5cd9c3ed0e6312a0b238862543ed791474f76cd518e137049",
"dweb:/ipfs/QmdRzN5SLRgtCvhWrYk9Y78isdoCEBf5MBaShQB2QLje8T"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/GSN/Context.sol": {
"keccak256": "0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0",
"urls": [
"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f",
"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/access/AccessControl.sol": {
"keccak256": "0x37ff88aa5ca8f533e31b9e1cb5354816b15bb7d41c904ea1c8f5dd5a78d6da25",
"urls": [
"bzz-raw://f3731db435ced7084f2cb3947e708371c10a2e3f654dcfe2a237fc8fbdafbe5f",
"dweb:/ipfs/QmUyiwkuiP2fYBVaTwwY82sJKxJyPQaBqAtS4uG6iaUSP7"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol": {
"keccak256": "0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6",
"urls": [
"bzz-raw://7f8d45329fecbf0836ad7543330c3ecd0f8d0ffa42d4016278c3eb2215fdcdfe",
"dweb:/ipfs/QmXWLT7GcnHtA5NiD6MFi2CV3EWJY4wv5mLNnypqYDrxL3"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/presets/ERC20PresetMinterPauser.sol": {
"keccak256": "0x7f6066f8892ea22a50f98b31d3b3340b3f058c891e317f6ecca24d67d70127fe",
"urls": [
"bzz-raw://a35f0287f053ac1185807348b2220bba6f401026e0dcad6dcb1cc7a1a9d4214a",
"dweb:/ipfs/QmVaxfTbPyefN2qVK18DJYMbfuvgJK8KkJ9cRS1nY2FLRC"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20.sol": {
"keccak256": "0xcbd85c86627a47fd939f1f4ee3ba626575ff2a182e1804b29f5136394449b538",
"urls": [
"bzz-raw://53c6a80c519bb9356aad28efa9a1ec31603860eb759d2dc57f545fcae1dd1aca",
"dweb:/ipfs/QmfRS6TtMNUHhvgLHXK21qKNnpn2S7g2Yd1fKaHKyFiJsR"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20Burnable.sol": {
"keccak256": "0x20569e5d91a1f7478f4579962d35b35e5c68e10c5718696e3863c1a588da87c4",
"urls": [
"bzz-raw://5ace7d16e99eb77a33c3680964706a39ca6c91aebd4f911f4b70430881cc85b8",
"dweb:/ipfs/Qmb7g4vz3x238NMF9US6q8xUUamDy9upxZnms6ZaKkN37U"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20Pausable.sol": {
"keccak256": "0xa22af140ae7ec1f8f2f3bed5869cd0d548dfaac66343f0efc7324ff34aaf1254",
"urls": [
"bzz-raw://fed479feda7354e89c095fde0927dcb581f460257bf93b7db54b2b902b4bbd48",
"dweb:/ipfs/QmSDUhS2AQvTGXHwaxDgAXtwXKCgQh2kp1nwhwUgr2hQZK"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/IERC20.sol": {
"keccak256": "0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5",
"urls": [
"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08",
"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/Address.sol": {
"keccak256": "0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8",
"urls": [
"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0",
"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/EnumerableSet.sol": {
"keccak256": "0xae0992eb1ec30fd1ecdf2e04a6036decfc9797bf11dc1ec84b546b74318d5ec2",
"urls": [
"bzz-raw://3b61f99a64e999682ad7bfbb3a1c762a20a0a5b30f9f2011693fa857969af61f",
"dweb:/ipfs/QmZystFY76wkWCf7V3yKh3buZuKVKbswiE7y6yU62kk3zi"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/Pausable.sol": {
"keccak256": "0x065360ef3924db6b63c2160886b5de737497dd64a917e362dd8d857cda1f5ae2",
"urls": [
"bzz-raw://946fe57f3b935f0f4a41345b3eedb617c30912ba5e802bd6b430b394114048ab",
"dweb:/ipfs/QmRVgUK6yHgqiVWoFn51aUGYejR8romW2ZqwVvSFMnhnJW"
]
}
},
"version": 1
}
pragma solidity 0.6.4;
pragma experimental ABIEncoderV2;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/access/AccessControl.sol";
import "./utils/Pausable.sol";
import "./utils/SafeMath.sol";
import "./interfaces/IDepositExecute.sol";
import "./interfaces/IBridge.sol";
import "./interfaces/IERCHandler.sol";
import "./interfaces/IGenericHandler.sol";
/**
@title Facilitates deposits, creation and votiing of deposit proposals, and deposit executions.
@author ChainSafe Systems.
*/
contract Bridge is Pausable, AccessControl, SafeMath {
uint8 public _chainID;
uint256 public _relayerThreshold;
uint256 public _totalRelayers;
uint256 public _totalProposals;
uint256 public _fee;
uint256 public _expiry;
enum Vote {No, Yes}
enum ProposalStatus {Inactive, Active, Passed, Executed, Cancelled}
struct Proposal {
bytes32 _resourceID;
bytes32 _dataHash;
address[] _yesVotes;
address[] _noVotes;
ProposalStatus _status;
uint256 _proposedBlock;
}
// destinationChainID => number of deposits
mapping(uint8 => uint64) public _depositCounts;
// resourceID => handler address
mapping(bytes32 => address) public _resourceIDToHandlerAddress;
// depositNonce => destinationChainID => bytes
mapping(uint64 => mapping(uint8 => bytes)) public _depositRecords;
// destinationChainID + depositNonce => dataHash => Proposal
mapping(uint72 => mapping(bytes32 => Proposal)) public _proposals;
// destinationChainID + depositNonce => dataHash => relayerAddress => bool
mapping(uint72 => mapping(bytes32 => mapping(address => bool))) public _hasVotedOnProposal;
event RelayerThresholdChanged(uint indexed newThreshold);
event RelayerAdded(address indexed relayer);
event RelayerRemoved(address indexed relayer);
event Deposit(
uint8 indexed destinationChainID,
bytes32 indexed resourceID,
uint64 indexed depositNonce
);
event ProposalEvent(
uint8 indexed originChainID,
uint64 indexed depositNonce,
ProposalStatus indexed status,
bytes32 resourceID,
bytes32 dataHash
);
event ProposalVote(
uint8 indexed originChainID,
uint64 indexed depositNonce,
ProposalStatus indexed status,
bytes32 resourceID
);
bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE");
modifier onlyAdmin() {
_onlyAdmin();
_;
}
modifier onlyAdminOrRelayer() {
_onlyAdminOrRelayer();
_;
}
modifier onlyRelayers() {
_onlyRelayers();
_;
}
function _onlyAdminOrRelayer() private {
require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || hasRole(RELAYER_ROLE, msg.sender),
"sender is not relayer or admin");
}
function _onlyAdmin() private {
require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "sender doesn't have admin role");
}
function _onlyRelayers() private {
require(hasRole(RELAYER_ROLE, msg.sender), "sender doesn't have relayer role");
}
/**
@notice Initializes Bridge, creates and grants {msg.sender} the admin role,
creates and grants {initialRelayers} the relayer role.
@param chainID ID of chain the Bridge contract exists on.
@param initialRelayers Addresses that should be initially granted the relayer role.
@param initialRelayerThreshold Number of votes needed for a deposit proposal to be considered passed.
*/
constructor (uint8 chainID, address[] memory initialRelayers, uint initialRelayerThreshold, uint256 fee, uint256 expiry) public {
_chainID = chainID;
_relayerThreshold = initialRelayerThreshold;
_fee = fee;
_expiry = expiry;
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setRoleAdmin(RELAYER_ROLE, DEFAULT_ADMIN_ROLE);
for (uint i; i < initialRelayers.length; i++) {
grantRole(RELAYER_ROLE, initialRelayers[i]);
_totalRelayers++;
}
}
/**
@notice Returns true if {relayer} has the relayer role.
@param relayer Address to check.
*/
function isRelayer(address relayer) external view returns (bool) {
return hasRole(RELAYER_ROLE, relayer);
}
/**
@notice Removes admin role from {msg.sender} and grants it to {newAdmin}.
@notice Only callable by an address that currently has the admin role.
@param newAdmin Address that admin role will be granted to.
*/
function renounceAdmin(address newAdmin) external onlyAdmin {
grantRole(DEFAULT_ADMIN_ROLE, newAdmin);
renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
/**
@notice Pauses deposits, proposal creation and voting, and deposit executions.
@notice Only callable by an address that currently has the admin role.
*/
function adminPauseTransfers() external onlyAdmin {
_pause();
}
/**
@notice Unpauses deposits, proposal creation and voting, and deposit executions.
@notice Only callable by an address that currently has the admin role.
*/
function adminUnpauseTransfers() external onlyAdmin {
_unpause();
}
/**
@notice Modifies the number of votes required for a proposal to be considered passed.
@notice Only callable by an address that currently has the admin role.
@param newThreshold Value {_relayerThreshold} will be changed to.
@notice Emits {RelayerThresholdChanged} event.
*/
function adminChangeRelayerThreshold(uint newThreshold) external onlyAdmin {
_relayerThreshold = newThreshold;
emit RelayerThresholdChanged(newThreshold);
}
/**
@notice Grants {relayerAddress} the relayer role and increases {_totalRelayer} count.
@notice Only callable by an address that currently has the admin role.
@param relayerAddress Address of relayer to be added.
@notice Emits {RelayerAdded} event.
*/
function adminAddRelayer(address relayerAddress) external onlyAdmin {
require(!hasRole(RELAYER_ROLE, relayerAddress), "addr already has relayer role!");
grantRole(RELAYER_ROLE, relayerAddress);
emit RelayerAdded(relayerAddress);
_totalRelayers++;
}
/**
@notice Removes relayer role for {relayerAddress} and decreases {_totalRelayer} count.
@notice Only callable by an address that currently has the admin role.
@param relayerAddress Address of relayer to be removed.
@notice Emits {RelayerRemoved} event.
*/
function adminRemoveRelayer(address relayerAddress) external onlyAdmin {
require(hasRole(RELAYER_ROLE, relayerAddress), "addr doesn't have relayer role!");
revokeRole(RELAYER_ROLE, relayerAddress);
emit RelayerRemoved(relayerAddress);
_totalRelayers--;
}
/**
@notice Sets a new resource for handler contracts that use the IERCHandler interface,
and maps the {handlerAddress} to {resourceID} in {_resourceIDToHandlerAddress}.
@notice Only callable by an address that currently has the admin role.
@param handlerAddress Address of handler resource will be set for.
@param resourceID ResourceID to be used when making deposits.
@param tokenAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function adminSetResource(address handlerAddress, bytes32 resourceID, address tokenAddress) external onlyAdmin {
_resourceIDToHandlerAddress[resourceID] = handlerAddress;
IERCHandler handler = IERCHandler(handlerAddress);
handler.setResource(resourceID, tokenAddress);
}
/**
@notice Sets a new resource for handler contracts that use the IGenericHandler interface,
and maps the {handlerAddress} to {resourceID} in {_resourceIDToHandlerAddress}.
@notice Only callable by an address that currently has the admin role.
@param handlerAddress Address of handler resource will be set for.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function adminSetGenericResource(
address handlerAddress,
bytes32 resourceID,
address contractAddress,
bytes4 depositFunctionSig,
bytes4 executeFunctionSig
) external onlyAdmin {
_resourceIDToHandlerAddress[resourceID] = handlerAddress;
IGenericHandler handler = IGenericHandler(handlerAddress);
handler.setResource(resourceID, contractAddress, depositFunctionSig, executeFunctionSig);
}
/**
@notice Sets a resource as burnable for handler contracts that use the IERCHandler interface.
@notice Only callable by an address that currently has the admin role.
@param handlerAddress Address of handler resource will be set for.
@param tokenAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function adminSetBurnable(address handlerAddress, address tokenAddress) external onlyAdmin {
IERCHandler handler = IERCHandler(handlerAddress);
handler.setBurnable(tokenAddress);
}
/**
@notice Returns a proposal.
@param originChainID Chain ID deposit originated from.
@param depositNonce ID of proposal generated by proposal's origin Bridge contract.
@param dataHash Hash of data to be provided when deposit proposal is executed.
@return Proposal which consists of:
- _dataHash Hash of data to be provided when deposit proposal is executed.
- _yesVotes Number of votes in favor of proposal.
- _noVotes Number of votes against proposal.
- _status Current status of proposal.
*/
function getProposal(uint8 originChainID, uint64 depositNonce, bytes32 dataHash) external view returns (Proposal memory) {
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(originChainID);
return _proposals[nonceAndID][dataHash];
}
/**
@notice Changes deposit fee.
@notice Only callable by admin.
@param newFee Value {_fee} will be updated to.
*/
function adminChangeFee(uint newFee) external onlyAdmin {
require(_fee != newFee, "Current fee is equal to new fee");
_fee = newFee;
}
/**
@notice Used to manually withdraw funds from ERC safes.
@param handlerAddress Address of handler to withdraw from.
@param tokenAddress Address of token to withdraw.
@param recipient Address to withdraw tokens to.
@param amountOrTokenID Either the amount of ERC20 tokens or the ERC721 token ID to withdraw.
*/
function adminWithdraw(
address handlerAddress,
address tokenAddress,
address recipient,
uint256 amountOrTokenID
) external onlyAdmin {
IERCHandler handler = IERCHandler(handlerAddress);
handler.withdraw(tokenAddress, recipient, amountOrTokenID);
}
/**
@notice Initiates a transfer using a specified handler contract.
@notice Only callable when Bridge is not paused.
@param destinationChainID ID of chain deposit will be bridged to.
@param resourceID ResourceID used to find address of handler to be used for deposit.
@param data Additional data to be passed to specified handler.
@notice Emits {Deposit} event.
*/
function deposit(uint8 destinationChainID, bytes32 resourceID, bytes calldata data) external payable whenNotPaused {
require(msg.value == _fee, "Incorrect fee supplied");
address handler = _resourceIDToHandlerAddress[resourceID];
require(handler != address(0), "resourceID not mapped to handler");
uint64 depositNonce = ++_depositCounts[destinationChainID];
_depositRecords[depositNonce][destinationChainID] = data;
IDepositExecute depositHandler = IDepositExecute(handler);
depositHandler.deposit(resourceID, destinationChainID, depositNonce, msg.sender, data);
emit Deposit(destinationChainID, resourceID, depositNonce);
}
/**
@notice When called, {msg.sender} will be marked as voting in favor of proposal.
@notice Only callable by relayers when Bridge is not paused.
@param chainID ID of chain deposit originated from.
@param depositNonce ID of deposited generated by origin Bridge contract.
@param dataHash Hash of data provided when deposit was made.
@notice Proposal must not have already been passed or executed.
@notice {msg.sender} must not have already voted on proposal.
@notice Emits {ProposalEvent} event with status indicating the proposal status.
@notice Emits {ProposalVote} event.
*/
function voteProposal(uint8 chainID, uint64 depositNonce, bytes32 resourceID, bytes32 dataHash) external onlyRelayers whenNotPaused {
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(chainID);
Proposal storage proposal = _proposals[nonceAndID][dataHash];
require(_resourceIDToHandlerAddress[resourceID] != address(0), "no handler for resourceID");
require(uint(proposal._status) <= 1, "proposal already passed/executed/cancelled");
require(!_hasVotedOnProposal[nonceAndID][dataHash][msg.sender], "relayer already voted");
if (uint(proposal._status) == 0) {
++_totalProposals;
_proposals[nonceAndID][dataHash] = Proposal({
_resourceID : resourceID,
_dataHash : dataHash,
_yesVotes : new address[](1),
_noVotes : new address[](0),
_status : ProposalStatus.Active,
_proposedBlock : block.number
});
proposal._yesVotes[0] = msg.sender;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Active, resourceID, dataHash);
} else {
if (sub(block.number, proposal._proposedBlock) > _expiry) {
// if the number of blocks that has passed since this proposal was
// submitted exceeds the expiry threshold set, cancel the proposal
proposal._status = ProposalStatus.Cancelled;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Cancelled, resourceID, dataHash);
} else {
require(dataHash == proposal._dataHash, "datahash mismatch");
proposal._yesVotes.push(msg.sender);
}
}
if (proposal._status != ProposalStatus.Cancelled) {
_hasVotedOnProposal[nonceAndID][dataHash][msg.sender] = true;
emit ProposalVote(chainID, depositNonce, proposal._status, resourceID);
// If _depositThreshold is set to 1, then auto finalize
// or if _relayerThreshold has been exceeded
if (_relayerThreshold <= 1 || proposal._yesVotes.length >= _relayerThreshold) {
proposal._status = ProposalStatus.Passed;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Passed, resourceID, dataHash);
}
}
}
/**
@notice Executes a deposit proposal that is considered passed using a specified handler contract.
@notice Only callable by relayers when Bridge is not paused.
@param chainID ID of chain deposit originated from.
@param depositNonce ID of deposited generated by origin Bridge contract.
@param dataHash Hash of data originally provided when deposit was made.
@notice Proposal must be past expiry threshold.
@notice Emits {ProposalEvent} event with status {Cancelled}.
*/
function cancelProposal(uint8 chainID, uint64 depositNonce, bytes32 dataHash) public onlyAdminOrRelayer {
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(chainID);
Proposal storage proposal = _proposals[nonceAndID][dataHash];
require(proposal._status != ProposalStatus.Cancelled, "Proposal already cancelled");
require(sub(block.number, proposal._proposedBlock) > _expiry, "Proposal not at expiry threshold");
proposal._status = ProposalStatus.Cancelled;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Cancelled, proposal._resourceID, proposal._dataHash);
}
/**
@notice Executes a deposit proposal that is considered passed using a specified handler contract.
@notice Only callable by relayers when Bridge is not paused.
@param chainID ID of chain deposit originated from.
@param resourceID ResourceID to be used when making deposits.
@param depositNonce ID of deposited generated by origin Bridge contract.
@param data Data originally provided when deposit was made.
@notice Proposal must have Passed status.
@notice Hash of {data} must equal proposal's {dataHash}.
@notice Emits {ProposalEvent} event with status {Executed}.
*/
function executeProposal(uint8 chainID, uint64 depositNonce, bytes calldata data, bytes32 resourceID) external onlyRelayers whenNotPaused {
address handler = _resourceIDToHandlerAddress[resourceID];
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(chainID);
bytes32 dataHash = keccak256(abi.encodePacked(handler, data));
Proposal storage proposal = _proposals[nonceAndID][dataHash];
require(proposal._status != ProposalStatus.Inactive, "proposal is not active");
require(proposal._status == ProposalStatus.Passed, "proposal already transferred");
require(dataHash == proposal._dataHash, "data doesn't match datahash");
proposal._status = ProposalStatus.Executed;
IDepositExecute depositHandler = IDepositExecute(_resourceIDToHandlerAddress[proposal._resourceID]);
depositHandler.executeProposal(proposal._resourceID, data);
emit ProposalEvent(chainID, depositNonce, proposal._status, proposal._resourceID, proposal._dataHash);
}
/**
@notice Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1.
This means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0.
@param addrs Array of addresses to transfer {amounts} to.
@param amounts Array of amonuts to transfer to {addrs}.
*/
function transferFunds(address payable[] calldata addrs, uint[] calldata amounts) external onlyAdmin {
for (uint i = 0; i < addrs.length; i++) {
addrs[i].transfer(amounts[i]);
}
}
}
pragma solidity 0.6.4;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/presets/ERC20PresetMinterPauser.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20Burnable.sol";
/**
@title Manages deposited ERC20s.
@author ChainSafe Systems.
@notice This contract is intended to be used with ERC20Handler contract.
*/
contract ERC20Safe {
using SafeMath for uint256;
/**
@notice Used to transfer tokens into the safe to fund proposals.
@param tokenAddress Address of ERC20 to transfer.
@param owner Address of current token owner.
@param amount Amount of tokens to transfer.
*/
function fundERC20(address tokenAddress, address owner, uint256 amount) public {
IERC20 erc20 = IERC20(tokenAddress);
_safeTransferFrom(erc20, owner, address(this), amount);
}
/**
@notice Used to gain custody of deposited token.
@param tokenAddress Address of ERC20 to transfer.
@param owner Address of current token owner.
@param recipient Address to transfer tokens to.
@param amount Amount of tokens to transfer.
*/
function lockERC20(address tokenAddress, address owner, address recipient, uint256 amount) internal {
IERC20 erc20 = IERC20(tokenAddress);
_safeTransferFrom(erc20, owner, recipient, amount);
}
/**
@notice Transfers custody of token to recipient.
@param tokenAddress Address of ERC20 to transfer.
@param recipient Address to transfer tokens to.
@param amount Amount of tokens to transfer.
*/
function releaseERC20(address tokenAddress, address recipient, uint256 amount) internal {
IERC20 erc20 = IERC20(tokenAddress);
_safeTransfer(erc20, recipient, amount);
}
/**
@notice Used to create new ERC20s.
@param tokenAddress Address of ERC20 to transfer.
@param recipient Address to mint token to.
@param amount Amount of token to mint.
*/
function mintERC20(address tokenAddress, address recipient, uint256 amount) internal {
ERC20PresetMinterPauser erc20 = ERC20PresetMinterPauser(tokenAddress);
erc20.mint(recipient, amount);
}
/**
@notice Used to burn ERC20s.
@param tokenAddress Address of ERC20 to burn.
@param owner Current owner of tokens.
@param amount Amount of tokens to burn.
*/
function burnERC20(address tokenAddress, address owner, uint256 amount) internal {
ERC20Burnable erc20 = ERC20Burnable(tokenAddress);
erc20.burnFrom(owner, amount);
}
/**
@notice used to transfer ERC20s safely
@param token Token instance to transfer
@param to Address to transfer token to
@param value Amount of token to transfer
*/
function _safeTransfer(IERC20 token, address to, uint256 value) private {
_safeCall(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
@notice used to transfer ERC20s safely
@param token Token instance to transfer
@param from Address to transfer token from
@param to Address to transfer token to
@param value Amount of token to transfer
*/
function _safeTransferFrom(IERC20 token, address from, address to, uint256 value) private {
_safeCall(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
@notice used to make calls to ERC20s safely
@param token Token instance call targets
@param data encoded call data
*/
function _safeCall(IERC20 token, bytes memory data) private {
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "ERC20: call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "ERC20: operation did not succeed");
}
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "60806040523480156200001157600080fd5b50604051620023fc380380620023fc833981810160405281019062000037919062000489565b81518351146200007e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000759062000632565b60405180910390fd5b836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008090505b8351811015620001165762000108848281518110620000df57fe5b6020026020010151848381518110620000f457fe5b60200260200101516200016560201b60201c565b8080600101915050620000c4565b5060008090505b81518110156200015a576200014c8282815181106200013857fe5b60200260200101516200025760201b60201c565b80806001019150506200011d565b505050505062000757565b806001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16620002e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dd9062000610565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600081519050620003528162000723565b92915050565b600082601f8301126200036a57600080fd5b8151620003816200037b8262000682565b62000654565b91508181835260208401935060208101905083856020840282011115620003a757600080fd5b60005b83811015620003db5781620003c0888262000341565b845260208401935060208301925050600181019050620003aa565b5050505092915050565b600082601f830112620003f757600080fd5b81516200040e6200040882620006ab565b62000654565b915081818352602084019350602081019050838560208402820111156200043457600080fd5b60005b838110156200046857816200044d888262000472565b84526020840193506020830192505060018101905062000437565b5050505092915050565b60008151905062000483816200073d565b92915050565b60008060008060808587031215620004a057600080fd5b6000620004b08782880162000341565b945050602085015167ffffffffffffffff811115620004ce57600080fd5b620004dc87828801620003e5565b935050604085015167ffffffffffffffff811115620004fa57600080fd5b620005088782880162000358565b925050606085015167ffffffffffffffff8111156200052657600080fd5b620005348782880162000358565b91505092959194509250565b60006200054f602483620006d4565b91507f70726f766964656420636f6e7472616374206973206e6f742077686974656c6960008301527f73746564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620005b7603c83620006d4565b91507f696e697469616c5265736f7572636549447320616e6420696e697469616c436f60008301527f6e7472616374416464726573736573206c656e206d69736d61746368000000006020830152604082019050919050565b600060208201905081810360008301526200062b8162000540565b9050919050565b600060208201905081810360008301526200064d81620005a8565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200067857600080fd5b8060405250919050565b600067ffffffffffffffff8211156200069a57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115620006c357600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b6000620006f28262000703565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200072e81620006e5565b81146200073a57600080fd5b50565b6200074881620006f9565b81146200075457600080fd5b50565b611c9580620007676000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80637f79bea81161008c578063ba484c0911610066578063ba484c0914610228578063c8ba6c8714610258578063d9caed1214610288578063e248cff2146102a4576100cf565b80637f79bea8146101c057806395601f09146101f0578063b8fa37361461020c576100cf565b806307b7ed99146100d45780630a6d55d8146100f0578063318c136e1461012057806338995da91461013e5780634402027f1461015a5780636a70d08114610190575b600080fd5b6100ee60048036038101906100e99190611310565b6102c0565b005b61010a600480360381019061010591906113b1565b6102d4565b60405161011791906118e1565b60405180910390f35b610128610307565b60405161013591906118e1565b60405180910390f35b6101586004803603810190610153919061146e565b61032c565b005b610174600480360381019061016f919061153c565b61063f565b604051610187979695949392919061195c565b60405180910390f35b6101aa60048036038101906101a59190611310565b610780565b6040516101b791906119d2565b60405180910390f35b6101da60048036038101906101d59190611310565b6107a0565b6040516101e791906119d2565b60405180910390f35b61020a60048036038101906102059190611339565b6107c0565b005b610226600480360381019061022191906113da565b6107d7565b005b610242600480360381019061023d9190611500565b6107ed565b60405161024f9190611aa8565b60405180910390f35b610272600480360381019061026d9190611310565b6109e2565b60405161027f91906119ed565b60405180910390f35b6102a2600480360381019061029d9190611339565b6109fa565b005b6102be60048036038101906102b99190611416565b610a12565b005b6102c8610b86565b6102d181610c17565b50565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610334610b86565b606060008060c4359150604051925060e4359050808301602001604052600e360360e484376000600160008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661041d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041490611a88565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561047f5761047a818885610cfe565b61048c565b61048b81883086610d76565b5b6040518060e001604052808273ffffffffffffffffffffffffffffffffffffffff1681526020018360ff1681526020018a60ff1681526020018b81526020018581526020018873ffffffffffffffffffffffffffffffffffffffff16815260200184815250600560008b60ff1660ff16815260200190815260200160002060008a67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff1602179055506060820151816001015560808201518160020190805190602001906105de929190611131565b5060a08201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816004015590505050505050505050505050565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff1690806001015490806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561074a5780601f1061071f5761010080835404028352916020019161074a565b820191906000526020600020905b81548152906001019060200180831161072d57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905087565b60046020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b60008390506107d181843085610d8e565b50505050565b6107df610b86565b6107e98282610e17565b5050565b6107f56111b1565b600560008360ff1660ff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660ff1660ff1681526020016000820160159054906101000a900460ff1660ff1660ff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600482015481525050905092915050565b60026020528060005260406000206000915090505481565b610a02610b86565b610a0d838383610f09565b505050565b610a1a610b86565b60006060606435915060405190506084358082016020016040526084360360848337506000806001600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060208301519150600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090611a88565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b6e57610b69818360601c86610f1f565b610b7d565b610b7c818360601c86610f09565b5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90611a28565b60405180910390fd5b565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90611a48565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008390508073ffffffffffffffffffffffffffffffffffffffff166379cc679084846040518363ffffffff1660e01b8152600401610d3e929190611933565b600060405180830381600087803b158015610d5857600080fd5b505af1158015610d6c573d6000803e3d6000fd5b5050505050505050565b6000849050610d8781858585610d8e565b5050505050565b610e11846323b872dd60e01b858585604051602401610daf939291906118fc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f97565b50505050565b806001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000839050610f198184846110ab565b50505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401610f5f929190611933565b600060405180830381600087803b158015610f7957600080fd5b505af1158015610f8d573d6000803e3d6000fd5b5050505050505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610fc091906118ca565b6000604051808303816000865af19150503d8060008114610ffd576040519150601f19603f3d011682016040523d82523d6000602084013e611002565b606091505b509150915081611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90611a68565b60405180910390fd5b6000815111156110a557808060200190518101906110659190611388565b6110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90611a08565b60405180910390fd5b5b50505050565b61112c8363a9059cbb60e01b84846040516024016110ca929190611933565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f97565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061117257805160ff19168380011785556111a0565b828001600101855582156111a0579182015b8281111561119f578251825591602001919060010190611184565b5b5090506111ad9190611223565b5090565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600060ff1681526020016000801916815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b61124591905b80821115611241576000816000905550600101611229565b5090565b90565b60008135905061125781611bd5565b92915050565b60008151905061126c81611bec565b92915050565b60008135905061128181611c03565b92915050565b60008083601f84011261129957600080fd5b8235905067ffffffffffffffff8111156112b257600080fd5b6020830191508360018202830111156112ca57600080fd5b9250929050565b6000813590506112e081611c1a565b92915050565b6000813590506112f581611c31565b92915050565b60008135905061130a81611c48565b92915050565b60006020828403121561132257600080fd5b600061133084828501611248565b91505092915050565b60008060006060848603121561134e57600080fd5b600061135c86828701611248565b935050602061136d86828701611248565b925050604061137e868287016112d1565b9150509250925092565b60006020828403121561139a57600080fd5b60006113a88482850161125d565b91505092915050565b6000602082840312156113c357600080fd5b60006113d184828501611272565b91505092915050565b600080604083850312156113ed57600080fd5b60006113fb85828601611272565b925050602061140c85828601611248565b9150509250929050565b60008060006040848603121561142b57600080fd5b600061143986828701611272565b935050602084013567ffffffffffffffff81111561145657600080fd5b61146286828701611287565b92509250509250925092565b60008060008060008060a0878903121561148757600080fd5b600061149589828a01611272565b96505060206114a689828a016112fb565b95505060406114b789828a016112e6565b94505060606114c889828a01611248565b935050608087013567ffffffffffffffff8111156114e557600080fd5b6114f189828a01611287565b92509250509295509295509295565b6000806040838503121561151357600080fd5b6000611521858286016112e6565b9250506020611532858286016112fb565b9150509250929050565b6000806040838503121561154f57600080fd5b600061155d858286016112fb565b925050602061156e858286016112e6565b9150509250929050565b61158181611b1e565b82525050565b61159081611b1e565b82525050565b61159f81611b30565b82525050565b6115ae81611b3c565b82525050565b6115bd81611b3c565b82525050565b60006115ce82611ad5565b6115d88185611b02565b93506115e8818560208601611b91565b80840191505092915050565b60006115ff82611aca565b6116098185611ae0565b9350611619818560208601611b91565b61162281611bc4565b840191505092915050565b600061163882611aca565b6116428185611af1565b9350611652818560208601611b91565b61165b81611bc4565b840191505092915050565b6000611673602083611b0d565b91507f45524332303a206f7065726174696f6e20646964206e6f7420737563636565646000830152602082019050919050565b60006116b3601e83611b0d565b91507f73656e646572206d7573742062652062726964676520636f6e747261637400006000830152602082019050919050565b60006116f3602483611b0d565b91507f70726f766964656420636f6e7472616374206973206e6f742077686974656c6960008301527f73746564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611759601283611b0d565b91507f45524332303a2063616c6c206661696c656400000000000000000000000000006000830152602082019050919050565b6000611799602883611b0d565b91507f70726f766964656420746f6b656e41646472657373206973206e6f742077686960008301527f74656c69737465640000000000000000000000000000000000000000000000006020830152604082019050919050565b600060e08301600083015161180a6000860182611578565b50602083015161181d60208601826118ac565b50604083015161183060408601826118ac565b50606083015161184360608601826115a5565b506080830151848203608086015261185b82826115f4565b91505060a083015161187060a0860182611578565b5060c083015161188360c086018261188e565b508091505092915050565b61189781611b66565b82525050565b6118a681611b66565b82525050565b6118b581611b84565b82525050565b6118c481611b84565b82525050565b60006118d682846115c3565b915081905092915050565b60006020820190506118f66000830184611587565b92915050565b60006060820190506119116000830186611587565b61191e6020830185611587565b61192b604083018461189d565b949350505050565b60006040820190506119486000830185611587565b611955602083018461189d565b9392505050565b600060e082019050611971600083018a611587565b61197e60208301896118bb565b61198b60408301886118bb565b61199860608301876115b4565b81810360808301526119aa818661162d565b90506119b960a0830185611587565b6119c660c083018461189d565b98975050505050505050565b60006020820190506119e76000830184611596565b92915050565b6000602082019050611a0260008301846115b4565b92915050565b60006020820190508181036000830152611a2181611666565b9050919050565b60006020820190508181036000830152611a41816116a6565b9050919050565b60006020820190508181036000830152611a61816116e6565b9050919050565b60006020820190508181036000830152611a818161174c565b9050919050565b60006020820190508181036000830152611aa18161178c565b9050919050565b60006020820190508181036000830152611ac281846117f2565b905092915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000611b2982611b46565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60005b83811015611baf578082015181840152602081019050611b94565b83811115611bbe576000848401525b50505050565b6000601f19601f8301169050919050565b611bde81611b1e565b8114611be957600080fd5b50565b611bf581611b30565b8114611c0057600080fd5b50565b611c0c81611b3c565b8114611c1757600080fd5b50565b611c2381611b66565b8114611c2e57600080fd5b50565b611c3a81611b70565b8114611c4557600080fd5b50565b611c5181611b84565b8114611c5c57600080fd5b5056fea2646970667358221220eed9e4e6654616f596d2a370c9dc42de7873ff5861377dbc3af43febca28a8e164736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x23FC CODESIZE SUB DUP1 PUSH3 0x23FC DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH3 0x37 SWAP2 SWAP1 PUSH3 0x489 JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD EQ PUSH3 0x7E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x75 SWAP1 PUSH3 0x632 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH3 0x116 JUMPI PUSH3 0x108 DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH3 0xDF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH3 0xF4 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH3 0x165 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH3 0xC4 JUMP JUMPDEST POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH3 0x15A JUMPI PUSH3 0x14C DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH3 0x138 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH3 0x257 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH3 0x11D JUMP JUMPDEST POP POP POP POP POP PUSH3 0x757 JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH3 0x2E6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x2DD SWAP1 PUSH3 0x610 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x352 DUP2 PUSH3 0x723 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x36A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x381 PUSH3 0x37B DUP3 PUSH3 0x682 JUMP JUMPDEST PUSH3 0x654 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH3 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x3DB JUMPI DUP2 PUSH3 0x3C0 DUP9 DUP3 PUSH3 0x341 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH3 0x3AA JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x3F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x40E PUSH3 0x408 DUP3 PUSH3 0x6AB JUMP JUMPDEST PUSH3 0x654 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH3 0x434 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x468 JUMPI DUP2 PUSH3 0x44D DUP9 DUP3 PUSH3 0x472 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH3 0x437 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x483 DUP2 PUSH3 0x73D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH3 0x4A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x4B0 DUP8 DUP3 DUP9 ADD PUSH3 0x341 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x4CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4DC DUP8 DUP3 DUP9 ADD PUSH3 0x3E5 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x4FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x508 DUP8 DUP3 DUP9 ADD PUSH3 0x358 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x526 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x534 DUP8 DUP3 DUP9 ADD PUSH3 0x358 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x54F PUSH1 0x24 DUP4 PUSH3 0x6D4 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420636F6E7472616374206973206E6F742077686974656C69 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x7374656400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x5B7 PUSH1 0x3C DUP4 PUSH3 0x6D4 JUMP JUMPDEST SWAP2 POP PUSH32 0x696E697469616C5265736F7572636549447320616E6420696E697469616C436F PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6E7472616374416464726573736573206C656E206D69736D6174636800000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH3 0x62B DUP2 PUSH3 0x540 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH3 0x64D DUP2 PUSH3 0x5A8 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH3 0x678 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x40 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x69A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x6C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x6F2 DUP3 PUSH3 0x703 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0x72E DUP2 PUSH3 0x6E5 JUMP JUMPDEST DUP2 EQ PUSH3 0x73A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH3 0x748 DUP2 PUSH3 0x6F9 JUMP JUMPDEST DUP2 EQ PUSH3 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C95 DUP1 PUSH3 0x767 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xCF JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F79BEA8 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xBA484C09 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xBA484C09 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0xC8BA6C87 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0xD9CAED12 EQ PUSH2 0x288 JUMPI DUP1 PUSH4 0xE248CFF2 EQ PUSH2 0x2A4 JUMPI PUSH2 0xCF JUMP JUMPDEST DUP1 PUSH4 0x7F79BEA8 EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0x95601F09 EQ PUSH2 0x1F0 JUMPI DUP1 PUSH4 0xB8FA3736 EQ PUSH2 0x20C JUMPI PUSH2 0xCF JUMP JUMPDEST DUP1 PUSH4 0x7B7ED99 EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0xA6D55D8 EQ PUSH2 0xF0 JUMPI DUP1 PUSH4 0x318C136E EQ PUSH2 0x120 JUMPI DUP1 PUSH4 0x38995DA9 EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0x4402027F EQ PUSH2 0x15A JUMPI DUP1 PUSH4 0x6A70D081 EQ PUSH2 0x190 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xE9 SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x2C0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x10A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x105 SWAP2 SWAP1 PUSH2 0x13B1 JUMP JUMPDEST PUSH2 0x2D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x18E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x128 PUSH2 0x307 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x135 SWAP2 SWAP1 PUSH2 0x18E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x158 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x153 SWAP2 SWAP1 PUSH2 0x146E JUMP JUMPDEST PUSH2 0x32C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x174 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x16F SWAP2 SWAP1 PUSH2 0x153C JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x187 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x195C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1AA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1A5 SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x780 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1B7 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1DA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1D5 SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x7A0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E7 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x20A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x205 SWAP2 SWAP1 PUSH2 0x1339 JUMP JUMPDEST PUSH2 0x7C0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x226 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x13DA JUMP JUMPDEST PUSH2 0x7D7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x242 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x23D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x7ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x24F SWAP2 SWAP1 PUSH2 0x1AA8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x272 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x26D SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x9E2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x27F SWAP2 SWAP1 PUSH2 0x19ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2A2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x29D SWAP2 SWAP1 PUSH2 0x1339 JUMP JUMPDEST PUSH2 0x9FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2BE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x2B9 SWAP2 SWAP1 PUSH2 0x1416 JUMP JUMPDEST PUSH2 0xA12 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2C8 PUSH2 0xB86 JUMP JUMPDEST PUSH2 0x2D1 DUP2 PUSH2 0xC17 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x334 PUSH2 0xB86 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0xC4 CALLDATALOAD SWAP2 POP PUSH1 0x40 MLOAD SWAP3 POP PUSH1 0xE4 CALLDATALOAD SWAP1 POP DUP1 DUP4 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0xE CALLDATASIZE SUB PUSH1 0xE4 DUP5 CALLDATACOPY PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x41D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x414 SWAP1 PUSH2 0x1A88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x47F JUMPI PUSH2 0x47A DUP2 DUP9 DUP6 PUSH2 0xCFE JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST PUSH2 0x48B DUP2 DUP9 ADDRESS DUP7 PUSH2 0xD76 JUMP JUMPDEST JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE POP PUSH1 0x5 PUSH1 0x0 DUP12 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x15 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5DE SWAP3 SWAP2 SWAP1 PUSH2 0x1131 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SSTORE SWAP1 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x0 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x0 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x74A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x71F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x74A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x72D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x4 ADD SLOAD SWAP1 POP DUP8 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP PUSH2 0x7D1 DUP2 DUP5 ADDRESS DUP6 PUSH2 0xD8E JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x7DF PUSH2 0xB86 JUMP JUMPDEST PUSH2 0x7E9 DUP3 DUP3 PUSH2 0xE17 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x7F5 PUSH2 0x11B1 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP3 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP3 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x971 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x946 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x971 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x954 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD SLOAD DUP2 MSTORE POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH2 0xA02 PUSH2 0xB86 JUMP JUMPDEST PUSH2 0xA0D DUP4 DUP4 DUP4 PUSH2 0xF09 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xA1A PUSH2 0xB86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x64 CALLDATALOAD SWAP2 POP PUSH1 0x40 MLOAD SWAP1 POP PUSH1 0x84 CALLDATALOAD DUP1 DUP3 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x84 CALLDATASIZE SUB PUSH1 0x84 DUP4 CALLDATACOPY POP PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x20 DUP4 ADD MLOAD SWAP2 POP PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0xB09 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB00 SWAP1 PUSH2 0x1A88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xB6E JUMPI PUSH2 0xB69 DUP2 DUP4 PUSH1 0x60 SHR DUP7 PUSH2 0xF1F JUMP JUMPDEST PUSH2 0xB7D JUMP JUMPDEST PUSH2 0xB7C DUP2 DUP4 PUSH1 0x60 SHR DUP7 PUSH2 0xF09 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC15 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC0C SWAP1 PUSH2 0x1A28 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0xCA3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC9A SWAP1 PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x79CC6790 DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD3E SWAP3 SWAP2 SWAP1 PUSH2 0x1933 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 SWAP1 POP PUSH2 0xD87 DUP2 DUP6 DUP6 DUP6 PUSH2 0xD8E JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE11 DUP5 PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xDAF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH2 0xF97 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP PUSH2 0xF19 DUP2 DUP5 DUP5 PUSH2 0x10AB JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x40C10F19 DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF5F SWAP3 SWAP2 SWAP1 PUSH2 0x1933 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF8D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0xFC0 SWAP2 SWAP1 PUSH2 0x18CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xFFD JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1002 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x1047 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x103E SWAP1 PUSH2 0x1A68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x10A5 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1065 SWAP2 SWAP1 PUSH2 0x1388 JUMP JUMPDEST PUSH2 0x10A4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x109B SWAP1 PUSH2 0x1A08 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x112C DUP4 PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x10CA SWAP3 SWAP2 SWAP1 PUSH2 0x1933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH2 0xF97 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1172 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x11A0 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x11A0 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x119F JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1184 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x11AD SWAP2 SWAP1 PUSH2 0x1223 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x1245 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1241 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x1229 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1257 DUP2 PUSH2 0x1BD5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x126C DUP2 PUSH2 0x1BEC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1281 DUP2 PUSH2 0x1C03 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x12CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x12E0 DUP2 PUSH2 0x1C1A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x12F5 DUP2 PUSH2 0x1C31 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x130A DUP2 PUSH2 0x1C48 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1322 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1330 DUP5 DUP3 DUP6 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x134E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x135C DUP7 DUP3 DUP8 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x136D DUP7 DUP3 DUP8 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x137E DUP7 DUP3 DUP8 ADD PUSH2 0x12D1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x139A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13A8 DUP5 DUP3 DUP6 ADD PUSH2 0x125D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x13C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13D1 DUP5 DUP3 DUP6 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x13ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13FB DUP6 DUP3 DUP7 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x140C DUP6 DUP3 DUP7 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x142B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1439 DUP7 DUP3 DUP8 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1462 DUP7 DUP3 DUP8 ADD PUSH2 0x1287 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1495 DUP10 DUP3 DUP11 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x14A6 DUP10 DUP3 DUP11 ADD PUSH2 0x12FB JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 PUSH2 0x14B7 DUP10 DUP3 DUP11 ADD PUSH2 0x12E6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 PUSH2 0x14C8 DUP10 DUP3 DUP11 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14F1 DUP10 DUP3 DUP11 ADD PUSH2 0x1287 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1521 DUP6 DUP3 DUP7 ADD PUSH2 0x12E6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1532 DUP6 DUP3 DUP7 ADD PUSH2 0x12FB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x154F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x155D DUP6 DUP3 DUP7 ADD PUSH2 0x12FB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x156E DUP6 DUP3 DUP7 ADD PUSH2 0x12E6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x1581 DUP2 PUSH2 0x1B1E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1590 DUP2 PUSH2 0x1B1E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x159F DUP2 PUSH2 0x1B30 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x15AE DUP2 PUSH2 0x1B3C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x15BD DUP2 PUSH2 0x1B3C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15CE DUP3 PUSH2 0x1AD5 JUMP JUMPDEST PUSH2 0x15D8 DUP2 DUP6 PUSH2 0x1B02 JUMP JUMPDEST SWAP4 POP PUSH2 0x15E8 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1B91 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15FF DUP3 PUSH2 0x1ACA JUMP JUMPDEST PUSH2 0x1609 DUP2 DUP6 PUSH2 0x1AE0 JUMP JUMPDEST SWAP4 POP PUSH2 0x1619 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1B91 JUMP JUMPDEST PUSH2 0x1622 DUP2 PUSH2 0x1BC4 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1638 DUP3 PUSH2 0x1ACA JUMP JUMPDEST PUSH2 0x1642 DUP2 DUP6 PUSH2 0x1AF1 JUMP JUMPDEST SWAP4 POP PUSH2 0x1652 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1B91 JUMP JUMPDEST PUSH2 0x165B DUP2 PUSH2 0x1BC4 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1673 PUSH1 0x20 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x45524332303A206F7065726174696F6E20646964206E6F742073756363656564 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16B3 PUSH1 0x1E DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E646572206D7573742062652062726964676520636F6E74726163740000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16F3 PUSH1 0x24 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420636F6E7472616374206973206E6F742077686974656C69 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x7374656400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1759 PUSH1 0x12 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x45524332303A2063616C6C206661696C65640000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1799 PUSH1 0x28 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420746F6B656E41646472657373206973206E6F7420776869 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x74656C6973746564000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x180A PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x1578 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x181D PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x18AC JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1830 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x18AC JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x1843 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x15A5 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x185B DUP3 DUP3 PUSH2 0x15F4 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x1870 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x1578 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x1883 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x188E JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1897 DUP2 PUSH2 0x1B66 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x18A6 DUP2 PUSH2 0x1B66 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x18B5 DUP2 PUSH2 0x1B84 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x18C4 DUP2 PUSH2 0x1B84 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18D6 DUP3 DUP5 PUSH2 0x15C3 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x18F6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1587 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD SWAP1 POP PUSH2 0x1911 PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x191E PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x192B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x189D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x1948 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x1955 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x189D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD SWAP1 POP PUSH2 0x1971 PUSH1 0x0 DUP4 ADD DUP11 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x197E PUSH1 0x20 DUP4 ADD DUP10 PUSH2 0x18BB JUMP JUMPDEST PUSH2 0x198B PUSH1 0x40 DUP4 ADD DUP9 PUSH2 0x18BB JUMP JUMPDEST PUSH2 0x1998 PUSH1 0x60 DUP4 ADD DUP8 PUSH2 0x15B4 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x19AA DUP2 DUP7 PUSH2 0x162D JUMP JUMPDEST SWAP1 POP PUSH2 0x19B9 PUSH1 0xA0 DUP4 ADD DUP6 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x19C6 PUSH1 0xC0 DUP4 ADD DUP5 PUSH2 0x189D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x19E7 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1596 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x1A02 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x15B4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A21 DUP2 PUSH2 0x1666 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A41 DUP2 PUSH2 0x16A6 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A61 DUP2 PUSH2 0x16E6 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A81 DUP2 PUSH2 0x174C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1AA1 DUP2 PUSH2 0x178C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1AC2 DUP2 DUP5 PUSH2 0x17F2 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B29 DUP3 PUSH2 0x1B46 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B94 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1BBE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1BDE DUP2 PUSH2 0x1B1E JUMP JUMPDEST DUP2 EQ PUSH2 0x1BE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1BF5 DUP2 PUSH2 0x1B30 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C0C DUP2 PUSH2 0x1B3C JUMP JUMPDEST DUP2 EQ PUSH2 0x1C17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C23 DUP2 PUSH2 0x1B66 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C3A DUP2 PUSH2 0x1B70 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C51 DUP2 PUSH2 0x1B84 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEE 0xD9 0xE4 0xE6 PUSH6 0x4616F596D2A3 PUSH17 0xC9DC42DE7873FF5861377DBC3AF43FEBCA 0x28 0xA8 0xE1 PUSH5 0x736F6C6343 STOP MOD DIV STOP CALLER ",
"sourceMap": "463:8013:1:-:0;;;1876:711;5:9:-1;2:2;;;27:1;24;17:12;2:2;1876:711:1;;;;;;;;;;;;;;;;;;;;;;;;2136:24;:31;2107:18;:25;:60;2099:145;;;;;;;;;;;;;;;;;;;;;;2272:13;2255:14;;:30;;;;;;;;;;;;;;;;;;2301:9;2313:1;2301:13;;2296:145;2320:18;:25;2316:1;:29;2296:145;;;2366:64;2379:18;2398:1;2379:21;;;;;;;;;;;;;;2402:24;2427:1;2402:27;;;;;;;;;;;;;;2366:12;;;:64;;:::i;:::-;2347:3;;;;;;;2296:145;;;;2456:9;2468:1;2456:13;;2451:130;2475:25;:32;2471:1;:36;2451:130;;;2528:42;2541:25;2567:1;2541:28;;;;;;;;;;;;;;2528:12;;;:42;;:::i;:::-;2509:3;;;;;;;2451:130;;;;1876:711;;;;463:8013;;2441:282:2;2575:15;2527:33;:45;2561:10;2527:45;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;2653:10;2600:33;:50;2634:15;2600:50;;;;;;;;;;;;;;;:63;;;;2712:4;2674:18;:35;2693:15;2674:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;2441:282;;:::o;2729:200::-;2803:18;:35;2822:15;2803:35;;;;;;;;;;;;;;;;;;;;;;;;;2795:84;;;;;;;;;;;;;;;;;;;;;;2918:4;2889:9;:26;2899:15;2889:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;2729:200;:::o;5:134:-1:-;;89:6;83:13;74:22;;101:33;128:5;101:33;;;68:71;;;;;164:722;;292:3;285:4;277:6;273:17;269:27;259:2;;310:1;307;300:12;259:2;340:6;334:13;362:80;377:64;434:6;377:64;;;362:80;;;353:89;;459:5;484:6;477:5;470:21;514:4;506:6;502:17;492:27;;536:4;531:3;527:14;520:21;;589:6;636:3;628:4;620:6;616:17;611:3;607:27;604:36;601:2;;;653:1;650;643:12;601:2;678:1;663:217;688:6;685:1;682:13;663:217;;;746:3;768:48;812:3;800:10;768:48;;;763:3;756:61;840:4;835:3;831:14;824:21;;868:4;863:3;859:14;852:21;;720:160;710:1;707;703:9;698:14;;663:217;;;667:14;252:634;;;;;;;;912:722;;1040:3;1033:4;1025:6;1021:17;1017:27;1007:2;;1058:1;1055;1048:12;1007:2;1088:6;1082:13;1110:80;1125:64;1182:6;1125:64;;;1110:80;;;1101:89;;1207:5;1232:6;1225:5;1218:21;1262:4;1254:6;1250:17;1240:27;;1284:4;1279:3;1275:14;1268:21;;1337:6;1384:3;1376:4;1368:6;1364:17;1359:3;1355:27;1352:36;1349:2;;;1401:1;1398;1391:12;1349:2;1426:1;1411:217;1436:6;1433:1;1430:13;1411:217;;;1494:3;1516:48;1560:3;1548:10;1516:48;;;1511:3;1504:61;1588:4;1583:3;1579:14;1572:21;;1616:4;1611:3;1607:14;1600:21;;1468:160;1458:1;1455;1451:9;1446:14;;1411:217;;;1415:14;1000:634;;;;;;;;1642:134;;1726:6;1720:13;1711:22;;1738:33;1765:5;1738:33;;;1705:71;;;;;1783:1059;;;;;2024:3;2012:9;2003:7;1999:23;1995:33;1992:2;;;2041:1;2038;2031:12;1992:2;2076:1;2093:64;2149:7;2140:6;2129:9;2125:22;2093:64;;;2083:74;;2055:108;2215:2;2204:9;2200:18;2194:25;2239:18;2231:6;2228:30;2225:2;;;2271:1;2268;2261:12;2225:2;2291:89;2372:7;2363:6;2352:9;2348:22;2291:89;;;2281:99;;2173:213;2438:2;2427:9;2423:18;2417:25;2462:18;2454:6;2451:30;2448:2;;;2494:1;2491;2484:12;2448:2;2514:89;2595:7;2586:6;2575:9;2571:22;2514:89;;;2504:99;;2396:213;2661:2;2650:9;2646:18;2640:25;2685:18;2677:6;2674:30;2671:2;;;2717:1;2714;2707:12;2671:2;2737:89;2818:7;2809:6;2798:9;2794:22;2737:89;;;2727:99;;2619:213;1986:856;;;;;;;;2850:373;;3010:67;3074:2;3069:3;3010:67;;;3003:74;;3110:34;3106:1;3101:3;3097:11;3090:55;3179:6;3174:2;3169:3;3165:12;3158:28;3214:2;3209:3;3205:12;3198:19;;2996:227;;;;3232:397;;3392:67;3456:2;3451:3;3392:67;;;3385:74;;3492:34;3488:1;3483:3;3479:11;3472:55;3561:30;3556:2;3551:3;3547:12;3540:52;3620:2;3615:3;3611:12;3604:19;;3378:251;;;;3637:407;;3828:2;3817:9;3813:18;3805:26;;3878:9;3872:4;3868:20;3864:1;3853:9;3849:17;3842:47;3903:131;4029:4;3903:131;;;3895:139;;3799:245;;;;4051:407;;4242:2;4231:9;4227:18;4219:26;;4292:9;4286:4;4282:20;4278:1;4267:9;4263:17;4256:47;4317:131;4443:4;4317:131;;;4309:139;;4213:245;;;;4465:256;;4527:2;4521:9;4511:19;;4565:4;4557:6;4553:17;4664:6;4652:10;4649:22;4628:18;4616:10;4613:34;4610:62;4607:2;;;4685:1;4682;4675:12;4607:2;4705:10;4701:2;4694:22;4505:216;;;;;4728:304;;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4954:4;4946:6;4942:17;4934:25;;5017:4;5011;5007:15;4999:23;;4810:222;;;;5039:304;;5198:18;5190:6;5187:30;5184:2;;;5230:1;5227;5220:12;5184:2;5265:4;5257:6;5253:17;5245:25;;5328:4;5322;5318:15;5310:23;;5121:222;;;;5351:163;;5466:6;5461:3;5454:19;5503:4;5498:3;5494:14;5479:29;;5447:67;;;;;5522:91;;5584:24;5602:5;5584:24;;;5573:35;;5567:46;;;;5620:72;;5682:5;5671:16;;5665:27;;;;5699:121;;5772:42;5765:5;5761:54;5750:65;;5744:76;;;;5827:117;5896:24;5914:5;5896:24;;;5889:5;5886:35;5876:2;;5935:1;5932;5925:12;5876:2;5870:74;;5951:117;6020:24;6038:5;6020:24;;;6013:5;6010:35;6000:2;;6059:1;6056;6049:12;6000:2;5994:74;;463:8013:1;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100cf5760003560e01c80637f79bea81161008c578063ba484c0911610066578063ba484c0914610228578063c8ba6c8714610258578063d9caed1214610288578063e248cff2146102a4576100cf565b80637f79bea8146101c057806395601f09146101f0578063b8fa37361461020c576100cf565b806307b7ed99146100d45780630a6d55d8146100f0578063318c136e1461012057806338995da91461013e5780634402027f1461015a5780636a70d08114610190575b600080fd5b6100ee60048036038101906100e99190611310565b6102c0565b005b61010a600480360381019061010591906113b1565b6102d4565b60405161011791906118e1565b60405180910390f35b610128610307565b60405161013591906118e1565b60405180910390f35b6101586004803603810190610153919061146e565b61032c565b005b610174600480360381019061016f919061153c565b61063f565b604051610187979695949392919061195c565b60405180910390f35b6101aa60048036038101906101a59190611310565b610780565b6040516101b791906119d2565b60405180910390f35b6101da60048036038101906101d59190611310565b6107a0565b6040516101e791906119d2565b60405180910390f35b61020a60048036038101906102059190611339565b6107c0565b005b610226600480360381019061022191906113da565b6107d7565b005b610242600480360381019061023d9190611500565b6107ed565b60405161024f9190611aa8565b60405180910390f35b610272600480360381019061026d9190611310565b6109e2565b60405161027f91906119ed565b60405180910390f35b6102a2600480360381019061029d9190611339565b6109fa565b005b6102be60048036038101906102b99190611416565b610a12565b005b6102c8610b86565b6102d181610c17565b50565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610334610b86565b606060008060c4359150604051925060e4359050808301602001604052600e360360e484376000600160008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661041d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041490611a88565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561047f5761047a818885610cfe565b61048c565b61048b81883086610d76565b5b6040518060e001604052808273ffffffffffffffffffffffffffffffffffffffff1681526020018360ff1681526020018a60ff1681526020018b81526020018581526020018873ffffffffffffffffffffffffffffffffffffffff16815260200184815250600560008b60ff1660ff16815260200190815260200160002060008a67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff1602179055506060820151816001015560808201518160020190805190602001906105de929190611131565b5060a08201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816004015590505050505050505050505050565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff1690806001015490806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561074a5780601f1061071f5761010080835404028352916020019161074a565b820191906000526020600020905b81548152906001019060200180831161072d57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905087565b60046020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b60008390506107d181843085610d8e565b50505050565b6107df610b86565b6107e98282610e17565b5050565b6107f56111b1565b600560008360ff1660ff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660ff1660ff1681526020016000820160159054906101000a900460ff1660ff1660ff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600482015481525050905092915050565b60026020528060005260406000206000915090505481565b610a02610b86565b610a0d838383610f09565b505050565b610a1a610b86565b60006060606435915060405190506084358082016020016040526084360360848337506000806001600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060208301519150600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090611a88565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b6e57610b69818360601c86610f1f565b610b7d565b610b7c818360601c86610f09565b5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90611a28565b60405180910390fd5b565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90611a48565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008390508073ffffffffffffffffffffffffffffffffffffffff166379cc679084846040518363ffffffff1660e01b8152600401610d3e929190611933565b600060405180830381600087803b158015610d5857600080fd5b505af1158015610d6c573d6000803e3d6000fd5b5050505050505050565b6000849050610d8781858585610d8e565b5050505050565b610e11846323b872dd60e01b858585604051602401610daf939291906118fc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f97565b50505050565b806001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000839050610f198184846110ab565b50505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401610f5f929190611933565b600060405180830381600087803b158015610f7957600080fd5b505af1158015610f8d573d6000803e3d6000fd5b5050505050505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610fc091906118ca565b6000604051808303816000865af19150503d8060008114610ffd576040519150601f19603f3d011682016040523d82523d6000602084013e611002565b606091505b509150915081611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90611a68565b60405180910390fd5b6000815111156110a557808060200190518101906110659190611388565b6110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90611a08565b60405180910390fd5b5b50505050565b61112c8363a9059cbb60e01b84846040516024016110ca929190611933565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f97565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061117257805160ff19168380011785556111a0565b828001600101855582156111a0579182015b8281111561119f578251825591602001919060010190611184565b5b5090506111ad9190611223565b5090565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600060ff1681526020016000801916815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b61124591905b80821115611241576000816000905550600101611229565b5090565b90565b60008135905061125781611bd5565b92915050565b60008151905061126c81611bec565b92915050565b60008135905061128181611c03565b92915050565b60008083601f84011261129957600080fd5b8235905067ffffffffffffffff8111156112b257600080fd5b6020830191508360018202830111156112ca57600080fd5b9250929050565b6000813590506112e081611c1a565b92915050565b6000813590506112f581611c31565b92915050565b60008135905061130a81611c48565b92915050565b60006020828403121561132257600080fd5b600061133084828501611248565b91505092915050565b60008060006060848603121561134e57600080fd5b600061135c86828701611248565b935050602061136d86828701611248565b925050604061137e868287016112d1565b9150509250925092565b60006020828403121561139a57600080fd5b60006113a88482850161125d565b91505092915050565b6000602082840312156113c357600080fd5b60006113d184828501611272565b91505092915050565b600080604083850312156113ed57600080fd5b60006113fb85828601611272565b925050602061140c85828601611248565b9150509250929050565b60008060006040848603121561142b57600080fd5b600061143986828701611272565b935050602084013567ffffffffffffffff81111561145657600080fd5b61146286828701611287565b92509250509250925092565b60008060008060008060a0878903121561148757600080fd5b600061149589828a01611272565b96505060206114a689828a016112fb565b95505060406114b789828a016112e6565b94505060606114c889828a01611248565b935050608087013567ffffffffffffffff8111156114e557600080fd5b6114f189828a01611287565b92509250509295509295509295565b6000806040838503121561151357600080fd5b6000611521858286016112e6565b9250506020611532858286016112fb565b9150509250929050565b6000806040838503121561154f57600080fd5b600061155d858286016112fb565b925050602061156e858286016112e6565b9150509250929050565b61158181611b1e565b82525050565b61159081611b1e565b82525050565b61159f81611b30565b82525050565b6115ae81611b3c565b82525050565b6115bd81611b3c565b82525050565b60006115ce82611ad5565b6115d88185611b02565b93506115e8818560208601611b91565b80840191505092915050565b60006115ff82611aca565b6116098185611ae0565b9350611619818560208601611b91565b61162281611bc4565b840191505092915050565b600061163882611aca565b6116428185611af1565b9350611652818560208601611b91565b61165b81611bc4565b840191505092915050565b6000611673602083611b0d565b91507f45524332303a206f7065726174696f6e20646964206e6f7420737563636565646000830152602082019050919050565b60006116b3601e83611b0d565b91507f73656e646572206d7573742062652062726964676520636f6e747261637400006000830152602082019050919050565b60006116f3602483611b0d565b91507f70726f766964656420636f6e7472616374206973206e6f742077686974656c6960008301527f73746564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611759601283611b0d565b91507f45524332303a2063616c6c206661696c656400000000000000000000000000006000830152602082019050919050565b6000611799602883611b0d565b91507f70726f766964656420746f6b656e41646472657373206973206e6f742077686960008301527f74656c69737465640000000000000000000000000000000000000000000000006020830152604082019050919050565b600060e08301600083015161180a6000860182611578565b50602083015161181d60208601826118ac565b50604083015161183060408601826118ac565b50606083015161184360608601826115a5565b506080830151848203608086015261185b82826115f4565b91505060a083015161187060a0860182611578565b5060c083015161188360c086018261188e565b508091505092915050565b61189781611b66565b82525050565b6118a681611b66565b82525050565b6118b581611b84565b82525050565b6118c481611b84565b82525050565b60006118d682846115c3565b915081905092915050565b60006020820190506118f66000830184611587565b92915050565b60006060820190506119116000830186611587565b61191e6020830185611587565b61192b604083018461189d565b949350505050565b60006040820190506119486000830185611587565b611955602083018461189d565b9392505050565b600060e082019050611971600083018a611587565b61197e60208301896118bb565b61198b60408301886118bb565b61199860608301876115b4565b81810360808301526119aa818661162d565b90506119b960a0830185611587565b6119c660c083018461189d565b98975050505050505050565b60006020820190506119e76000830184611596565b92915050565b6000602082019050611a0260008301846115b4565b92915050565b60006020820190508181036000830152611a2181611666565b9050919050565b60006020820190508181036000830152611a41816116a6565b9050919050565b60006020820190508181036000830152611a61816116e6565b9050919050565b60006020820190508181036000830152611a818161174c565b9050919050565b60006020820190508181036000830152611aa18161178c565b9050919050565b60006020820190508181036000830152611ac281846117f2565b905092915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000611b2982611b46565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60005b83811015611baf578082015181840152602081019050611b94565b83811115611bbe576000848401525b50505050565b6000601f19601f8301169050919050565b611bde81611b1e565b8114611be957600080fd5b50565b611bf581611b30565b8114611c0057600080fd5b50565b611c0c81611b3c565b8114611c1757600080fd5b50565b611c2381611b66565b8114611c2e57600080fd5b50565b611c3a81611b70565b8114611c4557600080fd5b50565b611c5181611b84565b8114611c5c57600080fd5b5056fea2646970667358221220eed9e4e6654616f596d2a370c9dc42de7873ff5861377dbc3af43febca28a8e164736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xCF JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F79BEA8 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xBA484C09 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xBA484C09 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0xC8BA6C87 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0xD9CAED12 EQ PUSH2 0x288 JUMPI DUP1 PUSH4 0xE248CFF2 EQ PUSH2 0x2A4 JUMPI PUSH2 0xCF JUMP JUMPDEST DUP1 PUSH4 0x7F79BEA8 EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0x95601F09 EQ PUSH2 0x1F0 JUMPI DUP1 PUSH4 0xB8FA3736 EQ PUSH2 0x20C JUMPI PUSH2 0xCF JUMP JUMPDEST DUP1 PUSH4 0x7B7ED99 EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0xA6D55D8 EQ PUSH2 0xF0 JUMPI DUP1 PUSH4 0x318C136E EQ PUSH2 0x120 JUMPI DUP1 PUSH4 0x38995DA9 EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0x4402027F EQ PUSH2 0x15A JUMPI DUP1 PUSH4 0x6A70D081 EQ PUSH2 0x190 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xE9 SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x2C0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x10A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x105 SWAP2 SWAP1 PUSH2 0x13B1 JUMP JUMPDEST PUSH2 0x2D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x18E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x128 PUSH2 0x307 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x135 SWAP2 SWAP1 PUSH2 0x18E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x158 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x153 SWAP2 SWAP1 PUSH2 0x146E JUMP JUMPDEST PUSH2 0x32C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x174 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x16F SWAP2 SWAP1 PUSH2 0x153C JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x187 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x195C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1AA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1A5 SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x780 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1B7 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1DA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1D5 SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x7A0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E7 SWAP2 SWAP1 PUSH2 0x19D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x20A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x205 SWAP2 SWAP1 PUSH2 0x1339 JUMP JUMPDEST PUSH2 0x7C0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x226 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x13DA JUMP JUMPDEST PUSH2 0x7D7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x242 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x23D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x7ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x24F SWAP2 SWAP1 PUSH2 0x1AA8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x272 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x26D SWAP2 SWAP1 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x9E2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x27F SWAP2 SWAP1 PUSH2 0x19ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2A2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x29D SWAP2 SWAP1 PUSH2 0x1339 JUMP JUMPDEST PUSH2 0x9FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2BE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x2B9 SWAP2 SWAP1 PUSH2 0x1416 JUMP JUMPDEST PUSH2 0xA12 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2C8 PUSH2 0xB86 JUMP JUMPDEST PUSH2 0x2D1 DUP2 PUSH2 0xC17 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x334 PUSH2 0xB86 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0xC4 CALLDATALOAD SWAP2 POP PUSH1 0x40 MLOAD SWAP3 POP PUSH1 0xE4 CALLDATALOAD SWAP1 POP DUP1 DUP4 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0xE CALLDATASIZE SUB PUSH1 0xE4 DUP5 CALLDATACOPY PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x41D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x414 SWAP1 PUSH2 0x1A88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x47F JUMPI PUSH2 0x47A DUP2 DUP9 DUP6 PUSH2 0xCFE JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST PUSH2 0x48B DUP2 DUP9 ADDRESS DUP7 PUSH2 0xD76 JUMP JUMPDEST JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE POP PUSH1 0x5 PUSH1 0x0 DUP12 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x15 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5DE SWAP3 SWAP2 SWAP1 PUSH2 0x1131 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SSTORE SWAP1 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x0 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x0 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x74A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x71F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x74A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x72D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x4 ADD SLOAD SWAP1 POP DUP8 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP PUSH2 0x7D1 DUP2 DUP5 ADDRESS DUP6 PUSH2 0xD8E JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x7DF PUSH2 0xB86 JUMP JUMPDEST PUSH2 0x7E9 DUP3 DUP3 PUSH2 0xE17 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x7F5 PUSH2 0x11B1 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP3 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP3 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x971 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x946 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x971 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x954 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD SLOAD DUP2 MSTORE POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH2 0xA02 PUSH2 0xB86 JUMP JUMPDEST PUSH2 0xA0D DUP4 DUP4 DUP4 PUSH2 0xF09 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xA1A PUSH2 0xB86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x64 CALLDATALOAD SWAP2 POP PUSH1 0x40 MLOAD SWAP1 POP PUSH1 0x84 CALLDATALOAD DUP1 DUP3 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x84 CALLDATASIZE SUB PUSH1 0x84 DUP4 CALLDATACOPY POP PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x20 DUP4 ADD MLOAD SWAP2 POP PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0xB09 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB00 SWAP1 PUSH2 0x1A88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xB6E JUMPI PUSH2 0xB69 DUP2 DUP4 PUSH1 0x60 SHR DUP7 PUSH2 0xF1F JUMP JUMPDEST PUSH2 0xB7D JUMP JUMPDEST PUSH2 0xB7C DUP2 DUP4 PUSH1 0x60 SHR DUP7 PUSH2 0xF09 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC15 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC0C SWAP1 PUSH2 0x1A28 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0xCA3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC9A SWAP1 PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x79CC6790 DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD3E SWAP3 SWAP2 SWAP1 PUSH2 0x1933 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 SWAP1 POP PUSH2 0xD87 DUP2 DUP6 DUP6 DUP6 PUSH2 0xD8E JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE11 DUP5 PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xDAF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH2 0xF97 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP PUSH2 0xF19 DUP2 DUP5 DUP5 PUSH2 0x10AB JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x40C10F19 DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF5F SWAP3 SWAP2 SWAP1 PUSH2 0x1933 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF8D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0xFC0 SWAP2 SWAP1 PUSH2 0x18CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xFFD JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1002 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x1047 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x103E SWAP1 PUSH2 0x1A68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x10A5 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1065 SWAP2 SWAP1 PUSH2 0x1388 JUMP JUMPDEST PUSH2 0x10A4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x109B SWAP1 PUSH2 0x1A08 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x112C DUP4 PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x10CA SWAP3 SWAP2 SWAP1 PUSH2 0x1933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH2 0xF97 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1172 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x11A0 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x11A0 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x119F JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1184 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x11AD SWAP2 SWAP1 PUSH2 0x1223 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x1245 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1241 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x1229 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1257 DUP2 PUSH2 0x1BD5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x126C DUP2 PUSH2 0x1BEC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1281 DUP2 PUSH2 0x1C03 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x12CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x12E0 DUP2 PUSH2 0x1C1A JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x12F5 DUP2 PUSH2 0x1C31 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x130A DUP2 PUSH2 0x1C48 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1322 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1330 DUP5 DUP3 DUP6 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x134E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x135C DUP7 DUP3 DUP8 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x136D DUP7 DUP3 DUP8 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x137E DUP7 DUP3 DUP8 ADD PUSH2 0x12D1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x139A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13A8 DUP5 DUP3 DUP6 ADD PUSH2 0x125D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x13C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13D1 DUP5 DUP3 DUP6 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x13ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13FB DUP6 DUP3 DUP7 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x140C DUP6 DUP3 DUP7 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x142B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1439 DUP7 DUP3 DUP8 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1462 DUP7 DUP3 DUP8 ADD PUSH2 0x1287 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1495 DUP10 DUP3 DUP11 ADD PUSH2 0x1272 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x14A6 DUP10 DUP3 DUP11 ADD PUSH2 0x12FB JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 PUSH2 0x14B7 DUP10 DUP3 DUP11 ADD PUSH2 0x12E6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 PUSH2 0x14C8 DUP10 DUP3 DUP11 ADD PUSH2 0x1248 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14F1 DUP10 DUP3 DUP11 ADD PUSH2 0x1287 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1521 DUP6 DUP3 DUP7 ADD PUSH2 0x12E6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1532 DUP6 DUP3 DUP7 ADD PUSH2 0x12FB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x154F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x155D DUP6 DUP3 DUP7 ADD PUSH2 0x12FB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x156E DUP6 DUP3 DUP7 ADD PUSH2 0x12E6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x1581 DUP2 PUSH2 0x1B1E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1590 DUP2 PUSH2 0x1B1E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x159F DUP2 PUSH2 0x1B30 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x15AE DUP2 PUSH2 0x1B3C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x15BD DUP2 PUSH2 0x1B3C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15CE DUP3 PUSH2 0x1AD5 JUMP JUMPDEST PUSH2 0x15D8 DUP2 DUP6 PUSH2 0x1B02 JUMP JUMPDEST SWAP4 POP PUSH2 0x15E8 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1B91 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15FF DUP3 PUSH2 0x1ACA JUMP JUMPDEST PUSH2 0x1609 DUP2 DUP6 PUSH2 0x1AE0 JUMP JUMPDEST SWAP4 POP PUSH2 0x1619 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1B91 JUMP JUMPDEST PUSH2 0x1622 DUP2 PUSH2 0x1BC4 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1638 DUP3 PUSH2 0x1ACA JUMP JUMPDEST PUSH2 0x1642 DUP2 DUP6 PUSH2 0x1AF1 JUMP JUMPDEST SWAP4 POP PUSH2 0x1652 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1B91 JUMP JUMPDEST PUSH2 0x165B DUP2 PUSH2 0x1BC4 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1673 PUSH1 0x20 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x45524332303A206F7065726174696F6E20646964206E6F742073756363656564 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16B3 PUSH1 0x1E DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E646572206D7573742062652062726964676520636F6E74726163740000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16F3 PUSH1 0x24 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420636F6E7472616374206973206E6F742077686974656C69 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x7374656400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1759 PUSH1 0x12 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x45524332303A2063616C6C206661696C65640000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1799 PUSH1 0x28 DUP4 PUSH2 0x1B0D JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420746F6B656E41646472657373206973206E6F7420776869 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x74656C6973746564000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x180A PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x1578 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x181D PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x18AC JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1830 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x18AC JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x1843 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x15A5 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x185B DUP3 DUP3 PUSH2 0x15F4 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x1870 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x1578 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x1883 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x188E JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1897 DUP2 PUSH2 0x1B66 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x18A6 DUP2 PUSH2 0x1B66 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x18B5 DUP2 PUSH2 0x1B84 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x18C4 DUP2 PUSH2 0x1B84 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18D6 DUP3 DUP5 PUSH2 0x15C3 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x18F6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1587 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD SWAP1 POP PUSH2 0x1911 PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x191E PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x192B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x189D JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x1948 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x1955 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x189D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xE0 DUP3 ADD SWAP1 POP PUSH2 0x1971 PUSH1 0x0 DUP4 ADD DUP11 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x197E PUSH1 0x20 DUP4 ADD DUP10 PUSH2 0x18BB JUMP JUMPDEST PUSH2 0x198B PUSH1 0x40 DUP4 ADD DUP9 PUSH2 0x18BB JUMP JUMPDEST PUSH2 0x1998 PUSH1 0x60 DUP4 ADD DUP8 PUSH2 0x15B4 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x19AA DUP2 DUP7 PUSH2 0x162D JUMP JUMPDEST SWAP1 POP PUSH2 0x19B9 PUSH1 0xA0 DUP4 ADD DUP6 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x19C6 PUSH1 0xC0 DUP4 ADD DUP5 PUSH2 0x189D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x19E7 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1596 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x1A02 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x15B4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A21 DUP2 PUSH2 0x1666 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A41 DUP2 PUSH2 0x16A6 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A61 DUP2 PUSH2 0x16E6 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1A81 DUP2 PUSH2 0x174C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1AA1 DUP2 PUSH2 0x178C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1AC2 DUP2 DUP5 PUSH2 0x17F2 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B29 DUP3 PUSH2 0x1B46 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B94 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1BBE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1BDE DUP2 PUSH2 0x1B1E JUMP JUMPDEST DUP2 EQ PUSH2 0x1BE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1BF5 DUP2 PUSH2 0x1B30 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C0C DUP2 PUSH2 0x1B3C JUMP JUMPDEST DUP2 EQ PUSH2 0x1C17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C23 DUP2 PUSH2 0x1B66 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C3A DUP2 PUSH2 0x1B70 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1C51 DUP2 PUSH2 0x1B84 JUMP JUMPDEST DUP2 EQ PUSH2 0x1C5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEE 0xD9 0xE4 0xE6 PUSH6 0x4616F596D2A3 PUSH17 0xC9DC42DE7873FF5861377DBC3AF43FEBCA 0x28 0xA8 0xE1 PUSH5 0x736F6C6343 STOP MOD DIV STOP CALLER ",
"sourceMap": "463:8013:1:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;463:8013:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;1897:120:2;;;;;;;;;;;;;;;;:::i;:::-;;355:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;275:29;;;:::i;:::-;;;;;;;;;;;;;;;;4508:1470:1;;;;;;;;;;;;;;;;:::i;:::-;;855:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;702:42:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;599:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;967:195:0;;;;;;;;;;;;;;;;:::i;:::-;;1501:154:2;;;;;;;;;;;;;;;;:::i;:::-;;3380:167:1;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;475:69:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8311:163:1;;;;;;;;;;;;;;;;:::i;:::-;;6623:1414;;;;;;;;;;;;;;;;:::i;:::-;;1897:120:2;783:13;:11;:13::i;:::-;1981:29:::1;1994:15;1981:12;:29::i;:::-;1897:120:::0;:::o;355:69::-;;;;;;;;;;;;;;;;;;;;;;:::o;275:29::-;;;;;;;;;;;;;:::o;4508:1470:1:-;783:13:2;:11;:13::i;:::-;4722:31:1::1;4763:21;4794:34:::0;4886:4:::1;4873:18;4863:28;;4931:4;4925:11;4905:31;;4985:4;4972:18;4949:41;;5048:19;5030:16;5026:42;5020:4;5016:53;5010:4;5003:67;5259:3;5243:14;5239:24;5187:4;5114:16;5084:229;5333:20;5356:33;:45;5390:10;5356:45;;;;;;;;;;;;;;;;;;;;;5333:68;;5419:18;:32;5438:12;5419:32;;;;;;;;;;;;;;;;;;;;;;;;;5411:85;;;;;;;;;;;;;;;;;;;;;;5511:9;:23;5521:12;5511:23;;;;;;;;;;;;;;;;;;;;;;;;;5507:184;;;5550:42;5560:12;5574:9;5585:6;5550:9;:42::i;:::-;5507:184;;;5623:57;5633:12;5647:9;5666:4;5673:6;5623:9;:57::i;:::-;5507:184;5753:218;;;;;;;;5780:12;5753:218;;;;;;5812:19;5753:218;;;;;;5846:18;5753:218;;;;;;5878:10;5753:218;;;;5902:16;5753:218;;;;5932:9;5753:218;;;;;;5955:6;5753:218;;::::0;5701:15:::1;:35;5717:18;5701:35;;;;;;;;;;;;;;;:49;5737:12;5701:49;;;;;;;;;;;;;;;:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;806:1:2;;;;4508:1470:1::0;;;;;;:::o;855:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;702:42:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;599:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;967:195:0:-;1056:12;1078;1056:35;;1101:54;1119:5;1126;1141:4;1148:6;1101:17;:54::i;:::-;967:195;;;;:::o;1501:154:2:-;783:13;:11;:13::i;:::-;1607:41:::1;1620:10;1632:15;1607:12;:41::i;:::-;1501:154:::0;;:::o;3380:167:1:-;3464:20;;:::i;:::-;3503:15;:23;3519:6;3503:23;;;;;;;;;;;;;;;:37;3527:12;3503:37;;;;;;;;;;;;;;;3496:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3380:167;;;;:::o;475:69:2:-;;;;;;;;;;;;;;;;;:::o;8311:163:1:-;783:13:2;:11;:13::i;:::-;8422:45:1::1;8435:12;8449:9;8460:6;8422:12;:45::i;:::-;8311:163:::0;;;:::o;6623:1414::-;783:13:2;:11;:13::i;:::-;6728:20:1::1;6758:41;6856:4;6843:18;6833:28;;6912:4;6906:11;6875:42;;6981:4;6968:18;7055:30;7026:27;7022:64;7016:4;7012:75;7006:4;6999:89;7435:4;7419:14;7415:25;7364:4;7280:27;7250:240;6819:681;7510:24;7544:20:::0;7567:33:::1;:45;7601:10;7567:45;;;;;;;;;;;;;;;;;;;;;7544:68;;7705:4;7676:27;7672:38;7666:45;7646:65;;7739:18;:32;7758:12;7739:32;;;;;;;;;;;;;;;;;;;;;;;;;7731:85;;;;;;;;;;;;;;;;;;;;;;7831:9;:23;7841:12;7831:23;;;;;;;;;;;;;;;;;;;;;;;;;7827:204;;;7870:58;7880:12;7902:16;7894:25;;7921:6;7870:9;:58::i;:::-;7827:204;;;7959:61;7972:12;7994:16;7986:25;;8013:6;7959:12;:61::i;:::-;7827:204;806:1:2;;;;6623:1414:1::0;;;:::o;820:119:2:-;883:14;;;;;;;;;;;869:28;;:10;:28;;;861:71;;;;;;;;;;;;;;;;;;;;;;820:119::o;2729:200::-;2803:18;:35;2822:15;2803:35;;;;;;;;;;;;;;;;;;;;;;;;;2795:84;;;;;;;;;;;;;;;;;;;;;;2918:4;2889:9;:26;2899:15;2889:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;2729:200;:::o;2745:186:0:-;2836:19;2872:12;2836:49;;2895:5;:14;;;2910:5;2917:6;2895:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2895:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2895:29:0;;;;2745:186;;;;:::o;1460:212::-;1570:12;1592;1570:35;;1615:50;1633:5;1640;1647:9;1658:6;1615:17;:50::i;:::-;1460:212;;;;;:::o;3574:193::-;3674:86;3684:5;3714:27;;;3743:4;3749:2;3753:5;3691:68;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3691:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;3691:68:0;3674:9;:86::i;:::-;3574:193;;;;:::o;2441:282:2:-;2575:15;2527:33;:45;2561:10;2527:45;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;2653:10;2600:33;:50;2634:15;2600:50;;;;;;;;;;;;;;;:63;;;;2712:4;2674:18;:35;2693:15;2674:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;2441:282;;:::o;1917:189:0:-;2015:12;2037;2015:35;;2060:39;2074:5;2081:9;2092:6;2060:13;:39::i;:::-;1917:189;;;;:::o;2327:211::-;2422:29;2478:12;2422:69;;2501:5;:10;;;2512:9;2523:6;2501:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2501:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2501:29:0;;;;2327:211;;;;:::o;3928:338::-;4007:12;4021:23;4056:5;4048:19;;4068:4;4048:25;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;4006:67:0;;;;4091:7;4083:38;;;;;;;;;;;;;;;;;;;;;;4156:1;4136:10;:17;:21;4132:128;;;4193:10;4182:30;;;;;;;;;;;;;;4174:75;;;;;;;;;;;;;;;;;;;;;;4132:128;3928:338;;;;:::o;3144:165::-;3226:76;3236:5;3266:23;;;3291:2;3295:5;3243:58;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3243:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;3243:58:0;3226:9;:76::i;:::-;3144:165;;;:::o;463:8013:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:128;;223:6;217:13;208:22;;235:30;259:5;235:30;;;202:68;;;;;277:130;;357:6;344:20;335:29;;369:33;396:5;369:33;;;329:78;;;;;428:336;;;542:3;535:4;527:6;523:17;519:27;509:2;;560:1;557;550:12;509:2;593:6;580:20;570:30;;620:18;612:6;609:30;606:2;;;652:1;649;642:12;606:2;686:4;678:6;674:17;662:29;;737:3;729:4;721:6;717:17;707:8;703:32;700:41;697:2;;;754:1;751;744:12;697:2;502:262;;;;;;772:130;;852:6;839:20;830:29;;864:33;891:5;864:33;;;824:78;;;;;909:128;;988:6;975:20;966:29;;1000:32;1026:5;1000:32;;;960:77;;;;;1044:126;;1122:6;1109:20;1100:29;;1134:31;1159:5;1134:31;;;1094:76;;;;;1177:241;;1281:2;1269:9;1260:7;1256:23;1252:32;1249:2;;;1297:1;1294;1287:12;1249:2;1332:1;1349:53;1394:7;1385:6;1374:9;1370:22;1349:53;;;1339:63;;1311:97;1243:175;;;;;1425:491;;;;1563:2;1551:9;1542:7;1538:23;1534:32;1531:2;;;1579:1;1576;1569:12;1531:2;1614:1;1631:53;1676:7;1667:6;1656:9;1652:22;1631:53;;;1621:63;;1593:97;1721:2;1739:53;1784:7;1775:6;1764:9;1760:22;1739:53;;;1729:63;;1700:98;1829:2;1847:53;1892:7;1883:6;1872:9;1868:22;1847:53;;;1837:63;;1808:98;1525:391;;;;;;1923:257;;2035:2;2023:9;2014:7;2010:23;2006:32;2003:2;;;2051:1;2048;2041:12;2003:2;2086:1;2103:61;2156:7;2147:6;2136:9;2132:22;2103:61;;;2093:71;;2065:105;1997:183;;;;;2187:241;;2291:2;2279:9;2270:7;2266:23;2262:32;2259:2;;;2307:1;2304;2297:12;2259:2;2342:1;2359:53;2404:7;2395:6;2384:9;2380:22;2359:53;;;2349:63;;2321:97;2253:175;;;;;2435:366;;;2556:2;2544:9;2535:7;2531:23;2527:32;2524:2;;;2572:1;2569;2562:12;2524:2;2607:1;2624:53;2669:7;2660:6;2649:9;2645:22;2624:53;;;2614:63;;2586:97;2714:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;;;2722:63;;2693:98;2518:283;;;;;;2808:490;;;;2948:2;2936:9;2927:7;2923:23;2919:32;2916:2;;;2964:1;2961;2954:12;2916:2;2999:1;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;;;3006:63;;2978:97;3134:2;3123:9;3119:18;3106:32;3158:18;3150:6;3147:30;3144:2;;;3190:1;3187;3180:12;3144:2;3218:64;3274:7;3265:6;3254:9;3250:22;3218:64;;;3208:74;;;;3085:203;2910:388;;;;;;3305:861;;;;;;;3493:3;3481:9;3472:7;3468:23;3464:33;3461:2;;;3510:1;3507;3500:12;3461:2;3545:1;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;;;3552:63;;3524:97;3652:2;3670:51;3713:7;3704:6;3693:9;3689:22;3670:51;;;3660:61;;3631:96;3758:2;3776:52;3820:7;3811:6;3800:9;3796:22;3776:52;;;3766:62;;3737:97;3865:2;3883:53;3928:7;3919:6;3908:9;3904:22;3883:53;;;3873:63;;3844:98;4001:3;3990:9;3986:19;3973:33;4026:18;4018:6;4015:30;4012:2;;;4058:1;4055;4048:12;4012:2;4086:64;4142:7;4133:6;4122:9;4118:22;4086:64;;;4076:74;;;;3952:204;3455:711;;;;;;;;;4173:360;;;4291:2;4279:9;4270:7;4266:23;4262:32;4259:2;;;4307:1;4304;4297:12;4259:2;4342:1;4359:52;4403:7;4394:6;4383:9;4379:22;4359:52;;;4349:62;;4321:96;4448:2;4466:51;4509:7;4500:6;4489:9;4485:22;4466:51;;;4456:61;;4427:96;4253:280;;;;;;4540:360;;;4658:2;4646:9;4637:7;4633:23;4629:32;4626:2;;;4674:1;4671;4664:12;4626:2;4709:1;4726:51;4769:7;4760:6;4749:9;4745:22;4726:51;;;4716:61;;4688:95;4814:2;4832:52;4876:7;4867:6;4856:9;4852:22;4832:52;;;4822:62;;4793:97;4620:280;;;;;;4907:103;4980:24;4998:5;4980:24;;;4975:3;4968:37;4962:48;;;5017:113;5100:24;5118:5;5100:24;;;5095:3;5088:37;5082:48;;;5137:104;5214:21;5229:5;5214:21;;;5209:3;5202:34;5196:45;;;5248:103;5321:24;5339:5;5321:24;;;5316:3;5309:37;5303:48;;;5358:113;5441:24;5459:5;5441:24;;;5436:3;5429:37;5423:48;;;5478:356;;5606:38;5638:5;5606:38;;;5656:88;5737:6;5732:3;5656:88;;;5649:95;;5749:52;5794:6;5789:3;5782:4;5775:5;5771:16;5749:52;;;5822:6;5817:3;5813:16;5806:23;;5586:248;;;;;;5841:315;;5937:34;5965:5;5937:34;;;5983:60;6036:6;6031:3;5983:60;;;5976:67;;6048:52;6093:6;6088:3;6081:4;6074:5;6070:16;6048:52;;;6121:29;6143:6;6121:29;;;6116:3;6112:39;6105:46;;5917:239;;;;;;6163:335;;6269:34;6297:5;6269:34;;;6315:70;6378:6;6373:3;6315:70;;;6308:77;;6390:52;6435:6;6430:3;6423:4;6416:5;6412:16;6390:52;;;6463:29;6485:6;6463:29;;;6458:3;6454:39;6447:46;;6249:249;;;;;;6506:332;;6666:67;6730:2;6725:3;6666:67;;;6659:74;;6766:34;6762:1;6757:3;6753:11;6746:55;6829:2;6824:3;6820:12;6813:19;;6652:186;;;;6847:330;;7007:67;7071:2;7066:3;7007:67;;;7000:74;;7107:32;7103:1;7098:3;7094:11;7087:53;7168:2;7163:3;7159:12;7152:19;;6993:184;;;;7186:373;;7346:67;7410:2;7405:3;7346:67;;;7339:74;;7446:34;7442:1;7437:3;7433:11;7426:55;7515:6;7510:2;7505:3;7501:12;7494:28;7550:2;7545:3;7541:12;7534:19;;7332:227;;;;7568:318;;7728:67;7792:2;7787:3;7728:67;;;7721:74;;7828:20;7824:1;7819:3;7815:11;7808:41;7877:2;7872:3;7868:12;7861:19;;7714:172;;;;7895:377;;8055:67;8119:2;8114:3;8055:67;;;8048:74;;8155:34;8151:1;8146:3;8142:11;8135:55;8224:10;8219:2;8214:3;8210:12;8203:32;8263:2;8258:3;8254:12;8247:19;;8041:231;;;;8357:1428;;8518:4;8513:3;8509:14;8610:4;8603:5;8599:16;8593:23;8622:63;8679:4;8674:3;8670:14;8656:12;8622:63;;;8538:153;8791:4;8784:5;8780:16;8774:23;8803:59;8856:4;8851:3;8847:14;8833:12;8803:59;;;8701:167;8956:4;8949:5;8945:16;8939:23;8968:59;9021:4;9016:3;9012:14;8998:12;8968:59;;;8878:155;9113:4;9106:5;9102:16;9096:23;9125:63;9182:4;9177:3;9173:14;9159:12;9125:63;;;9043:151;9291:4;9284:5;9280:16;9274:23;9343:3;9337:4;9333:14;9326:4;9321:3;9317:14;9310:38;9363:67;9425:4;9411:12;9363:67;;;9355:75;;9204:238;9521:4;9514:5;9510:16;9504:23;9533:63;9590:4;9585:3;9581:14;9567:12;9533:63;;;9452:150;9678:4;9671:5;9667:16;9661:23;9690:63;9747:4;9742:3;9738:14;9724:12;9690:63;;;9612:147;9776:4;9769:11;;8491:1294;;;;;;9792:103;9865:24;9883:5;9865:24;;;9860:3;9853:37;9847:48;;;9902:113;9985:24;10003:5;9985:24;;;9980:3;9973:37;9967:48;;;10022:97;10091:22;10107:5;10091:22;;;10086:3;10079:35;10073:46;;;10126:107;10205:22;10221:5;10205:22;;;10200:3;10193:35;10187:46;;;10240:262;;10384:93;10473:3;10464:6;10384:93;;;10377:100;;10494:3;10487:10;;10365:137;;;;;10509:213;;10627:2;10616:9;10612:18;10604:26;;10641:71;10709:1;10698:9;10694:17;10685:6;10641:71;;;10598:124;;;;;10729:435;;10903:2;10892:9;10888:18;10880:26;;10917:71;10985:1;10974:9;10970:17;10961:6;10917:71;;;10999:72;11067:2;11056:9;11052:18;11043:6;10999:72;;;11082;11150:2;11139:9;11135:18;11126:6;11082:72;;;10874:290;;;;;;;11171:324;;11317:2;11306:9;11302:18;11294:26;;11331:71;11399:1;11388:9;11384:17;11375:6;11331:71;;;11413:72;11481:2;11470:9;11466:18;11457:6;11413:72;;;11288:207;;;;;;11502:943;;11794:3;11783:9;11779:19;11771:27;;11809:71;11877:1;11866:9;11862:17;11853:6;11809:71;;;11891:68;11955:2;11944:9;11940:18;11931:6;11891:68;;;11970;12034:2;12023:9;12019:18;12010:6;11970:68;;;12049:72;12117:2;12106:9;12102:18;12093:6;12049:72;;;12170:9;12164:4;12160:20;12154:3;12143:9;12139:19;12132:49;12195:72;12262:4;12253:6;12195:72;;;12187:80;;12278:73;12346:3;12335:9;12331:19;12322:6;12278:73;;;12362;12430:3;12419:9;12415:19;12406:6;12362:73;;;11765:680;;;;;;;;;;;12452:201;;12564:2;12553:9;12549:18;12541:26;;12578:65;12640:1;12629:9;12625:17;12616:6;12578:65;;;12535:118;;;;;12660:213;;12778:2;12767:9;12763:18;12755:26;;12792:71;12860:1;12849:9;12845:17;12836:6;12792:71;;;12749:124;;;;;12880:407;;13071:2;13060:9;13056:18;13048:26;;13121:9;13115:4;13111:20;13107:1;13096:9;13092:17;13085:47;13146:131;13272:4;13146:131;;;13138:139;;13042:245;;;;13294:407;;13485:2;13474:9;13470:18;13462:26;;13535:9;13529:4;13525:20;13521:1;13510:9;13506:17;13499:47;13560:131;13686:4;13560:131;;;13552:139;;13456:245;;;;13708:407;;13899:2;13888:9;13884:18;13876:26;;13949:9;13943:4;13939:20;13935:1;13924:9;13920:17;13913:47;13974:131;14100:4;13974:131;;;13966:139;;13870:245;;;;14122:407;;14313:2;14302:9;14298:18;14290:26;;14363:9;14357:4;14353:20;14349:1;14338:9;14334:17;14327:47;14388:131;14514:4;14388:131;;;14380:139;;14284:245;;;;14536:407;;14727:2;14716:9;14712:18;14704:26;;14777:9;14771:4;14767:20;14763:1;14752:9;14748:17;14741:47;14802:131;14928:4;14802:131;;;14794:139;;14698:245;;;;14950:381;;15128:2;15117:9;15113:18;15105:26;;15178:9;15172:4;15168:20;15164:1;15153:9;15149:17;15142:47;15203:118;15316:4;15307:6;15203:118;;;15195:126;;15099:232;;;;;15338:117;;15427:5;15421:12;15411:22;;15392:63;;;;15462:121;;15555:5;15549:12;15539:22;;15520:63;;;;15591:152;;15695:6;15690:3;15683:19;15732:4;15727:3;15723:14;15708:29;;15676:67;;;;;15752:162;;15866:6;15861:3;15854:19;15903:4;15898:3;15894:14;15879:29;;15847:67;;;;;15923:144;;16058:3;16043:18;;16036:31;;;;;16076:163;;16191:6;16186:3;16179:19;16228:4;16223:3;16219:14;16204:29;;16172:67;;;;;16247:91;;16309:24;16327:5;16309:24;;;16298:35;;16292:46;;;;16345:85;;16418:5;16411:13;16404:21;16393:32;;16387:43;;;;16437:72;;16499:5;16488:16;;16482:27;;;;16516:121;;16589:42;16582:5;16578:54;16567:65;;16561:76;;;;16644:72;;16706:5;16695:16;;16689:27;;;;16723:96;;16795:18;16788:5;16784:30;16773:41;;16767:52;;;;16826:81;;16897:4;16890:5;16886:16;16875:27;;16869:38;;;;16915:268;16980:1;16987:101;17001:6;16998:1;16995:13;16987:101;;;17077:1;17072:3;17068:11;17062:18;17058:1;17053:3;17049:11;17042:39;17023:2;17020:1;17016:10;17011:15;;16987:101;;;17103:6;17100:1;17097:13;17094:2;;;17168:1;17159:6;17154:3;17150:16;17143:27;17094:2;16964:219;;;;;17191:97;;17279:2;17275:7;17270:2;17263:5;17259:14;17255:28;17245:38;;17239:49;;;;17296:117;17365:24;17383:5;17365:24;;;17358:5;17355:35;17345:2;;17404:1;17401;17394:12;17345:2;17339:74;;17420:111;17486:21;17501:5;17486:21;;;17479:5;17476:32;17466:2;;17522:1;17519;17512:12;17466:2;17460:71;;17538:117;17607:24;17625:5;17607:24;;;17600:5;17597:35;17587:2;;17646:1;17643;17636:12;17587:2;17581:74;;17662:117;17731:24;17749:5;17731:24;;;17724:5;17721:35;17711:2;;17770:1;17767;17760:12;17711:2;17705:74;;17786:115;17854:23;17871:5;17854:23;;;17847:5;17844:34;17834:2;;17892:1;17889;17882:12;17834:2;17828:73;;17908:113;17975:22;17991:5;17975:22;;;17968:5;17965:33;17955:2;;18012:1;18009;18002:12;17955:2;17949:72;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "1463400",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"_bridgeAddress()": "1259",
"_burnList(address)": "1656",
"_contractWhitelist(address)": "1568",
"_depositRecords(uint8,uint64)": "infinite",
"_resourceIDToTokenContractAddress(bytes32)": "1562",
"_tokenContractAddressToResourceID(address)": "1558",
"deposit(bytes32,uint8,uint64,address,bytes)": "infinite",
"executeProposal(bytes32,bytes)": "infinite",
"fundERC20(address,address,uint256)": "infinite",
"getDepositRecord(uint64,uint8)": "infinite",
"setBurnable(address)": "23279",
"setResource(bytes32,address)": "63629",
"withdraw(address,address,uint256)": "infinite"
}
},
"methodIdentifiers": {
"_bridgeAddress()": "318c136e",
"_burnList(address)": "6a70d081",
"_contractWhitelist(address)": "7f79bea8",
"_depositRecords(uint8,uint64)": "4402027f",
"_resourceIDToTokenContractAddress(bytes32)": "0a6d55d8",
"_tokenContractAddressToResourceID(address)": "c8ba6c87",
"deposit(bytes32,uint8,uint64,address,bytes)": "38995da9",
"executeProposal(bytes32,bytes)": "e248cff2",
"fundERC20(address,address,uint256)": "95601f09",
"getDepositRecord(uint64,uint8)": "ba484c09",
"setBurnable(address)": "07b7ed99",
"setResource(bytes32,address)": "b8fa3736",
"withdraw(address,address,uint256)": "d9caed12"
}
},
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "bridgeAddress",
"type": "address"
},
{
"internalType": "bytes32[]",
"name": "initialResourceIDs",
"type": "bytes32[]"
},
{
"internalType": "address[]",
"name": "initialContractAddresses",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "burnableContractAddresses",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_burnList",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"name": "_depositRecords",
"outputs": [
{
"internalType": "address",
"name": "_tokenAddress",
"type": "address"
},
{
"internalType": "uint8",
"name": "_lenDestinationRecipientAddress",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_destinationRecipientAddress",
"type": "bytes"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToTokenContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_tokenContractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "fundERC20",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "uint8",
"name": "destId",
"type": "uint8"
}
],
"name": "getDepositRecord",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "_tokenAddress",
"type": "address"
},
{
"internalType": "uint8",
"name": "_lenDestinationRecipientAddress",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_destinationRecipientAddress",
"type": "bytes"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"internalType": "struct ERC20Handler.DepositRecord",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "bridgeAddress",
"type": "address"
},
{
"internalType": "bytes32[]",
"name": "initialResourceIDs",
"type": "bytes32[]"
},
{
"internalType": "address[]",
"name": "initialContractAddresses",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "burnableContractAddresses",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_burnList",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"name": "_depositRecords",
"outputs": [
{
"internalType": "address",
"name": "_tokenAddress",
"type": "address"
},
{
"internalType": "uint8",
"name": "_lenDestinationRecipientAddress",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_destinationRecipientAddress",
"type": "bytes"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToTokenContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_tokenContractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "fundERC20",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "uint8",
"name": "destId",
"type": "uint8"
}
],
"name": "getDepositRecord",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "_tokenAddress",
"type": "address"
},
{
"internalType": "uint8",
"name": "_lenDestinationRecipientAddress",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_destinationRecipientAddress",
"type": "bytes"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"internalType": "struct ERC20Handler.DepositRecord",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"constructor": {
"details": "{initialResourceIDs} and {initialContractAddresses} must have the same length (one resourceID for every address). Also, these arrays must be ordered in the way that {initialResourceIDs}[0] is the intended resourceID for {initialContractAddresses}[0].",
"params": {
"bridgeAddress": "Contract address of previously deployed Bridge.",
"burnableContractAddresses": "These addresses will be set as burnable and when {deposit} is called, the deposited token will be burned. When {executeProposal} is called, new tokens will be minted.",
"initialContractAddresses": "These are the addresses the {initialResourceIDs} will point to, and are the contracts that will be called to perform various deposit calls.",
"initialResourceIDs": "Resource IDs are used to identify a specific contract address. These are the Resource IDs this contract will initially support."
}
},
"deposit(bytes32,uint8,uint64,address,bytes)": {
"details": "Depending if the corresponding {tokenAddress} for the parsed {resourceID} is marked true in {_burnList}, deposited tokens will be burned, if not, they will be locked.",
"params": {
"data": "Consists of: {resourceID}, {amount}, {lenRecipientAddress}, and {recipientAddress} all padded to 32 bytes.",
"depositNonce": "This value is generated as an ID by the Bridge contract.",
"depositer": "Address of account making the deposit in the Bridge contract.",
"destinationChainID": "Chain ID of chain tokens are expected to be bridged to."
}
},
"executeProposal(bytes32,bytes)": {
"params": {
"data": "Consists of {resourceID}, {amount}, {lenDestinationRecipientAddress}, and {destinationRecipientAddress} all padded to 32 bytes."
}
},
"fundERC20(address,address,uint256)": {
"params": {
"amount": "Amount of tokens to transfer.",
"owner": "Address of current token owner.",
"tokenAddress": "Address of ERC20 to transfer."
}
},
"getDepositRecord(uint64,uint8)": {
"params": {
"depositNonce": "This ID will have been generated by the Bridge contract.",
"destId": "ID of chain deposit will be bridged to."
},
"returns": {
"_0": "DepositRecord which consists of: - _tokenAddress Address used when {deposit} was executed. - _destinationChainID ChainID deposited tokens are intended to end up on. - _resourceID ResourceID used when {deposit} was executed. - _lenDestinationRecipientAddress Used to parse recipient's address from {_destinationRecipientAddress} - _destinationRecipientAddress Address tokens are intended to be deposited to on desitnation chain. - _depositer Address that initially called {deposit} in the Bridge contract. - _amount Amount of tokens that were deposited."
}
},
"setBurnable(address)": {
"params": {
"contractAddress": "Address of contract to be used when making or executing deposits."
}
},
"setResource(bytes32,address)": {
"params": {
"contractAddress": "Address of contract to be called when a deposit is made and a deposited is executed.",
"resourceID": "ResourceID to be used when making deposits."
}
},
"withdraw(address,address,uint256)": {
"params": {
"amount": "The amount of ERC20 tokens to release.",
"recipient": "Address to release tokens to.",
"tokenAddress": "Address of token contract to release."
}
}
},
"title": "Handles ERC20 deposits and deposit executions."
},
"userdoc": {
"methods": {
"deposit(bytes32,uint8,uint64,address,bytes)": {
"notice": "A deposit is initiatied by making a deposit in the Bridge contract.Data passed into the function should be constructed as follows: amount uint256 bytes 0 - 32 recipientAddress length uint256 bytes 32 - 64 recipientAddress bytes bytes 64 - END"
},
"executeProposal(bytes32,bytes)": {
"notice": "Proposal execution should be initiated when a proposal is finalized in the Bridge contract. by a relayer on the deposit's destination chain.Data passed into the function should be constructed as follows: amount uint256 bytes 0 - 32 destinationRecipientAddress length uint256 bytes 32 - 64 destinationRecipientAddress bytes bytes 64 - END"
},
"fundERC20(address,address,uint256)": {
"notice": "Used to transfer tokens into the safe to fund proposals."
},
"setBurnable(address)": {
"notice": "First verifies {contractAddress} is whitelisted, then sets {_burnList}[{contractAddress}] to true."
},
"setResource(bytes32,address)": {
"notice": "First verifies {_resourceIDToContractAddress}[{resourceID}] and {_contractAddressToResourceID}[{contractAddress}] are not already set, then sets {_resourceIDToContractAddress} with {contractAddress}, {_contractAddressToResourceID} with {resourceID}, and {_contractWhitelist} to true for {contractAddress}."
},
"withdraw(address,address,uint256)": {
"notice": "Used to manually release ERC20 tokens from ERC20Safe."
}
},
"notice": "This contract is intended to be used with the Bridge contract."
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/handlers/ERC20Handler.sol": "ERC20Handler"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/ERC20Safe.sol": {
"keccak256": "0x1b7664798e097b6e442236e1a7e722d9fe30d54086a86a9c200fb94cb3aa2e4a",
"urls": [
"bzz-raw://e8ee9c497f830dc5cd9c3ed0e6312a0b238862543ed791474f76cd518e137049",
"dweb:/ipfs/QmdRzN5SLRgtCvhWrYk9Y78isdoCEBf5MBaShQB2QLje8T"
]
},
"chain-bridge-solidity/handlers/ERC20Handler.sol": {
"keccak256": "0xc1592dfafc9511398894dd70bed909519d6a0fbc1a2b6b348ba91ef0cd02e90d",
"urls": [
"bzz-raw://71e792f338bb8df6227d8a52b32fd6da51b2ee929c2ba07a4777d486f264de9b",
"dweb:/ipfs/QmSSnBtsq8H5TkowG887xXKMMuCrT5ap2evrVByS4uCXuc"
]
},
"chain-bridge-solidity/handlers/HandlerHelpers.sol": {
"keccak256": "0x4d1e40e60e380edcb65e06b3e6ff92b8fe6d37590fc1723f246ce14bf6909ba2",
"urls": [
"bzz-raw://fbfcc2f2cbc38e8c75ae0424fa0a2e8b196db441ed4037cb892b202673e1be6a",
"dweb:/ipfs/QmcVojgbqU4qAqbQ6QqZuk8tb1ifoCH7opRRqJYKWTgpxY"
]
},
"chain-bridge-solidity/interfaces/IDepositExecute.sol": {
"keccak256": "0x0e294346387f78e5762ed8f30ef4ba23c577abc9e2dfbaeb29e97b1b5099aa35",
"urls": [
"bzz-raw://896aa03012baece6caca18cf66386717e1cd47e5700ea24f1a31589b3513d814",
"dweb:/ipfs/QmVJWiXZgEjFiZB21wsvkhHAUupNqBJ8FvZuJcB4X4NEvj"
]
},
"chain-bridge-solidity/interfaces/IERCHandler.sol": {
"keccak256": "0xae4a0687ed7310b0e5b1e82074b38bd492de3c14f33acf12486f7380cd523578",
"urls": [
"bzz-raw://0e4195985bfa8305ea9ca1ecd40d34023846a89f3313104e84aedb84069a2926",
"dweb:/ipfs/QmcrKQzMC6YnXRZeE8Wau4rYB815kXrFTpPWVJBkmSS4SV"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/GSN/Context.sol": {
"keccak256": "0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0",
"urls": [
"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f",
"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/access/AccessControl.sol": {
"keccak256": "0x37ff88aa5ca8f533e31b9e1cb5354816b15bb7d41c904ea1c8f5dd5a78d6da25",
"urls": [
"bzz-raw://f3731db435ced7084f2cb3947e708371c10a2e3f654dcfe2a237fc8fbdafbe5f",
"dweb:/ipfs/QmUyiwkuiP2fYBVaTwwY82sJKxJyPQaBqAtS4uG6iaUSP7"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol": {
"keccak256": "0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6",
"urls": [
"bzz-raw://7f8d45329fecbf0836ad7543330c3ecd0f8d0ffa42d4016278c3eb2215fdcdfe",
"dweb:/ipfs/QmXWLT7GcnHtA5NiD6MFi2CV3EWJY4wv5mLNnypqYDrxL3"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/presets/ERC20PresetMinterPauser.sol": {
"keccak256": "0x7f6066f8892ea22a50f98b31d3b3340b3f058c891e317f6ecca24d67d70127fe",
"urls": [
"bzz-raw://a35f0287f053ac1185807348b2220bba6f401026e0dcad6dcb1cc7a1a9d4214a",
"dweb:/ipfs/QmVaxfTbPyefN2qVK18DJYMbfuvgJK8KkJ9cRS1nY2FLRC"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20.sol": {
"keccak256": "0xcbd85c86627a47fd939f1f4ee3ba626575ff2a182e1804b29f5136394449b538",
"urls": [
"bzz-raw://53c6a80c519bb9356aad28efa9a1ec31603860eb759d2dc57f545fcae1dd1aca",
"dweb:/ipfs/QmfRS6TtMNUHhvgLHXK21qKNnpn2S7g2Yd1fKaHKyFiJsR"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20Burnable.sol": {
"keccak256": "0x20569e5d91a1f7478f4579962d35b35e5c68e10c5718696e3863c1a588da87c4",
"urls": [
"bzz-raw://5ace7d16e99eb77a33c3680964706a39ca6c91aebd4f911f4b70430881cc85b8",
"dweb:/ipfs/Qmb7g4vz3x238NMF9US6q8xUUamDy9upxZnms6ZaKkN37U"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/ERC20Pausable.sol": {
"keccak256": "0xa22af140ae7ec1f8f2f3bed5869cd0d548dfaac66343f0efc7324ff34aaf1254",
"urls": [
"bzz-raw://fed479feda7354e89c095fde0927dcb581f460257bf93b7db54b2b902b4bbd48",
"dweb:/ipfs/QmSDUhS2AQvTGXHwaxDgAXtwXKCgQh2kp1nwhwUgr2hQZK"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/token/ERC20/IERC20.sol": {
"keccak256": "0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5",
"urls": [
"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08",
"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/Address.sol": {
"keccak256": "0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8",
"urls": [
"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0",
"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/EnumerableSet.sol": {
"keccak256": "0xae0992eb1ec30fd1ecdf2e04a6036decfc9797bf11dc1ec84b546b74318d5ec2",
"urls": [
"bzz-raw://3b61f99a64e999682ad7bfbb3a1c762a20a0a5b30f9f2011693fa857969af61f",
"dweb:/ipfs/QmZystFY76wkWCf7V3yKh3buZuKVKbswiE7y6yU62kk3zi"
]
},
"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/utils/Pausable.sol": {
"keccak256": "0x065360ef3924db6b63c2160886b5de737497dd64a917e362dd8d857cda1f5ae2",
"urls": [
"bzz-raw://946fe57f3b935f0f4a41345b3eedb617c30912ba5e802bd6b430b394114048ab",
"dweb:/ipfs/QmRVgUK6yHgqiVWoFn51aUGYejR8romW2ZqwVvSFMnhnJW"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "60806040523480156200001157600080fd5b506040516200210638038062002106833981810160405281019062000037919062000570565b82518451146200007e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000075906200078e565b60405180910390fd5b8151835114620000c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000bc90620007d2565b60405180910390fd5b80518251146200010c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010390620007b0565b60405180910390fd5b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008090505b8451811015620001ce57620001c08582815181106200016d57fe5b60200260200101518583815181106200018257fe5b60200260200101518584815181106200019757fe5b6020026020010151858581518110620001ac57fe5b6020026020010151620001da60201b60201c565b808060010191505062000152565b50505050505062000966565b826002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c021790555080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c02179055506001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b600081519050620003958162000918565b92915050565b600082601f830112620003ad57600080fd5b8151620003c4620003be8262000822565b620007f4565b91508181835260208401935060208101905083856020840282011115620003ea57600080fd5b60005b838110156200041e578162000403888262000384565b845260208401935060208301925050600181019050620003ed565b5050505092915050565b600082601f8301126200043a57600080fd5b8151620004516200044b826200084b565b620007f4565b915081818352602084019350602081019050838560208402820111156200047757600080fd5b60005b83811015620004ab578162000490888262000542565b8452602084019350602083019250506001810190506200047a565b5050505092915050565b600082601f830112620004c757600080fd5b8151620004de620004d88262000874565b620007f4565b915081818352602084019350602081019050838560208402820111156200050457600080fd5b60005b838110156200053857816200051d888262000559565b84526020840193506020830192505060018101905062000507565b5050505092915050565b600081519050620005538162000932565b92915050565b6000815190506200056a816200094c565b92915050565b600080600080600060a086880312156200058957600080fd5b6000620005998882890162000384565b955050602086015167ffffffffffffffff811115620005b757600080fd5b620005c58882890162000428565b945050604086015167ffffffffffffffff811115620005e357600080fd5b620005f1888289016200039b565b935050606086015167ffffffffffffffff8111156200060f57600080fd5b6200061d88828901620004b5565b925050608086015167ffffffffffffffff8111156200063b57600080fd5b6200064988828901620004b5565b9150509295509295909350565b600062000665603c836200089d565b91507f696e697469616c5265736f7572636549447320616e6420696e697469616c436f60008301527f6e7472616374416464726573736573206c656e206d69736d61746368000000006020830152604082019050919050565b6000620006cd603d836200089d565b91507f70726f7669646564206465706f73697420616e6420657865637574652066756e60008301527f6374696f6e207369676e617475726573206c656e206d69736d617463680000006020830152604082019050919050565b6000620007356040836200089d565b91507f70726f766964656420636f6e74726163742061646472657373657320616e642060008301527f66756e6374696f6e207369676e617475726573206c656e206d69736d617463686020830152604082019050919050565b60006020820190508181036000830152620007a98162000656565b9050919050565b60006020820190508181036000830152620007cb81620006be565b9050919050565b60006020820190508181036000830152620007ed8162000726565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200081857600080fd5b8060405250919050565b600067ffffffffffffffff8211156200083a57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156200086357600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156200088c57600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b6000620008bb82620008f8565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200092381620008ae565b81146200092f57600080fd5b50565b6200093d81620008c2565b81146200094957600080fd5b50565b6200095781620008cc565b81146200096357600080fd5b50565b61179080620009766000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063ba484c0911610071578063ba484c091461017b578063bba8185a146101ab578063c54c2a11146101c7578063cb624463146101f7578063e248cff214610227578063ec97d3b414610243576100a9565b8063318c136e146100ae57806338995da9146100cc5780634402027f146100e85780637f79bea81461011b578063a5c3a9851461014b575b600080fd5b6100b6610273565b6040516100c39190611476565b60405180910390f35b6100e660048036038101906100e1919061108c565b610298565b005b61010260048036038101906100fd919061115a565b610609565b6040516101129493929190611564565b60405180910390f35b61013560048036038101906101309190610f7f565b61070b565b6040516101429190611491565b60405180910390f35b61016560048036038101906101609190610f7f565b61072b565b60405161017291906114c7565b60405180910390f35b6101956004803603810190610190919061111e565b61074b565b6040516101a29190611542565b60405180910390f35b6101c560048036038101906101c09190610fd1565b6108c3565b005b6101e160048036038101906101dc9190610fa8565b6108dd565b6040516101ee9190611476565b60405180910390f35b610211600480360381019061020c9190610f7f565b610910565b60405161021e91906114c7565b60405180910390f35b610241600480360381019061023c9190611034565b610930565b005b61025d60048036038101906102589190610f7f565b610b90565b60405161026a91906114ac565b60405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6102a0610ba8565b6000606060c4359150604051905081810160200160405260c4360360c482376000600260008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037a90611522565b60405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460e01b9050600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146104f35760608184604051602001610432929190611437565b604051602081830303815290604052905060008373ffffffffffffffffffffffffffffffffffffffff168260405161046a919061145f565b6000604051808303816000865af19150503d80600081146104a7576040519150601f19603f3d011682016040523d82523d6000602084013e6104ac565b606091505b50509050806104f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e790611502565b60405180910390fd5b50505b60405180608001604052808a60ff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815250600160008b60ff1660ff16815260200190815260200160002060008a67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015560608201518160020190805190602001906105f9929190610de3565b5090505050505050505050505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107015780601f106106d657610100808354040283529160200191610701565b820191906000526020600020905b8154815290600101906020018083116106e457829003601f168201915b5050505050905084565b60066020528060005260406000206000915054906101000a900460ff1681565b60056020528060005260406000206000915054906101000a900460e01b81565b610753610e63565b600160008360ff1660ff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505081525050905092915050565b6108cb610ba8565b6108d784848484610c39565b50505050565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915054906101000a900460e01b81565b610938610ba8565b6060604051905060643580820160600160405260643603606483375060006002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90611522565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460e01b9050600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610b885760608184604051602001610ac7929190611437565b604051602081830303815290604052905060008373ffffffffffffffffffffffffffffffffffffffff1682604051610aff919061145f565b6000604051808303816000865af19150503d8060008114610b3c576040519150601f19603f3d011682016040523d82523d6000602084013e610b41565b606091505b5050905080610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90611502565b60405180910390fd5b50505b505050505050565b60036020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e906114e2565b60405180910390fd5b565b826002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c021790555080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c02179055506001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610e2457805160ff1916838001178555610e52565b82800160010185558215610e52579182015b82811115610e51578251825591602001919060010190610e36565b5b509050610e5f9190610ea7565b5090565b6040518060800160405280600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001606081525090565b610ec991905b80821115610ec5576000816000905550600101610ead565b5090565b90565b600081359050610edb816116e7565b92915050565b600081359050610ef0816116fe565b92915050565b600081359050610f0581611715565b92915050565b60008083601f840112610f1d57600080fd5b8235905067ffffffffffffffff811115610f3657600080fd5b602083019150836001820283011115610f4e57600080fd5b9250929050565b600081359050610f648161172c565b92915050565b600081359050610f7981611743565b92915050565b600060208284031215610f9157600080fd5b6000610f9f84828501610ecc565b91505092915050565b600060208284031215610fba57600080fd5b6000610fc884828501610ee1565b91505092915050565b60008060008060808587031215610fe757600080fd5b6000610ff587828801610ee1565b945050602061100687828801610ecc565b935050604061101787828801610ef6565b925050606061102887828801610ef6565b91505092959194509250565b60008060006040848603121561104957600080fd5b600061105786828701610ee1565b935050602084013567ffffffffffffffff81111561107457600080fd5b61108086828701610f0b565b92509250509250925092565b60008060008060008060a087890312156110a557600080fd5b60006110b389828a01610ee1565b96505060206110c489828a01610f6a565b95505060406110d589828a01610f55565b94505060606110e689828a01610ecc565b935050608087013567ffffffffffffffff81111561110357600080fd5b61110f89828a01610f0b565b92509250509295509295509295565b6000806040838503121561113157600080fd5b600061113f85828601610f55565b925050602061115085828601610f6a565b9150509250929050565b6000806040838503121561116d57600080fd5b600061117b85828601610f6a565b925050602061118c85828601610f55565b9150509250929050565b61119f81611604565b82525050565b6111ae81611604565b82525050565b6111bd81611616565b82525050565b6111cc81611622565b82525050565b6111db81611622565b82525050565b6111ea8161162c565b82525050565b6112016111fc8261162c565b6116cc565b82525050565b6000611212826115bb565b61121c81856115e8565b935061122c818560208601611699565b80840191505092915050565b6000611243826115b0565b61124d81856115c6565b935061125d818560208601611699565b611266816116d6565b840191505092915050565b600061127c826115b0565b61128681856115d7565b9350611296818560208601611699565b61129f816116d6565b840191505092915050565b60006112b7601e836115f3565b91507f73656e646572206d7573742062652062726964676520636f6e747261637400006000830152602082019050919050565b60006112f76026836115f3565b91507f64656c656761746563616c6c20746f20636f6e7472616374416464726573732060008301527f6661696c656400000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061135d602b836115f3565b91507f70726f766964656420636f6e747261637441646472657373206973206e6f742060008301527f77686974656c69737465640000000000000000000000000000000000000000006020830152604082019050919050565b60006080830160008301516113ce6000860182611419565b5060208301516113e16020860182611196565b5060408301516113f460408601826111c3565b506060830151848203606086015261140c8282611238565b9150508091505092915050565b6114228161168c565b82525050565b6114318161168c565b82525050565b600061144382856111f0565b6004820191506114538284611207565b91508190509392505050565b600061146b8284611207565b915081905092915050565b600060208201905061148b60008301846111a5565b92915050565b60006020820190506114a660008301846111b4565b92915050565b60006020820190506114c160008301846111d2565b92915050565b60006020820190506114dc60008301846111e1565b92915050565b600060208201905081810360008301526114fb816112aa565b9050919050565b6000602082019050818103600083015261151b816112ea565b9050919050565b6000602082019050818103600083015261153b81611350565b9050919050565b6000602082019050818103600083015261155c81846113b6565b905092915050565b60006080820190506115796000830187611428565b61158660208301866111a5565b61159360408301856111d2565b81810360608301526115a58184611271565b905095945050505050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061160f82611658565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60005b838110156116b757808201518184015260208101905061169c565b838111156116c6576000848401525b50505050565b6000819050919050565b6000601f19601f8301169050919050565b6116f081611604565b81146116fb57600080fd5b50565b61170781611622565b811461171257600080fd5b50565b61171e8161162c565b811461172957600080fd5b50565b61173581611678565b811461174057600080fd5b50565b61174c8161168c565b811461175757600080fd5b5056fea2646970667358221220dd8ba4ad2688b8c37fd77de2314b872825896c03de4dc2f906016f4439bd164664736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2106 CODESIZE SUB DUP1 PUSH3 0x2106 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH3 0x37 SWAP2 SWAP1 PUSH3 0x570 JUMP JUMPDEST DUP3 MLOAD DUP5 MLOAD EQ PUSH3 0x7E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x75 SWAP1 PUSH3 0x78E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP4 MLOAD EQ PUSH3 0xC5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0xBC SWAP1 PUSH3 0x7D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 MLOAD DUP3 MLOAD EQ PUSH3 0x10C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x103 SWAP1 PUSH3 0x7B0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH3 0x1CE JUMPI PUSH3 0x1C0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH3 0x16D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH3 0x182 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH3 0x197 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT PUSH3 0x1AC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH3 0x1DA PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH3 0x152 JUMP JUMPDEST POP POP POP POP POP POP PUSH3 0x966 JUMP JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x4 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH1 0xE0 SHR MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0x5 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH1 0xE0 SHR MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x6 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x395 DUP2 PUSH3 0x918 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3C4 PUSH3 0x3BE DUP3 PUSH3 0x822 JUMP JUMPDEST PUSH3 0x7F4 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH3 0x3EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x41E JUMPI DUP2 PUSH3 0x403 DUP9 DUP3 PUSH3 0x384 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH3 0x3ED JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x43A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x451 PUSH3 0x44B DUP3 PUSH3 0x84B JUMP JUMPDEST PUSH3 0x7F4 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH3 0x477 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x4AB JUMPI DUP2 PUSH3 0x490 DUP9 DUP3 PUSH3 0x542 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH3 0x47A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x4C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x4DE PUSH3 0x4D8 DUP3 PUSH3 0x874 JUMP JUMPDEST PUSH3 0x7F4 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH3 0x504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x538 JUMPI DUP2 PUSH3 0x51D DUP9 DUP3 PUSH3 0x559 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH3 0x507 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x553 DUP2 PUSH3 0x932 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH3 0x56A DUP2 PUSH3 0x94C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x589 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x599 DUP9 DUP3 DUP10 ADD PUSH3 0x384 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 DUP7 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x5C5 DUP9 DUP3 DUP10 ADD PUSH3 0x428 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x5E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x5F1 DUP9 DUP3 DUP10 ADD PUSH3 0x39B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x60F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x61D DUP9 DUP3 DUP10 ADD PUSH3 0x4B5 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x63B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x649 DUP9 DUP3 DUP10 ADD PUSH3 0x4B5 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x665 PUSH1 0x3C DUP4 PUSH3 0x89D JUMP JUMPDEST SWAP2 POP PUSH32 0x696E697469616C5265736F7572636549447320616E6420696E697469616C436F PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6E7472616374416464726573736573206C656E206D69736D6174636800000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x6CD PUSH1 0x3D DUP4 PUSH3 0x89D JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F7669646564206465706F73697420616E6420657865637574652066756E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6374696F6E207369676E617475726573206C656E206D69736D61746368000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x735 PUSH1 0x40 DUP4 PUSH3 0x89D JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420636F6E74726163742061646472657373657320616E6420 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x66756E6374696F6E207369676E617475726573206C656E206D69736D61746368 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH3 0x7A9 DUP2 PUSH3 0x656 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH3 0x7CB DUP2 PUSH3 0x6BE JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH3 0x7ED DUP2 PUSH3 0x726 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH3 0x818 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x40 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x83A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x863 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x88C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x8BB DUP3 PUSH3 0x8F8 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0x923 DUP2 PUSH3 0x8AE JUMP JUMPDEST DUP2 EQ PUSH3 0x92F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH3 0x93D DUP2 PUSH3 0x8C2 JUMP JUMPDEST DUP2 EQ PUSH3 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH3 0x957 DUP2 PUSH3 0x8CC JUMP JUMPDEST DUP2 EQ PUSH3 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1790 DUP1 PUSH3 0x976 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBA484C09 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xBA484C09 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0xBBA8185A EQ PUSH2 0x1AB JUMPI DUP1 PUSH4 0xC54C2A11 EQ PUSH2 0x1C7 JUMPI DUP1 PUSH4 0xCB624463 EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0xE248CFF2 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0xEC97D3B4 EQ PUSH2 0x243 JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x318C136E EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x38995DA9 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x4402027F EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x7F79BEA8 EQ PUSH2 0x11B JUMPI DUP1 PUSH4 0xA5C3A985 EQ PUSH2 0x14B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x273 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC3 SWAP2 SWAP1 PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x108C JUMP JUMPDEST PUSH2 0x298 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x102 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xFD SWAP2 SWAP1 PUSH2 0x115A JUMP JUMPDEST PUSH2 0x609 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x112 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1564 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x135 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x130 SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0x70B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x142 SWAP2 SWAP1 PUSH2 0x1491 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x165 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x160 SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0x72B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x172 SWAP2 SWAP1 PUSH2 0x14C7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x195 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x190 SWAP2 SWAP1 PUSH2 0x111E JUMP JUMPDEST PUSH2 0x74B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1A2 SWAP2 SWAP1 PUSH2 0x1542 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1C5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1C0 SWAP2 SWAP1 PUSH2 0xFD1 JUMP JUMPDEST PUSH2 0x8C3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1E1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1DC SWAP2 SWAP1 PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0x8DD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1EE SWAP2 SWAP1 PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x211 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x20C SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0x910 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x21E SWAP2 SWAP1 PUSH2 0x14C7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x241 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x23C SWAP2 SWAP1 PUSH2 0x1034 JUMP JUMPDEST PUSH2 0x930 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x25D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x258 SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x26A SWAP2 SWAP1 PUSH2 0x14AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x2A0 PUSH2 0xBA8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0xC4 CALLDATALOAD SWAP2 POP PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0xC4 CALLDATASIZE SUB PUSH1 0xC4 DUP3 CALLDATACOPY PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x6 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x383 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x37A SWAP1 PUSH2 0x1522 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL SWAP1 POP PUSH1 0x0 PUSH1 0xE0 SHL PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ PUSH2 0x4F3 JUMPI PUSH1 0x60 DUP2 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x432 SWAP3 SWAP2 SWAP1 PUSH2 0x1437 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x40 MLOAD PUSH2 0x46A SWAP2 SWAP1 PUSH2 0x145F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4A7 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4AC JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x4F0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4E7 SWAP1 PUSH2 0x1502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 DUP11 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE POP PUSH1 0x1 PUSH1 0x0 DUP12 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5F9 SWAP3 SWAP2 SWAP1 PUSH2 0xDE3 JUMP JUMPDEST POP SWAP1 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x701 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6D6 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x701 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x6E4 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL DUP2 JUMP JUMPDEST PUSH2 0x753 PUSH2 0xE63 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP3 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x8B2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x887 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x8B2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x895 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x8CB PUSH2 0xBA8 JUMP JUMPDEST PUSH2 0x8D7 DUP5 DUP5 DUP5 DUP5 PUSH2 0xC39 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL DUP2 JUMP JUMPDEST PUSH2 0x938 PUSH2 0xBA8 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 POP PUSH1 0x64 CALLDATALOAD DUP1 DUP3 ADD PUSH1 0x60 ADD PUSH1 0x40 MSTORE PUSH1 0x64 CALLDATASIZE SUB PUSH1 0x64 DUP4 CALLDATACOPY POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x6 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0xA18 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA0F SWAP1 PUSH2 0x1522 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL SWAP1 POP PUSH1 0x0 PUSH1 0xE0 SHL PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ PUSH2 0xB88 JUMPI PUSH1 0x60 DUP2 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xAC7 SWAP3 SWAP2 SWAP1 PUSH2 0x1437 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x40 MLOAD PUSH2 0xAFF SWAP2 SWAP1 PUSH2 0x145F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xB3C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xB41 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xB85 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB7C SWAP1 PUSH2 0x1502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC37 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC2E SWAP1 PUSH2 0x14E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x4 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH1 0xE0 SHR MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0x5 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH1 0xE0 SHR MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x6 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xE24 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xE52 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xE52 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xE51 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xE36 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0xE5F SWAP2 SWAP1 PUSH2 0xEA7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0xEC9 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xEC5 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xEAD JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xEDB DUP2 PUSH2 0x16E7 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xEF0 DUP2 PUSH2 0x16FE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xF05 DUP2 PUSH2 0x1715 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xF1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0xF4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xF64 DUP2 PUSH2 0x172C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xF79 DUP2 PUSH2 0x1743 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xF9F DUP5 DUP3 DUP6 ADD PUSH2 0xECC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xFBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xFC8 DUP5 DUP3 DUP6 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xFE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xFF5 DUP8 DUP3 DUP9 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x1006 DUP8 DUP3 DUP9 ADD PUSH2 0xECC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1017 DUP8 DUP3 DUP9 ADD PUSH2 0xEF6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x1028 DUP8 DUP3 DUP9 ADD PUSH2 0xEF6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1049 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1057 DUP7 DUP3 DUP8 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1074 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1080 DUP7 DUP3 DUP8 ADD PUSH2 0xF0B JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x10A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x10B3 DUP10 DUP3 DUP11 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x10C4 DUP10 DUP3 DUP11 ADD PUSH2 0xF6A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 PUSH2 0x10D5 DUP10 DUP3 DUP11 ADD PUSH2 0xF55 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 PUSH2 0x10E6 DUP10 DUP3 DUP11 ADD PUSH2 0xECC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1103 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x110F DUP10 DUP3 DUP11 ADD PUSH2 0xF0B JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1131 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x113F DUP6 DUP3 DUP7 ADD PUSH2 0xF55 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1150 DUP6 DUP3 DUP7 ADD PUSH2 0xF6A JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x116D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x117B DUP6 DUP3 DUP7 ADD PUSH2 0xF6A JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x118C DUP6 DUP3 DUP7 ADD PUSH2 0xF55 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x119F DUP2 PUSH2 0x1604 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11AE DUP2 PUSH2 0x1604 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11BD DUP2 PUSH2 0x1616 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11CC DUP2 PUSH2 0x1622 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11DB DUP2 PUSH2 0x1622 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11EA DUP2 PUSH2 0x162C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1201 PUSH2 0x11FC DUP3 PUSH2 0x162C JUMP JUMPDEST PUSH2 0x16CC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1212 DUP3 PUSH2 0x15BB JUMP JUMPDEST PUSH2 0x121C DUP2 DUP6 PUSH2 0x15E8 JUMP JUMPDEST SWAP4 POP PUSH2 0x122C DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1699 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1243 DUP3 PUSH2 0x15B0 JUMP JUMPDEST PUSH2 0x124D DUP2 DUP6 PUSH2 0x15C6 JUMP JUMPDEST SWAP4 POP PUSH2 0x125D DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1699 JUMP JUMPDEST PUSH2 0x1266 DUP2 PUSH2 0x16D6 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127C DUP3 PUSH2 0x15B0 JUMP JUMPDEST PUSH2 0x1286 DUP2 DUP6 PUSH2 0x15D7 JUMP JUMPDEST SWAP4 POP PUSH2 0x1296 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1699 JUMP JUMPDEST PUSH2 0x129F DUP2 PUSH2 0x16D6 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B7 PUSH1 0x1E DUP4 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E646572206D7573742062652062726964676520636F6E74726163740000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12F7 PUSH1 0x26 DUP4 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP PUSH32 0x64656C656761746563616C6C20746F20636F6E74726163744164647265737320 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6661696C65640000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x135D PUSH1 0x2B DUP4 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420636F6E747261637441646472657373206973206E6F7420 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x77686974656C6973746564000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x13CE PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x1419 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x13E1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x1196 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x13F4 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x140C DUP3 DUP3 PUSH2 0x1238 JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1422 DUP2 PUSH2 0x168C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1431 DUP2 PUSH2 0x168C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1443 DUP3 DUP6 PUSH2 0x11F0 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP PUSH2 0x1453 DUP3 DUP5 PUSH2 0x1207 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x146B DUP3 DUP5 PUSH2 0x1207 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x148B PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11A5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14A6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11B4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14C1 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11D2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14DC PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11E1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x14FB DUP2 PUSH2 0x12AA JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x151B DUP2 PUSH2 0x12EA JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x153B DUP2 PUSH2 0x1350 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x155C DUP2 DUP5 PUSH2 0x13B6 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x1579 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x1428 JUMP JUMPDEST PUSH2 0x1586 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x11A5 JUMP JUMPDEST PUSH2 0x1593 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x11D2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x15A5 DUP2 DUP5 PUSH2 0x1271 JUMP JUMPDEST SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160F DUP3 PUSH2 0x1658 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16B7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x169C JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x16C6 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x16F0 DUP2 PUSH2 0x1604 JUMP JUMPDEST DUP2 EQ PUSH2 0x16FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1707 DUP2 PUSH2 0x1622 JUMP JUMPDEST DUP2 EQ PUSH2 0x1712 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x171E DUP2 PUSH2 0x162C JUMP JUMPDEST DUP2 EQ PUSH2 0x1729 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1735 DUP2 PUSH2 0x1678 JUMP JUMPDEST DUP2 EQ PUSH2 0x1740 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x174C DUP2 PUSH2 0x168C JUMP JUMPDEST DUP2 EQ PUSH2 0x1757 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDD DUP12 LOG4 0xAD 0x26 DUP9 0xB8 0xC3 PUSH32 0xD77DE2314B872825896C03DE4DC2F906016F4439BD164664736F6C6343000604 STOP CALLER ",
"sourceMap": "277:10716:0:-:0;;;2731:1129;5:9:-1;2:2;;;27:1;24;17:12;2:2;2731:1129:0;;;;;;;;;;;;;;;;;;;;;;;;3057:24;:31;3028:18;:25;:60;3020:145;;;;;;;;;;;;;;;;;;;;;;3219:32;:39;3184:24;:31;:74;3176:163;;;;;;;;;;;;;;;;;;;;;;3401:32;:39;3358:32;:39;:82;3350:168;;;;;;;;;;;;;;;;;;;;;;3546:13;3529:14;;:30;;;;;;;;;;;;;;;;;;3575:9;3587:1;3575:13;;3570:284;3594:18;:25;3590:1;:29;3570:284;;;3640:203;3670:18;3689:1;3670:21;;;;;;;;;;;;;;3709:24;3734:1;3709:27;;;;;;;;;;;;;;3754:32;3787:1;3754:35;;;;;;;;;;;;;;3807:32;3840:1;3807:35;;;;;;;;;;;;;;3640:12;;;:203;;:::i;:::-;3621:3;;;;;;;3570:284;;;;2731:1129;;;;;277:10716;;10447:544;10668:15;10625:28;:40;10654:10;10625:40;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;10741:10;10693:28;:45;10722:15;10693:45;;;;;;;;;;;;;;;:58;;;;10823:18;10761:42;:59;10804:15;10761:59;;;;;;;;;;;;;;;;:80;;;;;;;;;;;;;;;;;;10913:18;10851:42;:59;10894:15;10851:59;;;;;;;;;;;;;;;;:80;;;;;;;;;;;;;;;;;;10980:4;10942:18;:35;10961:15;10942:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;10447:544;;;;:::o;5:134:-1:-;;89:6;83:13;74:22;;101:33;128:5;101:33;;;68:71;;;;;164:722;;292:3;285:4;277:6;273:17;269:27;259:2;;310:1;307;300:12;259:2;340:6;334:13;362:80;377:64;434:6;377:64;;;362:80;;;353:89;;459:5;484:6;477:5;470:21;514:4;506:6;502:17;492:27;;536:4;531:3;527:14;520:21;;589:6;636:3;628:4;620:6;616:17;611:3;607:27;604:36;601:2;;;653:1;650;643:12;601:2;678:1;663:217;688:6;685:1;682:13;663:217;;;746:3;768:48;812:3;800:10;768:48;;;763:3;756:61;840:4;835:3;831:14;824:21;;868:4;863:3;859:14;852:21;;720:160;710:1;707;703:9;698:14;;663:217;;;667:14;252:634;;;;;;;;912:722;;1040:3;1033:4;1025:6;1021:17;1017:27;1007:2;;1058:1;1055;1048:12;1007:2;1088:6;1082:13;1110:80;1125:64;1182:6;1125:64;;;1110:80;;;1101:89;;1207:5;1232:6;1225:5;1218:21;1262:4;1254:6;1250:17;1240:27;;1284:4;1279:3;1275:14;1268:21;;1337:6;1384:3;1376:4;1368:6;1364:17;1359:3;1355:27;1352:36;1349:2;;;1401:1;1398;1391:12;1349:2;1426:1;1411:217;1436:6;1433:1;1430:13;1411:217;;;1494:3;1516:48;1560:3;1548:10;1516:48;;;1511:3;1504:61;1588:4;1583:3;1579:14;1572:21;;1616:4;1611:3;1607:14;1600:21;;1468:160;1458:1;1455;1451:9;1446:14;;1411:217;;;1415:14;1000:634;;;;;;;;1659:719;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1834:6;1828:13;1856:79;1871:63;1927:6;1871:63;;;1856:79;;;1847:88;;1952:5;1977:6;1970:5;1963:21;2007:4;1999:6;1995:17;1985:27;;2029:4;2024:3;2020:14;2013:21;;2082:6;2129:3;2121:4;2113:6;2109:17;2104:3;2100:27;2097:36;2094:2;;;2146:1;2143;2136:12;2094:2;2171:1;2156:216;2181:6;2178:1;2175:13;2156:216;;;2239:3;2261:47;2304:3;2292:10;2261:47;;;2256:3;2249:60;2332:4;2327:3;2323:14;2316:21;;2360:4;2355:3;2351:14;2344:21;;2213:159;2203:1;2200;2196:9;2191:14;;2156:216;;;2160:14;1746:632;;;;;;;;2386:134;;2470:6;2464:13;2455:22;;2482:33;2509:5;2482:33;;;2449:71;;;;;2527:132;;2610:6;2604:13;2595:22;;2622:32;2648:5;2622:32;;;2589:70;;;;;2666:1321;;;;;;2947:3;2935:9;2926:7;2922:23;2918:33;2915:2;;;2964:1;2961;2954:12;2915:2;2999:1;3016:64;3072:7;3063:6;3052:9;3048:22;3016:64;;;3006:74;;2978:108;3138:2;3127:9;3123:18;3117:25;3162:18;3154:6;3151:30;3148:2;;;3194:1;3191;3184:12;3148:2;3214:89;3295:7;3286:6;3275:9;3271:22;3214:89;;;3204:99;;3096:213;3361:2;3350:9;3346:18;3340:25;3385:18;3377:6;3374:30;3371:2;;;3417:1;3414;3407:12;3371:2;3437:89;3518:7;3509:6;3498:9;3494:22;3437:89;;;3427:99;;3319:213;3584:2;3573:9;3569:18;3563:25;3608:18;3600:6;3597:30;3594:2;;;3640:1;3637;3630:12;3594:2;3660:88;3740:7;3731:6;3720:9;3716:22;3660:88;;;3650:98;;3542:212;3806:3;3795:9;3791:19;3785:26;3831:18;3823:6;3820:30;3817:2;;;3863:1;3860;3853:12;3817:2;3883:88;3963:7;3954:6;3943:9;3939:22;3883:88;;;3873:98;;3764:213;2909:1078;;;;;;;;;3995:397;;4155:67;4219:2;4214:3;4155:67;;;4148:74;;4255:34;4251:1;4246:3;4242:11;4235:55;4324:30;4319:2;4314:3;4310:12;4303:52;4383:2;4378:3;4374:12;4367:19;;4141:251;;;;4401:398;;4561:67;4625:2;4620:3;4561:67;;;4554:74;;4661:34;4657:1;4652:3;4648:11;4641:55;4730:31;4725:2;4720:3;4716:12;4709:53;4790:2;4785:3;4781:12;4774:19;;4547:252;;;;4808:401;;4968:67;5032:2;5027:3;4968:67;;;4961:74;;5068:34;5064:1;5059:3;5055:11;5048:55;5137:34;5132:2;5127:3;5123:12;5116:56;5200:2;5195:3;5191:12;5184:19;;4954:255;;;;5217:407;;5408:2;5397:9;5393:18;5385:26;;5458:9;5452:4;5448:20;5444:1;5433:9;5429:17;5422:47;5483:131;5609:4;5483:131;;;5475:139;;5379:245;;;;5631:407;;5822:2;5811:9;5807:18;5799:26;;5872:9;5866:4;5862:20;5858:1;5847:9;5843:17;5836:47;5897:131;6023:4;5897:131;;;5889:139;;5793:245;;;;6045:407;;6236:2;6225:9;6221:18;6213:26;;6286:9;6280:4;6276:20;6272:1;6261:9;6257:17;6250:47;6311:131;6437:4;6311:131;;;6303:139;;6207:245;;;;6459:256;;6521:2;6515:9;6505:19;;6559:4;6551:6;6547:17;6658:6;6646:10;6643:22;6622:18;6610:10;6607:34;6604:62;6601:2;;;6679:1;6676;6669:12;6601:2;6699:10;6695:2;6688:22;6499:216;;;;;6722:304;;6881:18;6873:6;6870:30;6867:2;;;6913:1;6910;6903:12;6867:2;6948:4;6940:6;6936:17;6928:25;;7011:4;7005;7001:15;6993:23;;6804:222;;;;7033:304;;7192:18;7184:6;7181:30;7178:2;;;7224:1;7221;7214:12;7178:2;7259:4;7251:6;7247:17;7239:25;;7322:4;7316;7312:15;7304:23;;7115:222;;;;7344:303;;7502:18;7494:6;7491:30;7488:2;;;7534:1;7531;7524:12;7488:2;7569:4;7561:6;7557:17;7549:25;;7632:4;7626;7622:15;7614:23;;7425:222;;;;7655:163;;7770:6;7765:3;7758:19;7807:4;7802:3;7798:14;7783:29;;7751:67;;;;;7826:91;;7888:24;7906:5;7888:24;;;7877:35;;7871:46;;;;7924:72;;7986:5;7975:16;;7969:27;;;;8003:144;;8075:66;8068:5;8064:78;8053:89;;8047:100;;;;8154:121;;8227:42;8220:5;8216:54;8205:65;;8199:76;;;;8282:117;8351:24;8369:5;8351:24;;;8344:5;8341:35;8331:2;;8390:1;8387;8380:12;8331:2;8325:74;;8406:117;8475:24;8493:5;8475:24;;;8468:5;8465:35;8455:2;;8514:1;8511;8504:12;8455:2;8449:74;;8530:115;8598:23;8615:5;8598:23;;;8591:5;8588:34;8578:2;;8636:1;8633;8626:12;8578:2;8572:73;;277:10716:0;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100a95760003560e01c8063ba484c0911610071578063ba484c091461017b578063bba8185a146101ab578063c54c2a11146101c7578063cb624463146101f7578063e248cff214610227578063ec97d3b414610243576100a9565b8063318c136e146100ae57806338995da9146100cc5780634402027f146100e85780637f79bea81461011b578063a5c3a9851461014b575b600080fd5b6100b6610273565b6040516100c39190611476565b60405180910390f35b6100e660048036038101906100e1919061108c565b610298565b005b61010260048036038101906100fd919061115a565b610609565b6040516101129493929190611564565b60405180910390f35b61013560048036038101906101309190610f7f565b61070b565b6040516101429190611491565b60405180910390f35b61016560048036038101906101609190610f7f565b61072b565b60405161017291906114c7565b60405180910390f35b6101956004803603810190610190919061111e565b61074b565b6040516101a29190611542565b60405180910390f35b6101c560048036038101906101c09190610fd1565b6108c3565b005b6101e160048036038101906101dc9190610fa8565b6108dd565b6040516101ee9190611476565b60405180910390f35b610211600480360381019061020c9190610f7f565b610910565b60405161021e91906114c7565b60405180910390f35b610241600480360381019061023c9190611034565b610930565b005b61025d60048036038101906102589190610f7f565b610b90565b60405161026a91906114ac565b60405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6102a0610ba8565b6000606060c4359150604051905081810160200160405260c4360360c482376000600260008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037a90611522565b60405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460e01b9050600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146104f35760608184604051602001610432929190611437565b604051602081830303815290604052905060008373ffffffffffffffffffffffffffffffffffffffff168260405161046a919061145f565b6000604051808303816000865af19150503d80600081146104a7576040519150601f19603f3d011682016040523d82523d6000602084013e6104ac565b606091505b50509050806104f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e790611502565b60405180910390fd5b50505b60405180608001604052808a60ff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815250600160008b60ff1660ff16815260200190815260200160002060008a67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015560608201518160020190805190602001906105f9929190610de3565b5090505050505050505050505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107015780601f106106d657610100808354040283529160200191610701565b820191906000526020600020905b8154815290600101906020018083116106e457829003601f168201915b5050505050905084565b60066020528060005260406000206000915054906101000a900460ff1681565b60056020528060005260406000206000915054906101000a900460e01b81565b610753610e63565b600160008360ff1660ff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505081525050905092915050565b6108cb610ba8565b6108d784848484610c39565b50505050565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915054906101000a900460e01b81565b610938610ba8565b6060604051905060643580820160600160405260643603606483375060006002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90611522565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460e01b9050600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610b885760608184604051602001610ac7929190611437565b604051602081830303815290604052905060008373ffffffffffffffffffffffffffffffffffffffff1682604051610aff919061145f565b6000604051808303816000865af19150503d8060008114610b3c576040519150601f19603f3d011682016040523d82523d6000602084013e610b41565b606091505b5050905080610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90611502565b60405180910390fd5b50505b505050505050565b60036020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e906114e2565b60405180910390fd5b565b826002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c021790555080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c02179055506001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610e2457805160ff1916838001178555610e52565b82800160010185558215610e52579182015b82811115610e51578251825591602001919060010190610e36565b5b509050610e5f9190610ea7565b5090565b6040518060800160405280600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001606081525090565b610ec991905b80821115610ec5576000816000905550600101610ead565b5090565b90565b600081359050610edb816116e7565b92915050565b600081359050610ef0816116fe565b92915050565b600081359050610f0581611715565b92915050565b60008083601f840112610f1d57600080fd5b8235905067ffffffffffffffff811115610f3657600080fd5b602083019150836001820283011115610f4e57600080fd5b9250929050565b600081359050610f648161172c565b92915050565b600081359050610f7981611743565b92915050565b600060208284031215610f9157600080fd5b6000610f9f84828501610ecc565b91505092915050565b600060208284031215610fba57600080fd5b6000610fc884828501610ee1565b91505092915050565b60008060008060808587031215610fe757600080fd5b6000610ff587828801610ee1565b945050602061100687828801610ecc565b935050604061101787828801610ef6565b925050606061102887828801610ef6565b91505092959194509250565b60008060006040848603121561104957600080fd5b600061105786828701610ee1565b935050602084013567ffffffffffffffff81111561107457600080fd5b61108086828701610f0b565b92509250509250925092565b60008060008060008060a087890312156110a557600080fd5b60006110b389828a01610ee1565b96505060206110c489828a01610f6a565b95505060406110d589828a01610f55565b94505060606110e689828a01610ecc565b935050608087013567ffffffffffffffff81111561110357600080fd5b61110f89828a01610f0b565b92509250509295509295509295565b6000806040838503121561113157600080fd5b600061113f85828601610f55565b925050602061115085828601610f6a565b9150509250929050565b6000806040838503121561116d57600080fd5b600061117b85828601610f6a565b925050602061118c85828601610f55565b9150509250929050565b61119f81611604565b82525050565b6111ae81611604565b82525050565b6111bd81611616565b82525050565b6111cc81611622565b82525050565b6111db81611622565b82525050565b6111ea8161162c565b82525050565b6112016111fc8261162c565b6116cc565b82525050565b6000611212826115bb565b61121c81856115e8565b935061122c818560208601611699565b80840191505092915050565b6000611243826115b0565b61124d81856115c6565b935061125d818560208601611699565b611266816116d6565b840191505092915050565b600061127c826115b0565b61128681856115d7565b9350611296818560208601611699565b61129f816116d6565b840191505092915050565b60006112b7601e836115f3565b91507f73656e646572206d7573742062652062726964676520636f6e747261637400006000830152602082019050919050565b60006112f76026836115f3565b91507f64656c656761746563616c6c20746f20636f6e7472616374416464726573732060008301527f6661696c656400000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061135d602b836115f3565b91507f70726f766964656420636f6e747261637441646472657373206973206e6f742060008301527f77686974656c69737465640000000000000000000000000000000000000000006020830152604082019050919050565b60006080830160008301516113ce6000860182611419565b5060208301516113e16020860182611196565b5060408301516113f460408601826111c3565b506060830151848203606086015261140c8282611238565b9150508091505092915050565b6114228161168c565b82525050565b6114318161168c565b82525050565b600061144382856111f0565b6004820191506114538284611207565b91508190509392505050565b600061146b8284611207565b915081905092915050565b600060208201905061148b60008301846111a5565b92915050565b60006020820190506114a660008301846111b4565b92915050565b60006020820190506114c160008301846111d2565b92915050565b60006020820190506114dc60008301846111e1565b92915050565b600060208201905081810360008301526114fb816112aa565b9050919050565b6000602082019050818103600083015261151b816112ea565b9050919050565b6000602082019050818103600083015261153b81611350565b9050919050565b6000602082019050818103600083015261155c81846113b6565b905092915050565b60006080820190506115796000830187611428565b61158660208301866111a5565b61159360408301856111d2565b81810360608301526115a58184611271565b905095945050505050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061160f82611658565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60005b838110156116b757808201518184015260208101905061169c565b838111156116c6576000848401525b50505050565b6000819050919050565b6000601f19601f8301169050919050565b6116f081611604565b81146116fb57600080fd5b50565b61170781611622565b811461171257600080fd5b50565b61171e8161162c565b811461172957600080fd5b50565b61173581611678565b811461174057600080fd5b50565b61174c8161168c565b811461175757600080fd5b5056fea2646970667358221220dd8ba4ad2688b8c37fd77de2314b872825896c03de4dc2f906016f4439bd164664736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBA484C09 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xBA484C09 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0xBBA8185A EQ PUSH2 0x1AB JUMPI DUP1 PUSH4 0xC54C2A11 EQ PUSH2 0x1C7 JUMPI DUP1 PUSH4 0xCB624463 EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0xE248CFF2 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0xEC97D3B4 EQ PUSH2 0x243 JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x318C136E EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x38995DA9 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x4402027F EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x7F79BEA8 EQ PUSH2 0x11B JUMPI DUP1 PUSH4 0xA5C3A985 EQ PUSH2 0x14B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x273 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC3 SWAP2 SWAP1 PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x108C JUMP JUMPDEST PUSH2 0x298 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x102 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xFD SWAP2 SWAP1 PUSH2 0x115A JUMP JUMPDEST PUSH2 0x609 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x112 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1564 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x135 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x130 SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0x70B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x142 SWAP2 SWAP1 PUSH2 0x1491 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x165 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x160 SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0x72B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x172 SWAP2 SWAP1 PUSH2 0x14C7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x195 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x190 SWAP2 SWAP1 PUSH2 0x111E JUMP JUMPDEST PUSH2 0x74B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1A2 SWAP2 SWAP1 PUSH2 0x1542 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1C5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1C0 SWAP2 SWAP1 PUSH2 0xFD1 JUMP JUMPDEST PUSH2 0x8C3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1E1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1DC SWAP2 SWAP1 PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0x8DD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1EE SWAP2 SWAP1 PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x211 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x20C SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0x910 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x21E SWAP2 SWAP1 PUSH2 0x14C7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x241 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x23C SWAP2 SWAP1 PUSH2 0x1034 JUMP JUMPDEST PUSH2 0x930 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x25D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x258 SWAP2 SWAP1 PUSH2 0xF7F JUMP JUMPDEST PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x26A SWAP2 SWAP1 PUSH2 0x14AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x2A0 PUSH2 0xBA8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0xC4 CALLDATALOAD SWAP2 POP PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0xC4 CALLDATASIZE SUB PUSH1 0xC4 DUP3 CALLDATACOPY PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x6 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x383 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x37A SWAP1 PUSH2 0x1522 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL SWAP1 POP PUSH1 0x0 PUSH1 0xE0 SHL PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ PUSH2 0x4F3 JUMPI PUSH1 0x60 DUP2 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x432 SWAP3 SWAP2 SWAP1 PUSH2 0x1437 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x40 MLOAD PUSH2 0x46A SWAP2 SWAP1 PUSH2 0x145F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4A7 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4AC JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x4F0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4E7 SWAP1 PUSH2 0x1502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 DUP11 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE POP PUSH1 0x1 PUSH1 0x0 DUP12 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5F9 SWAP3 SWAP2 SWAP1 PUSH2 0xDE3 JUMP JUMPDEST POP SWAP1 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x701 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6D6 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x701 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x6E4 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL DUP2 JUMP JUMPDEST PUSH2 0x753 PUSH2 0xE63 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP3 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x8B2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x887 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x8B2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x895 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x8CB PUSH2 0xBA8 JUMP JUMPDEST PUSH2 0x8D7 DUP5 DUP5 DUP5 DUP5 PUSH2 0xC39 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL DUP2 JUMP JUMPDEST PUSH2 0x938 PUSH2 0xBA8 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 POP PUSH1 0x64 CALLDATALOAD DUP1 DUP3 ADD PUSH1 0x60 ADD PUSH1 0x40 MSTORE PUSH1 0x64 CALLDATASIZE SUB PUSH1 0x64 DUP4 CALLDATACOPY POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x6 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0xA18 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA0F SWAP1 PUSH2 0x1522 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xE0 SHL SWAP1 POP PUSH1 0x0 PUSH1 0xE0 SHL PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ PUSH2 0xB88 JUMPI PUSH1 0x60 DUP2 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xAC7 SWAP3 SWAP2 SWAP1 PUSH2 0x1437 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x40 MLOAD PUSH2 0xAFF SWAP2 SWAP1 PUSH2 0x145F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xB3C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xB41 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0xB85 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB7C SWAP1 PUSH2 0x1502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC37 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC2E SWAP1 PUSH2 0x14E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x4 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH1 0xE0 SHR MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0x5 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH1 0xE0 SHR MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x6 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xE24 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xE52 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xE52 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xE51 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xE36 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0xE5F SWAP2 SWAP1 PUSH2 0xEA7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0xEC9 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xEC5 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xEAD JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xEDB DUP2 PUSH2 0x16E7 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xEF0 DUP2 PUSH2 0x16FE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xF05 DUP2 PUSH2 0x1715 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xF1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0xF4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xF64 DUP2 PUSH2 0x172C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xF79 DUP2 PUSH2 0x1743 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xF9F DUP5 DUP3 DUP6 ADD PUSH2 0xECC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xFBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xFC8 DUP5 DUP3 DUP6 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xFE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xFF5 DUP8 DUP3 DUP9 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x1006 DUP8 DUP3 DUP9 ADD PUSH2 0xECC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1017 DUP8 DUP3 DUP9 ADD PUSH2 0xEF6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x1028 DUP8 DUP3 DUP9 ADD PUSH2 0xEF6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1049 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1057 DUP7 DUP3 DUP8 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1074 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1080 DUP7 DUP3 DUP8 ADD PUSH2 0xF0B JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x10A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x10B3 DUP10 DUP3 DUP11 ADD PUSH2 0xEE1 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x10C4 DUP10 DUP3 DUP11 ADD PUSH2 0xF6A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 PUSH2 0x10D5 DUP10 DUP3 DUP11 ADD PUSH2 0xF55 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 PUSH2 0x10E6 DUP10 DUP3 DUP11 ADD PUSH2 0xECC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1103 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x110F DUP10 DUP3 DUP11 ADD PUSH2 0xF0B JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1131 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x113F DUP6 DUP3 DUP7 ADD PUSH2 0xF55 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1150 DUP6 DUP3 DUP7 ADD PUSH2 0xF6A JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x116D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x117B DUP6 DUP3 DUP7 ADD PUSH2 0xF6A JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x118C DUP6 DUP3 DUP7 ADD PUSH2 0xF55 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x119F DUP2 PUSH2 0x1604 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11AE DUP2 PUSH2 0x1604 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11BD DUP2 PUSH2 0x1616 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11CC DUP2 PUSH2 0x1622 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11DB DUP2 PUSH2 0x1622 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x11EA DUP2 PUSH2 0x162C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1201 PUSH2 0x11FC DUP3 PUSH2 0x162C JUMP JUMPDEST PUSH2 0x16CC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1212 DUP3 PUSH2 0x15BB JUMP JUMPDEST PUSH2 0x121C DUP2 DUP6 PUSH2 0x15E8 JUMP JUMPDEST SWAP4 POP PUSH2 0x122C DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1699 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1243 DUP3 PUSH2 0x15B0 JUMP JUMPDEST PUSH2 0x124D DUP2 DUP6 PUSH2 0x15C6 JUMP JUMPDEST SWAP4 POP PUSH2 0x125D DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1699 JUMP JUMPDEST PUSH2 0x1266 DUP2 PUSH2 0x16D6 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127C DUP3 PUSH2 0x15B0 JUMP JUMPDEST PUSH2 0x1286 DUP2 DUP6 PUSH2 0x15D7 JUMP JUMPDEST SWAP4 POP PUSH2 0x1296 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x1699 JUMP JUMPDEST PUSH2 0x129F DUP2 PUSH2 0x16D6 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B7 PUSH1 0x1E DUP4 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP PUSH32 0x73656E646572206D7573742062652062726964676520636F6E74726163740000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12F7 PUSH1 0x26 DUP4 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP PUSH32 0x64656C656761746563616C6C20746F20636F6E74726163744164647265737320 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x6661696C65640000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x135D PUSH1 0x2B DUP4 PUSH2 0x15F3 JUMP JUMPDEST SWAP2 POP PUSH32 0x70726F766964656420636F6E747261637441646472657373206973206E6F7420 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x77686974656C6973746564000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x13CE PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x1419 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x13E1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x1196 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x13F4 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x140C DUP3 DUP3 PUSH2 0x1238 JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1422 DUP2 PUSH2 0x168C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1431 DUP2 PUSH2 0x168C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1443 DUP3 DUP6 PUSH2 0x11F0 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP PUSH2 0x1453 DUP3 DUP5 PUSH2 0x1207 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x146B DUP3 DUP5 PUSH2 0x1207 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x148B PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11A5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14A6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11B4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14C1 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11D2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14DC PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x11E1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x14FB DUP2 PUSH2 0x12AA JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x151B DUP2 PUSH2 0x12EA JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x153B DUP2 PUSH2 0x1350 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x155C DUP2 DUP5 PUSH2 0x13B6 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x1579 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x1428 JUMP JUMPDEST PUSH2 0x1586 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x11A5 JUMP JUMPDEST PUSH2 0x1593 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x11D2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x15A5 DUP2 DUP5 PUSH2 0x1271 JUMP JUMPDEST SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160F DUP3 PUSH2 0x1658 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16B7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x169C JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x16C6 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x16F0 DUP2 PUSH2 0x1604 JUMP JUMPDEST DUP2 EQ PUSH2 0x16FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1707 DUP2 PUSH2 0x1622 JUMP JUMPDEST DUP2 EQ PUSH2 0x1712 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x171E DUP2 PUSH2 0x162C JUMP JUMPDEST DUP2 EQ PUSH2 0x1729 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1735 DUP2 PUSH2 0x1678 JUMP JUMPDEST DUP2 EQ PUSH2 0x1740 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x174C DUP2 PUSH2 0x168C JUMP JUMPDEST DUP2 EQ PUSH2 0x1757 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDD DUP12 LOG4 0xAD 0x26 DUP9 0xB8 0xC3 PUSH32 0xD77DE2314B872825896C03DE4DC2F906016F4439BD164664736F6C6343000604 STOP CALLER ",
"sourceMap": "277:10716:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;277:10716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;326:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;6745:1642;;;;;;;;;;;;;;;;:::i;:::-;;555:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1187:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1055:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4408:167;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5543:286;;;;;;;;;;;;;;;;:::i;:::-;;674:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;908:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9050:1391;;;;;;;;;;;;;;;;:::i;:::-;;783:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;326:29;;;;;;;;;;;;;:::o;6745:1642::-;1277:13;:11;:13::i;:::-;6899:24:::1;6933:21;7071:4;7058:18;7042:34;;7147:4;7141:11;7129:23;;7203:11;7193:8;7189:26;7183:4;7179:37;7173:4;7166:51;7587:4;7571:14;7567:25;7483:4;7437:8;7407:271;7698:23;7724:28;:40;7753:10;7724:40;;;;;;;;;;;;;;;;;;;;;7698:66;;7782:18;:35;7801:15;7782:35;;;;;;;;;;;;;;;;;;;;;;;;;7774:91;;;;;;;;;;;;;;;;;;;;;;7876:10;7889:42;:59;7932:15;7889:59;;;;;;;;;;;;;;;;;;;;;;;;;7876:72;;7976:1;7969:9;;7962:16;;;:3;:16;;;;7958:236;;7994:21;8035:3;8040:8;8018:31;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8018:31:0;;;7994:55;;8064:12;8081:15;:20;;8102:8;8081:30;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;8063:48:0;;;8133:7;8125:58;;;;;;;;;;;;;;;;;;;;;;7958:236;;;8256:124;;;;;;;;8283:18;8256:124;;;;;;8315:9;8256:124;;;;;;8338:10;8256:124;;;;8362:8;8256:124;;::::0;8204:15:::1;:35;8220:18;8204:35;;;;;;;;;;;;;;;:49;8240:12;8204:49;;;;;;;;;;;;;;;:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;1300:1;;;;6745:1642:::0;;;;;;:::o;555:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1187:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;1055:77::-;;;;;;;;;;;;;;;;;;;;;;:::o;4408:167::-;4492:20;;:::i;:::-;4531:15;:23;4547:6;4531:23;;;;;;;;;;;;;;;:37;4555:12;4531:37;;;;;;;;;;;;;;;4524:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4408:167;;;;:::o;5543:286::-;1277:13;:11;:13::i;:::-;5741:81:::1;5754:10;5766:15;5783:18;5803;5741:12;:81::i;:::-;5543:286:::0;;;;:::o;674:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;908:77::-;;;;;;;;;;;;;;;;;;;;;;:::o;9050:1391::-;1277:13;:11;:13::i;:::-;9146:21:::1;9321:4;9315:11;9303:23;;9443:4;9430:18;9498:7;9488:8;9484:22;9478:4;9474:33;9468:4;9461:47;9863:4;9847:14;9843:25;9738:4;9672:8;9642:277;9186:743;9939:23;9965:28;:40;9994:10;9965:40;;;;;;;;;;;;;;;;;;;;;9939:66;;10023:18;:35;10042:15;10023:35;;;;;;;;;;;;;;;;;;;;;;;;;10015:91;;;;;;;;;;;;;;;;;;;;;;10117:10;10130:42;:59;10173:15;10130:59;;;;;;;;;;;;;;;;;;;;;;;;;10117:72;;10217:1;10210:9;;10203:16;;;:3;:16;;;;10199:236;;10235:21;10276:3;10281:8;10259:31;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10259:31:0;;;10235:55;;10305:12;10322:15;:20;;10343:8;10322:30;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;10304:48:0;;;10374:7;10366:58;;;;;;;;;;;;;;;;;;;;;;10199:236;;;1300:1;;;9050:1391:::0;;;:::o;783:64::-;;;;;;;;;;;;;;;;;:::o;1314:120::-;1378:14;;;;;;;;;;;1364:28;;:10;:28;;;1356:71;;;;;;;;;;;;;;;;;;;;;;1314:120::o;10447:544::-;10668:15;10625:28;:40;10654:10;10625:40;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;10741:10;10693:28;:45;10722:15;10693:45;;;;;;;;;;;;;;;:58;;;;10823:18;10761:42;:59;10804:15;10761:59;;;;;;;;;;;;;;;;:80;;;;;;;;;;;;;;;;;;10913:18;10851:42;:59;10894:15;10851:59;;;;;;;;;;;;;;;;:80;;;;;;;;;;;;;;;;;;10980:4;10942:18;:35;10961:15;10942:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;10447:544;;;;:::o;277:10716::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:130;;222:6;209:20;200:29;;234:33;261:5;234:33;;;194:78;;;;;279:128;;358:6;345:20;336:29;;370:32;396:5;370:32;;;330:77;;;;;428:336;;;542:3;535:4;527:6;523:17;519:27;509:2;;560:1;557;550:12;509:2;593:6;580:20;570:30;;620:18;612:6;609:30;606:2;;;652:1;649;642:12;606:2;686:4;678:6;674:17;662:29;;737:3;729:4;721:6;717:17;707:8;703:32;700:41;697:2;;;754:1;751;744:12;697:2;502:262;;;;;;772:128;;851:6;838:20;829:29;;863:32;889:5;863:32;;;823:77;;;;;907:126;;985:6;972:20;963:29;;997:31;1022:5;997:31;;;957:76;;;;;1040:241;;1144:2;1132:9;1123:7;1119:23;1115:32;1112:2;;;1160:1;1157;1150:12;1112:2;1195:1;1212:53;1257:7;1248:6;1237:9;1233:22;1212:53;;;1202:63;;1174:97;1106:175;;;;;1288:241;;1392:2;1380:9;1371:7;1367:23;1363:32;1360:2;;;1408:1;1405;1398:12;1360:2;1443:1;1460:53;1505:7;1496:6;1485:9;1481:22;1460:53;;;1450:63;;1422:97;1354:175;;;;;1536:613;;;;;1689:3;1677:9;1668:7;1664:23;1660:33;1657:2;;;1706:1;1703;1696:12;1657:2;1741:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;;;1748:63;;1720:97;1848:2;1866:53;1911:7;1902:6;1891:9;1887:22;1866:53;;;1856:63;;1827:98;1956:2;1974:52;2018:7;2009:6;1998:9;1994:22;1974:52;;;1964:62;;1935:97;2063:2;2081:52;2125:7;2116:6;2105:9;2101:22;2081:52;;;2071:62;;2042:97;1651:498;;;;;;;;2156:490;;;;2296:2;2284:9;2275:7;2271:23;2267:32;2264:2;;;2312:1;2309;2302:12;2264:2;2347:1;2364:53;2409:7;2400:6;2389:9;2385:22;2364:53;;;2354:63;;2326:97;2482:2;2471:9;2467:18;2454:32;2506:18;2498:6;2495:30;2492:2;;;2538:1;2535;2528:12;2492:2;2566:64;2622:7;2613:6;2602:9;2598:22;2566:64;;;2556:74;;;;2433:203;2258:388;;;;;;2653:861;;;;;;;2841:3;2829:9;2820:7;2816:23;2812:33;2809:2;;;2858:1;2855;2848:12;2809:2;2893:1;2910:53;2955:7;2946:6;2935:9;2931:22;2910:53;;;2900:63;;2872:97;3000:2;3018:51;3061:7;3052:6;3041:9;3037:22;3018:51;;;3008:61;;2979:96;3106:2;3124:52;3168:7;3159:6;3148:9;3144:22;3124:52;;;3114:62;;3085:97;3213:2;3231:53;3276:7;3267:6;3256:9;3252:22;3231:53;;;3221:63;;3192:98;3349:3;3338:9;3334:19;3321:33;3374:18;3366:6;3363:30;3360:2;;;3406:1;3403;3396:12;3360:2;3434:64;3490:7;3481:6;3470:9;3466:22;3434:64;;;3424:74;;;;3300:204;2803:711;;;;;;;;;3521:360;;;3639:2;3627:9;3618:7;3614:23;3610:32;3607:2;;;3655:1;3652;3645:12;3607:2;3690:1;3707:52;3751:7;3742:6;3731:9;3727:22;3707:52;;;3697:62;;3669:96;3796:2;3814:51;3857:7;3848:6;3837:9;3833:22;3814:51;;;3804:61;;3775:96;3601:280;;;;;;3888:360;;;4006:2;3994:9;3985:7;3981:23;3977:32;3974:2;;;4022:1;4019;4012:12;3974:2;4057:1;4074:51;4117:7;4108:6;4097:9;4093:22;4074:51;;;4064:61;;4036:95;4162:2;4180:52;4224:7;4215:6;4204:9;4200:22;4180:52;;;4170:62;;4141:97;3968:280;;;;;;4255:103;4328:24;4346:5;4328:24;;;4323:3;4316:37;4310:48;;;4365:113;4448:24;4466:5;4448:24;;;4443:3;4436:37;4430:48;;;4485:104;4562:21;4577:5;4562:21;;;4557:3;4550:34;4544:45;;;4596:103;4669:24;4687:5;4669:24;;;4664:3;4657:37;4651:48;;;4706:113;4789:24;4807:5;4789:24;;;4784:3;4777:37;4771:48;;;4826:110;4907:23;4924:5;4907:23;;;4902:3;4895:36;4889:47;;;4943:148;5042:43;5061:23;5078:5;5061:23;;;5042:43;;;5037:3;5030:56;5024:67;;;5098:356;;5226:38;5258:5;5226:38;;;5276:88;5357:6;5352:3;5276:88;;;5269:95;;5369:52;5414:6;5409:3;5402:4;5395:5;5391:16;5369:52;;;5442:6;5437:3;5433:16;5426:23;;5206:248;;;;;;5461:315;;5557:34;5585:5;5557:34;;;5603:60;5656:6;5651:3;5603:60;;;5596:67;;5668:52;5713:6;5708:3;5701:4;5694:5;5690:16;5668:52;;;5741:29;5763:6;5741:29;;;5736:3;5732:39;5725:46;;5537:239;;;;;;5783:335;;5889:34;5917:5;5889:34;;;5935:70;5998:6;5993:3;5935:70;;;5928:77;;6010:52;6055:6;6050:3;6043:4;6036:5;6032:16;6010:52;;;6083:29;6105:6;6083:29;;;6078:3;6074:39;6067:46;;5869:249;;;;;;6126:330;;6286:67;6350:2;6345:3;6286:67;;;6279:74;;6386:32;6382:1;6377:3;6373:11;6366:53;6447:2;6442:3;6438:12;6431:19;;6272:184;;;;6465:375;;6625:67;6689:2;6684:3;6625:67;;;6618:74;;6725:34;6721:1;6716:3;6712:11;6705:55;6794:8;6789:2;6784:3;6780:12;6773:30;6831:2;6826:3;6822:12;6815:19;;6611:229;;;;6849:380;;7009:67;7073:2;7068:3;7009:67;;;7002:74;;7109:34;7105:1;7100:3;7096:11;7089:55;7178:13;7173:2;7168:3;7164:12;7157:35;7220:2;7215:3;7211:12;7204:19;;6995:234;;;;7318:910;;7477:4;7472:3;7468:14;7575:4;7568:5;7564:16;7558:23;7587:59;7640:4;7635:3;7631:14;7617:12;7587:59;;;7497:155;7731:4;7724:5;7720:16;7714:23;7743:63;7800:4;7795:3;7791:14;7777:12;7743:63;;;7662:150;7892:4;7885:5;7881:16;7875:23;7904:63;7961:4;7956:3;7952:14;7938:12;7904:63;;;7822:151;8051:4;8044:5;8040:16;8034:23;8103:3;8097:4;8093:14;8086:4;8081:3;8077:14;8070:38;8123:67;8185:4;8171:12;8123:67;;;8115:75;;7983:219;8219:4;8212:11;;7450:778;;;;;;8235:97;8304:22;8320:5;8304:22;;;8299:3;8292:35;8286:46;;;8339:107;8418:22;8434:5;8418:22;;;8413:3;8406:35;8400:46;;;8453:396;;8616:73;8685:3;8676:6;8616:73;;;8711:1;8706:3;8702:11;8695:18;;8731:93;8820:3;8811:6;8731:93;;;8724:100;;8841:3;8834:10;;8604:245;;;;;;8856:262;;9000:93;9089:3;9080:6;9000:93;;;8993:100;;9110:3;9103:10;;8981:137;;;;;9125:213;;9243:2;9232:9;9228:18;9220:26;;9257:71;9325:1;9314:9;9310:17;9301:6;9257:71;;;9214:124;;;;;9345:201;;9457:2;9446:9;9442:18;9434:26;;9471:65;9533:1;9522:9;9518:17;9509:6;9471:65;;;9428:118;;;;;9553:213;;9671:2;9660:9;9656:18;9648:26;;9685:71;9753:1;9742:9;9738:17;9729:6;9685:71;;;9642:124;;;;;9773:209;;9889:2;9878:9;9874:18;9866:26;;9903:69;9969:1;9958:9;9954:17;9945:6;9903:69;;;9860:122;;;;;9989:407;;10180:2;10169:9;10165:18;10157:26;;10230:9;10224:4;10220:20;10216:1;10205:9;10201:17;10194:47;10255:131;10381:4;10255:131;;;10247:139;;10151:245;;;;10403:407;;10594:2;10583:9;10579:18;10571:26;;10644:9;10638:4;10634:20;10630:1;10619:9;10615:17;10608:47;10669:131;10795:4;10669:131;;;10661:139;;10565:245;;;;10817:407;;11008:2;10997:9;10993:18;10985:26;;11058:9;11052:4;11048:20;11044:1;11033:9;11029:17;11022:47;11083:131;11209:4;11083:131;;;11075:139;;10979:245;;;;11231:377;;11407:2;11396:9;11392:18;11384:26;;11457:9;11451:4;11447:20;11443:1;11432:9;11428:17;11421:47;11482:116;11593:4;11584:6;11482:116;;;11474:124;;11378:230;;;;;11615:615;;11827:3;11816:9;11812:19;11804:27;;11842:67;11906:1;11895:9;11891:17;11882:6;11842:67;;;11920:72;11988:2;11977:9;11973:18;11964:6;11920:72;;;12003;12071:2;12060:9;12056:18;12047:6;12003:72;;;12123:9;12117:4;12113:20;12108:2;12097:9;12093:18;12086:48;12148:72;12215:4;12206:6;12148:72;;;12140:80;;11798:432;;;;;;;;12237:117;;12326:5;12320:12;12310:22;;12291:63;;;;12361:121;;12454:5;12448:12;12438:22;;12419:63;;;;12490:152;;12594:6;12589:3;12582:19;12631:4;12626:3;12622:14;12607:29;;12575:67;;;;;12651:162;;12765:6;12760:3;12753:19;12802:4;12797:3;12793:14;12778:29;;12746:67;;;;;12822:144;;12957:3;12942:18;;12935:31;;;;;12975:163;;13090:6;13085:3;13078:19;13127:4;13122:3;13118:14;13103:29;;13071:67;;;;;13146:91;;13208:24;13226:5;13208:24;;;13197:35;;13191:46;;;;13244:85;;13317:5;13310:13;13303:21;13292:32;;13286:43;;;;13336:72;;13398:5;13387:16;;13381:27;;;;13415:144;;13487:66;13480:5;13476:78;13465:89;;13459:100;;;;13566:121;;13639:42;13632:5;13628:54;13617:65;;13611:76;;;;13694:96;;13766:18;13759:5;13755:30;13744:41;;13738:52;;;;13797:81;;13868:4;13861:5;13857:16;13846:27;;13840:38;;;;13886:268;13951:1;13958:101;13972:6;13969:1;13966:13;13958:101;;;14048:1;14043:3;14039:11;14033:18;14029:1;14024:3;14020:11;14013:39;13994:2;13991:1;13987:10;13982:15;;13958:101;;;14074:6;14071:1;14068:13;14065:2;;;14139:1;14130:6;14125:3;14121:16;14114:27;14065:2;13935:219;;;;;14162:73;;14225:5;14214:16;;14208:27;;;;14242:97;;14330:2;14326:7;14321:2;14314:5;14310:14;14306:28;14296:38;;14290:49;;;;14347:117;14416:24;14434:5;14416:24;;;14409:5;14406:35;14396:2;;14455:1;14452;14445:12;14396:2;14390:74;;14471:117;14540:24;14558:5;14540:24;;;14533:5;14530:35;14520:2;;14579:1;14576;14569:12;14520:2;14514:74;;14595:115;14663:23;14680:5;14663:23;;;14656:5;14653:34;14643:2;;14701:1;14698;14691:12;14643:2;14637:73;;14717:115;14785:23;14802:5;14785:23;;;14778:5;14775:34;14765:2;;14823:1;14820;14813:12;14765:2;14759:73;;14839:113;14906:22;14922:5;14906:22;;;14899:5;14896:33;14886:2;;14943:1;14940;14933:12;14886:2;14880:72;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "1206400",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"_bridgeAddress()": "1215",
"_contractAddressToDepositFunctionSignature(address)": "1611",
"_contractAddressToExecuteFunctionSignature(address)": "1634",
"_contractAddressToResourceID(address)": "1624",
"_contractWhitelist(address)": "1612",
"_depositRecords(uint8,uint64)": "infinite",
"_resourceIDToContractAddress(bytes32)": "1583",
"deposit(bytes32,uint8,uint64,address,bytes)": "infinite",
"executeProposal(bytes32,bytes)": "infinite",
"getDepositRecord(uint64,uint8)": "infinite",
"setResource(bytes32,address,bytes4,bytes4)": "infinite"
},
"internal": {
"_onlyBridge()": "infinite",
"_setResource(bytes32,address,bytes4,bytes4)": "103943"
}
},
"methodIdentifiers": {
"_bridgeAddress()": "318c136e",
"_contractAddressToDepositFunctionSignature(address)": "cb624463",
"_contractAddressToExecuteFunctionSignature(address)": "a5c3a985",
"_contractAddressToResourceID(address)": "ec97d3b4",
"_contractWhitelist(address)": "7f79bea8",
"_depositRecords(uint8,uint64)": "4402027f",
"_resourceIDToContractAddress(bytes32)": "c54c2a11",
"deposit(bytes32,uint8,uint64,address,bytes)": "38995da9",
"executeProposal(bytes32,bytes)": "e248cff2",
"getDepositRecord(uint64,uint8)": "ba484c09",
"setResource(bytes32,address,bytes4,bytes4)": "bba8185a"
}
},
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "bridgeAddress",
"type": "address"
},
{
"internalType": "bytes32[]",
"name": "initialResourceIDs",
"type": "bytes32[]"
},
{
"internalType": "address[]",
"name": "initialContractAddresses",
"type": "address[]"
},
{
"internalType": "bytes4[]",
"name": "initialDepositFunctionSignatures",
"type": "bytes4[]"
},
{
"internalType": "bytes4[]",
"name": "initialExecuteFunctionSignatures",
"type": "bytes4[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractAddressToDepositFunctionSignature",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractAddressToExecuteFunctionSignature",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"name": "_depositRecords",
"outputs": [
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_metaData",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "uint8",
"name": "destId",
"type": "uint8"
}
],
"name": "getDepositRecord",
"outputs": [
{
"components": [
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_metaData",
"type": "bytes"
}
],
"internalType": "struct GenericHandler.DepositRecord",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "bytes4",
"name": "depositFunctionSig",
"type": "bytes4"
},
{
"internalType": "bytes4",
"name": "executeFunctionSig",
"type": "bytes4"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "bridgeAddress",
"type": "address"
},
{
"internalType": "bytes32[]",
"name": "initialResourceIDs",
"type": "bytes32[]"
},
{
"internalType": "address[]",
"name": "initialContractAddresses",
"type": "address[]"
},
{
"internalType": "bytes4[]",
"name": "initialDepositFunctionSignatures",
"type": "bytes4[]"
},
{
"internalType": "bytes4[]",
"name": "initialExecuteFunctionSignatures",
"type": "bytes4[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractAddressToDepositFunctionSignature",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractAddressToExecuteFunctionSignature",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"name": "_depositRecords",
"outputs": [
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_metaData",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "uint8",
"name": "destId",
"type": "uint8"
}
],
"name": "getDepositRecord",
"outputs": [
{
"components": [
{
"internalType": "uint8",
"name": "_destinationChainID",
"type": "uint8"
},
{
"internalType": "address",
"name": "_depositer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "_metaData",
"type": "bytes"
}
],
"internalType": "struct GenericHandler.DepositRecord",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "bytes4",
"name": "depositFunctionSig",
"type": "bytes4"
},
{
"internalType": "bytes4",
"name": "executeFunctionSig",
"type": "bytes4"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"constructor": {
"details": "{initialResourceIDs}, {initialContractAddresses}, {initialDepositFunctionSignatures}, and {initialExecuteFunctionSignatures} must all have the same length. Also, values must be ordered in the way that that index x of any mentioned array must be intended for value x of any other array, e.g. {initialContractAddresses}[0] is the intended address for {initialDepositFunctionSignatures}[0].",
"params": {
"bridgeAddress": "Contract address of previously deployed Bridge.",
"initialContractAddresses": "These are the addresses the {initialResourceIDs} will point to, and are the contracts that will be called to perform deposit and execution calls.",
"initialDepositFunctionSignatures": "These are the function signatures {initialContractAddresses} will point to, and are the function that will be called when executing {deposit}",
"initialExecuteFunctionSignatures": "These are the function signatures {initialContractAddresses} will point to, and are the function that will be called when executing {executeProposal}",
"initialResourceIDs": "Resource IDs used to identify a specific contract address. These are the Resource IDs this contract will initially support."
}
},
"deposit(bytes32,uint8,uint64,address,bytes)": {
"params": {
"data": "Consists of: {resourceID}, {lenMetaData}, and {metaData} all padded to 32 bytes.",
"depositNonce": "This value is generated as an ID by the Bridge contract.",
"depositer": "Address of account making the deposit in the Bridge contract.",
"destinationChainID": "Chain ID deposit is expected to be bridged to."
}
},
"executeProposal(bytes32,bytes)": {
"params": {
"data": "Consists of {resourceID}, {lenMetaData}, and {metaData}."
}
},
"getDepositRecord(uint64,uint8)": {
"params": {
"depositNonce": "This ID will have been generated by the Bridge contract.",
"destId": "ID of chain deposit will be bridged to."
},
"returns": {
"_0": "DepositRecord which consists of: - _destinationChainID ChainID deposited tokens are intended to end up on. - _resourceID ResourceID used when {deposit} was executed. - _depositer Address that initially called {deposit} in the Bridge contract. - _metaData Data to be passed to method executed in corresponding {resourceID} contract."
}
},
"setResource(bytes32,address,bytes4,bytes4)": {
"params": {
"contractAddress": "Address of contract to be called when a deposit is made and a deposited is executed.",
"depositFunctionSig": "Function signature of method to be called in {contractAddress} when a deposit is made.",
"executeFunctionSig": "Function signature of method to be called in {contractAddress} when a deposit is executed.",
"resourceID": "ResourceID to be used when making deposits."
}
}
},
"title": "Handles generic deposits and deposit executions."
},
"userdoc": {
"methods": {
"deposit(bytes32,uint8,uint64,address,bytes)": {
"notice": "A deposit is initiatied by making a deposit in the Bridge contract.Data passed into the function should be constructed as follows: len(data) uint256 bytes 0 - 32 data bytes bytes 64 - END{contractAddress} is required to be whitelistedIf {_contractAddressToDepositFunctionSignature}[{contractAddress}] is set, {metaData} is expected to consist of needed function arguments."
},
"executeProposal(bytes32,bytes)": {
"notice": "Proposal execution should be initiated when a proposal is finalized in the Bridge contract.Data passed into the function should be constructed as follows: len(data) uint256 bytes 0 - 32 data bytes bytes 32 - END{contractAddress} is required to be whitelistedIf {_contractAddressToExecuteFunctionSignature}[{contractAddress}] is set, {metaData} is expected to consist of needed function arguments."
},
"setResource(bytes32,address,bytes4,bytes4)": {
"notice": "First verifies {_resourceIDToContractAddress}[{resourceID}] and {_contractAddressToResourceID}[{contractAddress}] are not already set, then sets {_resourceIDToContractAddress} with {contractAddress}, {_contractAddressToResourceID} with {resourceID}, {_contractAddressToDepositFunctionSignature} with {depositFunctionSig}, {_contractAddressToExecuteFunctionSignature} with {executeFunctionSig}, and {_contractWhitelist} to true for {contractAddress}."
}
},
"notice": "This contract is intended to be used with the Bridge contract."
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/handlers/GenericHandler.sol": "GenericHandler"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/handlers/GenericHandler.sol": {
"keccak256": "0x45c9e93662f3a0d91e322be6ed0d6b3fccd52374eb0722ddf548e2a5025e210d",
"urls": [
"bzz-raw://a73601c13961bc0aad2576129c0ed1d73f7a99e401150f889d0936910edb125e",
"dweb:/ipfs/QmQpAGm2iYtjvWZDJuLZdX6JiQa5fYXJcegWb6sNcUxXY1"
]
},
"chain-bridge-solidity/interfaces/IGenericHandler.sol": {
"keccak256": "0xaeb0f50bc06faa2cacce837cc232d486458c00e6891c038b36bb93c407ab626e",
"urls": [
"bzz-raw://638424b4684970cad852a437477e86b035f443f9f2dbb03a2d9f886a1488eec8",
"dweb:/ipfs/Qmcnas9wLSRaZVDdggHLRDrC5qvbh8e2NUmnoXtAtJ38Fh"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50610741806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637f79bea81161005b5780637f79bea8146101e5578063b8fa373614610241578063c8ba6c871461028f578063d9caed12146102e757610088565b806307b7ed991461008d5780630a6d55d8146100d1578063318c136e1461013f5780636a70d08114610189575b600080fd5b6100cf600480360360208110156100a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610355565b005b6100fd600480360360208110156100e757600080fd5b8101908080359060200190929190505050610369565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61014761039c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101cb6004803603602081101561019f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b610227600480360360208110156101fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103e1565b604051808215151515815260200191505060405180910390f35b61028d6004803603604081101561025757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610401565b005b6102d1600480360360208110156102a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610417565b6040518082815260200191505060405180910390f35b610353600480360360608110156102fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061042f565b005b61035d610434565b610366816104f8565b50565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b610409610434565b61041382826105f5565b5050565b60026020528060005260406000206000915090505481565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f73656e646572206d7573742062652062726964676520636f6e7472616374000081525060200191505060405180910390fd5b565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661059a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806106e86024913960400191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b806001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505056fe70726f766964656420636f6e7472616374206973206e6f742077686974656c6973746564a26469706673582212201216b2b60b0d611140f6b5c22603bb25945ab7deae2ad466d545029e92b57cf064736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x741 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F79BEA8 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x7F79BEA8 EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0xB8FA3736 EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0xC8BA6C87 EQ PUSH2 0x28F JUMPI DUP1 PUSH4 0xD9CAED12 EQ PUSH2 0x2E7 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x7B7ED99 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0xA6D55D8 EQ PUSH2 0xD1 JUMPI DUP1 PUSH4 0x318C136E EQ PUSH2 0x13F JUMPI DUP1 PUSH4 0x6A70D081 EQ PUSH2 0x189 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xCF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x355 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x369 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x147 PUSH2 0x39C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1CB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x19F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3C1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x227 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x28D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x401 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2D1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x417 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x353 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x42F JUMP JUMPDEST STOP JUMPDEST PUSH2 0x35D PUSH2 0x434 JUMP JUMPDEST PUSH2 0x366 DUP2 PUSH2 0x4F8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x409 PUSH2 0x434 JUMP JUMPDEST PUSH2 0x413 DUP3 DUP3 PUSH2 0x5F5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x4F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x73656E646572206D7573742062652062726964676520636F6E74726163740000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x59A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x6E8 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP JUMP INVALID PUSH17 0x726F766964656420636F6E747261637420 PUSH10 0x73206E6F742077686974 PUSH6 0x6C6973746564 LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLT AND 0xB2 0xB6 SIGNEXTEND 0xD PUSH2 0x1140 0xF6 0xB5 0xC2 0x26 SUB 0xBB 0x25 SWAP5 GAS 0xB7 0xDE 0xAE 0x2A 0xD4 PUSH7 0xD545029E92B57C CREATE PUSH5 0x736F6C6343 STOP MOD DIV STOP CALLER ",
"sourceMap": "230:2701:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;230:2701:0;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100885760003560e01c80637f79bea81161005b5780637f79bea8146101e5578063b8fa373614610241578063c8ba6c871461028f578063d9caed12146102e757610088565b806307b7ed991461008d5780630a6d55d8146100d1578063318c136e1461013f5780636a70d08114610189575b600080fd5b6100cf600480360360208110156100a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610355565b005b6100fd600480360360208110156100e757600080fd5b8101908080359060200190929190505050610369565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61014761039c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101cb6004803603602081101561019f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b610227600480360360208110156101fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506103e1565b604051808215151515815260200191505060405180910390f35b61028d6004803603604081101561025757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610401565b005b6102d1600480360360208110156102a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610417565b6040518082815260200191505060405180910390f35b610353600480360360608110156102fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061042f565b005b61035d610434565b610366816104f8565b50565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b610409610434565b61041382826105f5565b5050565b60026020528060005260406000206000915090505481565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f73656e646572206d7573742062652062726964676520636f6e7472616374000081525060200191505060405180910390fd5b565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661059a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806106e86024913960400191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b806001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505056fe70726f766964656420636f6e7472616374206973206e6f742077686974656c6973746564a26469706673582212201216b2b60b0d611140f6b5c22603bb25945ab7deae2ad466d545029e92b57cf064736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F79BEA8 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x7F79BEA8 EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0xB8FA3736 EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0xC8BA6C87 EQ PUSH2 0x28F JUMPI DUP1 PUSH4 0xD9CAED12 EQ PUSH2 0x2E7 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x7B7ED99 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0xA6D55D8 EQ PUSH2 0xD1 JUMPI DUP1 PUSH4 0x318C136E EQ PUSH2 0x13F JUMPI DUP1 PUSH4 0x6A70D081 EQ PUSH2 0x189 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xCF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x355 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x369 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x147 PUSH2 0x39C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1CB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x19F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3C1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x227 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x28D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x401 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2D1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x417 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x353 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x42F JUMP JUMPDEST STOP JUMPDEST PUSH2 0x35D PUSH2 0x434 JUMP JUMPDEST PUSH2 0x366 DUP2 PUSH2 0x4F8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x409 PUSH2 0x434 JUMP JUMPDEST PUSH2 0x413 DUP3 DUP3 PUSH2 0x5F5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x4F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x73656E646572206D7573742062652062726964676520636F6E74726163740000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x59A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x6E8 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP JUMP INVALID PUSH17 0x726F766964656420636F6E747261637420 PUSH10 0x73206E6F742077686974 PUSH6 0x6C6973746564 LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLT AND 0xB2 0xB6 SIGNEXTEND 0xD PUSH2 0x1140 0xF6 0xB5 0xC2 0x26 SUB 0xBB 0x25 SWAP5 GAS 0xB7 0xDE 0xAE 0x2A 0xD4 PUSH7 0xD545029E92B57C CREATE PUSH5 0x736F6C6343 STOP MOD DIV STOP CALLER ",
"sourceMap": "230:2701:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;230:2701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;1897:120:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;1897:120:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;355:69;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;355:69:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;275:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;702:42;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;702:42:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;599:51;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;599:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1501:154;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;1501:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;475:69;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;475:69:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2323:112;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2323:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1897:120;783:13;:11;:13::i;:::-;1981:29:::1;1994:15;1981:12;:29::i;:::-;1897:120:::0;:::o;355:69::-;;;;;;;;;;;;;;;;;;;;;;:::o;275:29::-;;;;;;;;;;;;;:::o;702:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;599:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;1501:154::-;783:13;:11;:13::i;:::-;1607:41:::1;1620:10;1632:15;1607:12;:41::i;:::-;1501:154:::0;;:::o;475:69::-;;;;;;;;;;;;;;;;;:::o;2323:112::-;;;;:::o;820:119::-;883:14;;;;;;;;;;;869:28;;:10;:28;;;861:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;820:119::o;2729:200::-;2803:18;:35;2822:15;2803:35;;;;;;;;;;;;;;;;;;;;;;;;;2795:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2918:4;2889:9;:26;2899:15;2889:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;2729:200;:::o;2441:282::-;2575:15;2527:33;:45;2561:10;2527:45;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;2653:10;2600:33;:50;2634:15;2600:50;;;;;;;;;;;;;;;:63;;;;2712:4;2674:18;:35;2693:15;2674:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;2441:282;;:::o"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "371400",
"executionCost": "411",
"totalCost": "371811"
},
"external": {
"_bridgeAddress()": "1098",
"_burnList(address)": "1273",
"_contractWhitelist(address)": "1206",
"_resourceIDToTokenContractAddress(bytes32)": "1223",
"_tokenContractAddressToResourceID(address)": "1213",
"setBurnable(address)": "infinite",
"setResource(bytes32,address)": "63219",
"withdraw(address,address,uint256)": "364"
},
"internal": {
"_onlyBridge()": "infinite",
"_setBurnable(address)": "infinite",
"_setResource(bytes32,address)": "62025"
}
},
"methodIdentifiers": {
"_bridgeAddress()": "318c136e",
"_burnList(address)": "6a70d081",
"_contractWhitelist(address)": "7f79bea8",
"_resourceIDToTokenContractAddress(bytes32)": "0a6d55d8",
"_tokenContractAddressToResourceID(address)": "c8ba6c87",
"setBurnable(address)": "07b7ed99",
"setResource(bytes32,address)": "b8fa3736",
"withdraw(address,address,uint256)": "d9caed12"
}
},
"abi": [
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_burnList",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToTokenContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_tokenContractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOrTokenID",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_burnList",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToTokenContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_tokenContractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOrTokenID",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"setBurnable(address)": {
"params": {
"contractAddress": "Address of contract to be used when making or executing deposits."
}
},
"setResource(bytes32,address)": {
"params": {
"contractAddress": "Address of contract to be called when a deposit is made and a deposited is executed.",
"resourceID": "ResourceID to be used when making deposits."
}
},
"withdraw(address,address,uint256)": {
"params": {
"amountOrTokenID": "Either the amount of ERC20 tokens or the ERC721 token ID to release.",
"recipient": "Address to release tokens to.",
"tokenAddress": "Address of token contract to release."
}
}
},
"title": "Function used across handler contracts."
},
"userdoc": {
"methods": {
"setBurnable(address)": {
"notice": "First verifies {contractAddress} is whitelisted, then sets {_burnList}[{contractAddress}] to true."
},
"setResource(bytes32,address)": {
"notice": "First verifies {_resourceIDToContractAddress}[{resourceID}] and {_contractAddressToResourceID}[{contractAddress}] are not already set, then sets {_resourceIDToContractAddress} with {contractAddress}, {_contractAddressToResourceID} with {resourceID}, and {_contractWhitelist} to true for {contractAddress}."
},
"withdraw(address,address,uint256)": {
"notice": "Used to manually release funds from ERC safes."
}
},
"notice": "This contract is intended to be used with the Bridge contract."
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/handlers/HandlerHelpers.sol": "HandlerHelpers"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/handlers/HandlerHelpers.sol": {
"keccak256": "0x4d1e40e60e380edcb65e06b3e6ff92b8fe6d37590fc1723f246ce14bf6909ba2",
"urls": [
"bzz-raw://fbfcc2f2cbc38e8c75ae0424fa0a2e8b196db441ed4037cb892b202673e1be6a",
"dweb:/ipfs/QmcVojgbqU4qAqbQ6QqZuk8tb1ifoCH7opRRqJYKWTgpxY"
]
},
"chain-bridge-solidity/interfaces/IERCHandler.sol": {
"keccak256": "0xae4a0687ed7310b0e5b1e82074b38bd492de3c14f33acf12486f7380cd523578",
"urls": [
"bzz-raw://0e4195985bfa8305ea9ca1ecd40d34023846a89f3313104e84aedb84069a2926",
"dweb:/ipfs/QmcrKQzMC6YnXRZeE8Wau4rYB815kXrFTpPWVJBkmSS4SV"
]
}
},
"version": 1
}
pragma solidity 0.6.4;
pragma experimental ABIEncoderV2;
import "../interfaces/IDepositExecute.sol";
import "./HandlerHelpers.sol";
import "../ERC20Safe.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/presets/ERC20PresetMinterPauser.sol";
/**
@title Handles ERC20 deposits and deposit executions.
@author ChainSafe Systems.
@notice This contract is intended to be used with the Bridge contract.
*/
contract ERC20Handler is IDepositExecute, HandlerHelpers, ERC20Safe {
struct DepositRecord {
address _tokenAddress;
uint8 _lenDestinationRecipientAddress;
uint8 _destinationChainID;
bytes32 _resourceID;
bytes _destinationRecipientAddress;
address _depositer;
uint _amount;
}
// depositNonce => Deposit Record
mapping (uint8 => mapping(uint64 => DepositRecord)) public _depositRecords;
/**
@param bridgeAddress Contract address of previously deployed Bridge.
@param initialResourceIDs Resource IDs are used to identify a specific contract address.
These are the Resource IDs this contract will initially support.
@param initialContractAddresses These are the addresses the {initialResourceIDs} will point to, and are the contracts that will be
called to perform various deposit calls.
@param burnableContractAddresses These addresses will be set as burnable and when {deposit} is called, the deposited token will be burned.
When {executeProposal} is called, new tokens will be minted.
@dev {initialResourceIDs} and {initialContractAddresses} must have the same length (one resourceID for every address).
Also, these arrays must be ordered in the way that {initialResourceIDs}[0] is the intended resourceID for {initialContractAddresses}[0].
*/
constructor(
address bridgeAddress,
bytes32[] memory initialResourceIDs,
address[] memory initialContractAddresses,
address[] memory burnableContractAddresses
) public {
require(initialResourceIDs.length == initialContractAddresses.length,
"initialResourceIDs and initialContractAddresses len mismatch");
_bridgeAddress = bridgeAddress;
for (uint256 i = 0; i < initialResourceIDs.length; i++) {
_setResource(initialResourceIDs[i], initialContractAddresses[i]);
}
for (uint256 i = 0; i < burnableContractAddresses.length; i++) {
_setBurnable(burnableContractAddresses[i]);
}
}
/**
@param depositNonce This ID will have been generated by the Bridge contract.
@param destId ID of chain deposit will be bridged to.
@return DepositRecord which consists of:
- _tokenAddress Address used when {deposit} was executed.
- _destinationChainID ChainID deposited tokens are intended to end up on.
- _resourceID ResourceID used when {deposit} was executed.
- _lenDestinationRecipientAddress Used to parse recipient's address from {_destinationRecipientAddress}
- _destinationRecipientAddress Address tokens are intended to be deposited to on desitnation chain.
- _depositer Address that initially called {deposit} in the Bridge contract.
- _amount Amount of tokens that were deposited.
*/
function getDepositRecord(uint64 depositNonce, uint8 destId) external view returns (DepositRecord memory) {
return _depositRecords[destId][depositNonce];
}
/**
@notice A deposit is initiatied by making a deposit in the Bridge contract.
@param destinationChainID Chain ID of chain tokens are expected to be bridged to.
@param depositNonce This value is generated as an ID by the Bridge contract.
@param depositer Address of account making the deposit in the Bridge contract.
@param data Consists of: {resourceID}, {amount}, {lenRecipientAddress}, and {recipientAddress}
all padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
amount uint256 bytes 0 - 32
recipientAddress length uint256 bytes 32 - 64
recipientAddress bytes bytes 64 - END
@dev Depending if the corresponding {tokenAddress} for the parsed {resourceID} is
marked true in {_burnList}, deposited tokens will be burned, if not, they will be locked.
*/
function deposit(
bytes32 resourceID,
uint8 destinationChainID,
uint64 depositNonce,
address depositer,
bytes calldata data
) external override onlyBridge {
bytes memory recipientAddress;
uint256 amount;
uint256 lenRecipientAddress;
assembly {
amount := calldataload(0xC4)
recipientAddress := mload(0x40)
lenRecipientAddress := calldataload(0xE4)
mstore(0x40, add(0x20, add(recipientAddress, lenRecipientAddress)))
calldatacopy(
recipientAddress, // copy to destinationRecipientAddress
0xE4, // copy from calldata @ 0x104
sub(calldatasize(), 0xE) // copy size (calldatasize - 0x104)
)
}
address tokenAddress = _resourceIDToTokenContractAddress[resourceID];
require(_contractWhitelist[tokenAddress], "provided tokenAddress is not whitelisted");
if (_burnList[tokenAddress]) {
burnERC20(tokenAddress, depositer, amount);
} else {
lockERC20(tokenAddress, depositer, address(this), amount);
}
_depositRecords[destinationChainID][depositNonce] = DepositRecord(
tokenAddress,
uint8(lenRecipientAddress),
destinationChainID,
resourceID,
recipientAddress,
depositer,
amount
);
}
/**
@notice Proposal execution should be initiated when a proposal is finalized in the Bridge contract.
by a relayer on the deposit's destination chain.
@param data Consists of {resourceID}, {amount}, {lenDestinationRecipientAddress},
and {destinationRecipientAddress} all padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
amount uint256 bytes 0 - 32
destinationRecipientAddress length uint256 bytes 32 - 64
destinationRecipientAddress bytes bytes 64 - END
*/
function executeProposal(bytes32 resourceID, bytes calldata data) external override onlyBridge {
uint256 amount;
bytes memory destinationRecipientAddress;
assembly {
amount := calldataload(0x64)
destinationRecipientAddress := mload(0x40)
let lenDestinationRecipientAddress := calldataload(0x84)
mstore(0x40, add(0x20, add(destinationRecipientAddress, lenDestinationRecipientAddress)))
// in the calldata the destinationRecipientAddress is stored at 0xC4 after accounting for the function signature and length declaration
calldatacopy(
destinationRecipientAddress, // copy to destinationRecipientAddress
0x84, // copy from calldata @ 0x84
sub(calldatasize(), 0x84) // copy size to the end of calldata
)
}
bytes20 recipientAddress;
address tokenAddress = _resourceIDToTokenContractAddress[resourceID];
assembly {
recipientAddress := mload(add(destinationRecipientAddress, 0x20))
}
require(_contractWhitelist[tokenAddress], "provided tokenAddress is not whitelisted");
if (_burnList[tokenAddress]) {
mintERC20(tokenAddress, address(recipientAddress), amount);
} else {
releaseERC20(tokenAddress, address(recipientAddress), amount);
}
}
/**
@notice Used to manually release ERC20 tokens from ERC20Safe.
@param tokenAddress Address of token contract to release.
@param recipient Address to release tokens to.
@param amount The amount of ERC20 tokens to release.
*/
function withdraw(address tokenAddress, address recipient, uint amount) external override onlyBridge {
releaseERC20(tokenAddress, recipient, amount);
}
}
pragma solidity 0.6.4;
pragma experimental ABIEncoderV2;
import "../interfaces/IGenericHandler.sol";
/**
@title Handles generic deposits and deposit executions.
@author ChainSafe Systems.
@notice This contract is intended to be used with the Bridge contract.
*/
contract GenericHandler is IGenericHandler {
address public _bridgeAddress;
struct DepositRecord {
uint8 _destinationChainID;
address _depositer;
bytes32 _resourceID;
bytes _metaData;
}
// depositNonce => Deposit Record
mapping (uint8 => mapping(uint64 => DepositRecord)) public _depositRecords;
// resourceID => contract address
mapping (bytes32 => address) public _resourceIDToContractAddress;
// contract address => resourceID
mapping (address => bytes32) public _contractAddressToResourceID;
// contract address => deposit function signature
mapping (address => bytes4) public _contractAddressToDepositFunctionSignature;
// contract address => execute proposal function signature
mapping (address => bytes4) public _contractAddressToExecuteFunctionSignature;
// token contract address => is whitelisted
mapping (address => bool) public _contractWhitelist;
modifier onlyBridge() {
_onlyBridge();
_;
}
function _onlyBridge() private {
require(msg.sender == _bridgeAddress, "sender must be bridge contract");
}
/**
@param bridgeAddress Contract address of previously deployed Bridge.
@param initialResourceIDs Resource IDs used to identify a specific contract address.
These are the Resource IDs this contract will initially support.
@param initialContractAddresses These are the addresses the {initialResourceIDs} will point to, and are the contracts that will be
called to perform deposit and execution calls.
@param initialDepositFunctionSignatures These are the function signatures {initialContractAddresses} will point to,
and are the function that will be called when executing {deposit}
@param initialExecuteFunctionSignatures These are the function signatures {initialContractAddresses} will point to,
and are the function that will be called when executing {executeProposal}
@dev {initialResourceIDs}, {initialContractAddresses}, {initialDepositFunctionSignatures},
and {initialExecuteFunctionSignatures} must all have the same length. Also,
values must be ordered in the way that that index x of any mentioned array
must be intended for value x of any other array, e.g. {initialContractAddresses}[0]
is the intended address for {initialDepositFunctionSignatures}[0].
*/
constructor(
address bridgeAddress,
bytes32[] memory initialResourceIDs,
address[] memory initialContractAddresses,
bytes4[] memory initialDepositFunctionSignatures,
bytes4[] memory initialExecuteFunctionSignatures
) public {
require(initialResourceIDs.length == initialContractAddresses.length,
"initialResourceIDs and initialContractAddresses len mismatch");
require(initialContractAddresses.length == initialDepositFunctionSignatures.length,
"provided contract addresses and function signatures len mismatch");
require(initialDepositFunctionSignatures.length == initialExecuteFunctionSignatures.length,
"provided deposit and execute function signatures len mismatch");
_bridgeAddress = bridgeAddress;
for (uint256 i = 0; i < initialResourceIDs.length; i++) {
_setResource(
initialResourceIDs[i],
initialContractAddresses[i],
initialDepositFunctionSignatures[i],
initialExecuteFunctionSignatures[i]);
}
}
/**
@param depositNonce This ID will have been generated by the Bridge contract.
@param destId ID of chain deposit will be bridged to.
@return DepositRecord which consists of:
- _destinationChainID ChainID deposited tokens are intended to end up on.
- _resourceID ResourceID used when {deposit} was executed.
- _depositer Address that initially called {deposit} in the Bridge contract.
- _metaData Data to be passed to method executed in corresponding {resourceID} contract.
*/
function getDepositRecord(uint64 depositNonce, uint8 destId) external view returns (DepositRecord memory) {
return _depositRecords[destId][depositNonce];
}
/**
@notice First verifies {_resourceIDToContractAddress}[{resourceID}] and
{_contractAddressToResourceID}[{contractAddress}] are not already set,
then sets {_resourceIDToContractAddress} with {contractAddress},
{_contractAddressToResourceID} with {resourceID},
{_contractAddressToDepositFunctionSignature} with {depositFunctionSig},
{_contractAddressToExecuteFunctionSignature} with {executeFunctionSig},
and {_contractWhitelist} to true for {contractAddress}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
@param depositFunctionSig Function signature of method to be called in {contractAddress} when a deposit is made.
@param executeFunctionSig Function signature of method to be called in {contractAddress} when a deposit is executed.
*/
function setResource(
bytes32 resourceID,
address contractAddress,
bytes4 depositFunctionSig,
bytes4 executeFunctionSig
) external onlyBridge override {
_setResource(resourceID, contractAddress, depositFunctionSig, executeFunctionSig);
}
/**
@notice A deposit is initiatied by making a deposit in the Bridge contract.
@param destinationChainID Chain ID deposit is expected to be bridged to.
@param depositNonce This value is generated as an ID by the Bridge contract.
@param depositer Address of account making the deposit in the Bridge contract.
@param data Consists of: {resourceID}, {lenMetaData}, and {metaData} all padded to 32 bytes.
@notice Data passed into the function should be constructed as follows:
len(data) uint256 bytes 0 - 32
data bytes bytes 64 - END
@notice {contractAddress} is required to be whitelisted
@notice If {_contractAddressToDepositFunctionSignature}[{contractAddress}] is set,
{metaData} is expected to consist of needed function arguments.
*/
function deposit(bytes32 resourceID, uint8 destinationChainID, uint64 depositNonce, address depositer, bytes calldata data) external onlyBridge {
bytes32 lenMetadata;
bytes memory metadata;
assembly {
// Load length of metadata from data + 64
lenMetadata := calldataload(0xC4)
// Load free memory pointer
metadata := mload(0x40)
mstore(0x40, add(0x20, add(metadata, lenMetadata)))
// func sig (4) + destinationChainId (padded to 32) + depositNonce (32) + depositor (32) +
// bytes length (32) + resourceId (32) + length (32) = 0xC4
calldatacopy(
metadata, // copy to metadata
0xC4, // copy from calldata after metadata length declaration @0xC4
sub(calldatasize(), 0xC4) // copy size (calldatasize - (0xC4 + the space metaData takes up))
)
}
address contractAddress = _resourceIDToContractAddress[resourceID];
require(_contractWhitelist[contractAddress], "provided contractAddress is not whitelisted");
bytes4 sig = _contractAddressToDepositFunctionSignature[contractAddress];
if (sig != bytes4(0)) {
bytes memory callData = abi.encodePacked(sig, metadata);
(bool success,) = contractAddress.call(callData);
require(success, "delegatecall to contractAddress failed");
}
_depositRecords[destinationChainID][depositNonce] = DepositRecord(
destinationChainID,
depositer,
resourceID,
metadata
);
}
/**
@notice Proposal execution should be initiated when a proposal is finalized in the Bridge contract.
@param data Consists of {resourceID}, {lenMetaData}, and {metaData}.
@notice Data passed into the function should be constructed as follows:
len(data) uint256 bytes 0 - 32
data bytes bytes 32 - END
@notice {contractAddress} is required to be whitelisted
@notice If {_contractAddressToExecuteFunctionSignature}[{contractAddress}] is set,
{metaData} is expected to consist of needed function arguments.
*/
function executeProposal(bytes32 resourceID, bytes calldata data) external onlyBridge {
bytes memory metaData;
assembly {
// metadata has variable length
// load free memory pointer to store metadata
metaData := mload(0x40)
// first 32 bytes of variable length in storage refer to length
let lenMeta := calldataload(0x64)
mstore(0x40, add(0x60, add(metaData, lenMeta)))
// in the calldata, metadata is stored @0x64 after accounting for function signature, and 2 previous params
calldatacopy(
metaData, // copy to metaData
0x64, // copy from calldata after data length declaration at 0x64
sub(calldatasize(), 0x64) // copy size (calldatasize - 0x64)
)
}
address contractAddress = _resourceIDToContractAddress[resourceID];
require(_contractWhitelist[contractAddress], "provided contractAddress is not whitelisted");
bytes4 sig = _contractAddressToExecuteFunctionSignature[contractAddress];
if (sig != bytes4(0)) {
bytes memory callData = abi.encodePacked(sig, metaData);
(bool success,) = contractAddress.call(callData);
require(success, "delegatecall to contractAddress failed");
}
}
function _setResource(
bytes32 resourceID,
address contractAddress,
bytes4 depositFunctionSig,
bytes4 executeFunctionSig
) internal {
_resourceIDToContractAddress[resourceID] = contractAddress;
_contractAddressToResourceID[contractAddress] = resourceID;
_contractAddressToDepositFunctionSignature[contractAddress] = depositFunctionSig;
_contractAddressToExecuteFunctionSignature[contractAddress] = executeFunctionSig;
_contractWhitelist[contractAddress] = true;
}
}
pragma solidity 0.6.4;
import "../interfaces/IERCHandler.sol";
/**
@title Function used across handler contracts.
@author ChainSafe Systems.
@notice This contract is intended to be used with the Bridge contract.
*/
contract HandlerHelpers is IERCHandler {
address public _bridgeAddress;
// resourceID => token contract address
mapping (bytes32 => address) public _resourceIDToTokenContractAddress;
// token contract address => resourceID
mapping (address => bytes32) public _tokenContractAddressToResourceID;
// token contract address => is whitelisted
mapping (address => bool) public _contractWhitelist;
// token contract address => is burnable
mapping (address => bool) public _burnList;
modifier onlyBridge() {
_onlyBridge();
_;
}
function _onlyBridge() private {
require(msg.sender == _bridgeAddress, "sender must be bridge contract");
}
/**
@notice First verifies {_resourceIDToContractAddress}[{resourceID}] and
{_contractAddressToResourceID}[{contractAddress}] are not already set,
then sets {_resourceIDToContractAddress} with {contractAddress},
{_contractAddressToResourceID} with {resourceID},
and {_contractWhitelist} to true for {contractAddress}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function setResource(bytes32 resourceID, address contractAddress) external override onlyBridge {
_setResource(resourceID, contractAddress);
}
/**
@notice First verifies {contractAddress} is whitelisted, then sets {_burnList}[{contractAddress}]
to true.
@param contractAddress Address of contract to be used when making or executing deposits.
*/
function setBurnable(address contractAddress) external override onlyBridge{
_setBurnable(contractAddress);
}
/**
@notice Used to manually release funds from ERC safes.
@param tokenAddress Address of token contract to release.
@param recipient Address to release tokens to.
@param amountOrTokenID Either the amount of ERC20 tokens or the ERC721 token ID to release.
*/
function withdraw(address tokenAddress, address recipient, uint256 amountOrTokenID) external virtual override {}
function _setResource(bytes32 resourceID, address contractAddress) internal {
_resourceIDToTokenContractAddress[resourceID] = contractAddress;
_tokenContractAddressToResourceID[contractAddress] = resourceID;
_contractWhitelist[contractAddress] = true;
}
function _setBurnable(address contractAddress) internal {
require(_contractWhitelist[contractAddress], "provided contract is not whitelisted");
_burnList[contractAddress] = true;
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"_chainID()": "beab7131"
}
},
"abi": [
{
"inputs": [],
"name": "_chainID",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [],
"name": "_chainID",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {},
"title": "Interface for Bridge contract."
},
"userdoc": {
"methods": {
"_chainID()": {
"notice": "Exposing getter for {_chainID} instead of forcing the use of call."
}
}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/interfaces/IBridge.sol": "IBridge"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/interfaces/IBridge.sol": {
"keccak256": "0x69acbf5e85d70afb39f819efa08ff2442e8b122f35a012f6e37ed96fb35222b6",
"urls": [
"bzz-raw://02c37de0e9beefc6cf988b43980aaee9f68b2b60b34cc889aa374aeee135c13c",
"dweb:/ipfs/QmVZFyHbMq8KgMyboAspK1VK25kR2uXv6x6t6nh5dfERHF"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"deposit(bytes32,uint8,uint64,address,bytes)": "38995da9",
"executeProposal(bytes32,bytes)": "e248cff2"
}
},
"abi": [
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "destinationChainID",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "depositNonce",
"type": "uint64"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"deposit(bytes32,uint8,uint64,address,bytes)": {
"params": {
"data": "Consists of additional data needed for a specific deposit.",
"depositNonce": "This value is generated as an ID by the Bridge contract.",
"depositer": "Address of account making the deposit in the Bridge contract.",
"destinationChainID": "Chain ID deposit is expected to be bridged to."
}
},
"executeProposal(bytes32,bytes)": {
"params": {
"data": "Consists of additional data needed for a specific deposit execution."
}
}
},
"title": "Interface for handler contracts that support deposits and deposit executions."
},
"userdoc": {
"methods": {
"deposit(bytes32,uint8,uint64,address,bytes)": {
"notice": "It is intended that deposit are made using the Bridge contract."
},
"executeProposal(bytes32,bytes)": {
"notice": "It is intended that proposals are executed by the Bridge contract."
}
}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/interfaces/IDepositExecute.sol": "IDepositExecute"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/interfaces/IDepositExecute.sol": {
"keccak256": "0x0e294346387f78e5762ed8f30ef4ba23c577abc9e2dfbaeb29e97b1b5099aa35",
"urls": [
"bzz-raw://896aa03012baece6caca18cf66386717e1cd47e5700ea24f1a31589b3513d814",
"dweb:/ipfs/QmVJWiXZgEjFiZB21wsvkhHAUupNqBJ8FvZuJcB4X4NEvj"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"setBurnable(address)": "07b7ed99",
"setResource(bytes32,address)": "b8fa3736",
"withdraw(address,address,uint256)": "d9caed12"
}
},
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOrTokenID",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOrTokenID",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"setBurnable(address)": {
"params": {
"contractAddress": "Address of contract to be used when making or executing deposits."
}
},
"setResource(bytes32,address)": {
"params": {
"contractAddress": "Address of contract to be called when a deposit is made and a deposited is executed.",
"resourceID": "ResourceID to be used when making deposits."
}
},
"withdraw(address,address,uint256)": {
"params": {
"amountOrTokenID": "Either the amount of ERC20 tokens or the ERC721 token ID to release.",
"recipient": "Address to release tokens to.",
"tokenAddress": "Address of token contract to release."
}
}
},
"title": "Interface to be used with handlers that support ERC20s and ERC721s."
},
"userdoc": {
"methods": {
"setBurnable(address)": {
"notice": "Marks {contractAddress} as mintable/burnable."
},
"setResource(bytes32,address)": {
"notice": "Correlates {resourceID} with {contractAddress}."
},
"withdraw(address,address,uint256)": {
"notice": "Used to manually release funds from ERC safes."
}
}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/interfaces/IERCHandler.sol": "IERCHandler"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/interfaces/IERCHandler.sol": {
"keccak256": "0xae4a0687ed7310b0e5b1e82074b38bd492de3c14f33acf12486f7380cd523578",
"urls": [
"bzz-raw://0e4195985bfa8305ea9ca1ecd40d34023846a89f3313104e84aedb84069a2926",
"dweb:/ipfs/QmcrKQzMC6YnXRZeE8Wau4rYB815kXrFTpPWVJBkmSS4SV"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"setResource(bytes32,address,bytes4,bytes4)": "bba8185a"
}
},
"abi": [
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "bytes4",
"name": "depositFunctionSig",
"type": "bytes4"
},
{
"internalType": "bytes4",
"name": "executeFunctionSig",
"type": "bytes4"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "bytes4",
"name": "depositFunctionSig",
"type": "bytes4"
},
{
"internalType": "bytes4",
"name": "executeFunctionSig",
"type": "bytes4"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"author": "ChainSafe Systems.",
"methods": {
"setResource(bytes32,address,bytes4,bytes4)": {
"params": {
"contractAddress": "Address of contract to be called when a deposit is made and a deposited is executed.",
"depositFunctionSig": "Function signature of method to be called in {contractAddress} when a deposit is made.",
"executeFunctionSig": "Function signature of method to be called in {contractAddress} when a deposit is executed.",
"resourceID": "ResourceID to be used when making deposits."
}
}
},
"title": "Interface for handler that handles generic deposits and deposit executions."
},
"userdoc": {
"methods": {
"setResource(bytes32,address,bytes4,bytes4)": {
"notice": "Correlates {resourceID} with {contractAddress}, {depositFunctionSig}, and {executeFunctionSig}."
}
}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/interfaces/IGenericHandler.sol": "IGenericHandler"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/interfaces/IGenericHandler.sol": {
"keccak256": "0xaeb0f50bc06faa2cacce837cc232d486458c00e6891c038b36bb93c407ab626e",
"urls": [
"bzz-raw://638424b4684970cad852a437477e86b035f443f9f2dbb03a2d9f886a1488eec8",
"dweb:/ipfs/Qmcnas9wLSRaZVDdggHLRDrC5qvbh8e2NUmnoXtAtJ38Fh"
]
}
},
"version": 1
}
pragma solidity 0.6.4;
/**
@title Interface for Bridge contract.
@author ChainSafe Systems.
*/
interface IBridge {
/**
@notice Exposing getter for {_chainID} instead of forcing the use of call.
@return uint8 The {_chainID} that is currently set for the Bridge contract.
*/
function _chainID() external returns (uint8);
}
pragma solidity 0.6.4;
/**
@title Interface for handler contracts that support deposits and deposit executions.
@author ChainSafe Systems.
*/
interface IDepositExecute {
/**
@notice It is intended that deposit are made using the Bridge contract.
@param destinationChainID Chain ID deposit is expected to be bridged to.
@param depositNonce This value is generated as an ID by the Bridge contract.
@param depositer Address of account making the deposit in the Bridge contract.
@param data Consists of additional data needed for a specific deposit.
*/
function deposit(bytes32 resourceID, uint8 destinationChainID, uint64 depositNonce, address depositer, bytes calldata data) external;
/**
@notice It is intended that proposals are executed by the Bridge contract.
@param data Consists of additional data needed for a specific deposit execution.
*/
function executeProposal(bytes32 resourceID, bytes calldata data) external;
}
pragma solidity 0.6.4;
/**
@title Interface to be used with handlers that support ERC20s and ERC721s.
@author ChainSafe Systems.
*/
interface IERCHandler {
/**
@notice Correlates {resourceID} with {contractAddress}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function setResource(bytes32 resourceID, address contractAddress) external;
/**
@notice Marks {contractAddress} as mintable/burnable.
@param contractAddress Address of contract to be used when making or executing deposits.
*/
function setBurnable(address contractAddress) external;
/**
@notice Used to manually release funds from ERC safes.
@param tokenAddress Address of token contract to release.
@param recipient Address to release tokens to.
@param amountOrTokenID Either the amount of ERC20 tokens or the ERC721 token ID to release.
*/
function withdraw(address tokenAddress, address recipient, uint256 amountOrTokenID) external;
}
pragma solidity 0.6.4;
/**
@title Interface for handler that handles generic deposits and deposit executions.
@author ChainSafe Systems.
*/
interface IGenericHandler {
/**
@notice Correlates {resourceID} with {contractAddress}, {depositFunctionSig}, and {executeFunctionSig}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
@param depositFunctionSig Function signature of method to be called in {contractAddress} when a deposit is made.
@param executeFunctionSig Function signature of method to be called in {contractAddress} when a deposit is executed.
*/
function setResource(bytes32 resourceID, address contractAddress, bytes4 depositFunctionSig, bytes4 executeFunctionSig) external;
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"paused()": "5c975abb"
}
},
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"details": "Contract module which allows children to implement an emergency stop mechanism that can be triggered by an authorized account. * This is a stripped down version of Open zeppelin's Pausable contract. https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol ",
"methods": {
"constructor": {
"details": "Initializes the contract in unpaused state."
},
"paused()": {
"details": "Returns true if the contract is paused, and false otherwise."
}
}
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/utils/Pausable.sol": "Pausable"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/utils/Pausable.sol": {
"keccak256": "0xd995bcc6b4067ac18db610e47a2a969e8009cb311b017cdd34fc2b46c3be7020",
"urls": [
"bzz-raw://53e0d1dc839eb40ba23a887d302f26764eed0fe035d0e519be6a1099a1237b33",
"dweb:/ipfs/QmbMhz1VEBxhRsz6par2rKgErxFphimiCqrmCREiusVDHv"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220f48d34b3e5b2ad1001cd4d95f47e212c509d5d587e3322af594ff46ee471090f64736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL DUP14 CALLVALUE 0xB3 0xE5 0xB2 0xAD LT ADD 0xCD 0x4D SWAP6 DELEGATECALL PUSH31 0x212C509D5D587E3322AF594FF46EE471090F64736F6C634300060400330000 ",
"sourceMap": "327:893:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;327:893:0;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "6080604052600080fdfea2646970667358221220f48d34b3e5b2ad1001cd4d95f47e212c509d5d587e3322af594ff46ee471090f64736f6c63430006040033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL DUP14 CALLVALUE 0xB3 0xE5 0xB2 0xAD LT ADD 0xCD 0x4D SWAP6 DELEGATECALL PUSH31 0x212C509D5D587E3322AF594FF46EE471090F64736F6C634300060400330000 ",
"sourceMap": "327:893:0:-:0;;;12:1:-1;9;2:12"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "12600",
"executionCost": "66",
"totalCost": "12666"
},
"internal": {
"_sub(uint256,uint256,string memory)": "infinite",
"sub(uint256,uint256)": "infinite"
}
},
"methodIdentifiers": {}
},
"abi": []
}
{
"compiler": {
"version": "0.6.4+commit.1dca32f3"
},
"language": "Solidity",
"output": {
"abi": [],
"devdoc": {
"details": "Wrappers over Solidity's arithmetic operations with added overflow checks. * note that this is a stripped down version of open zeppelin's safemath https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol",
"methods": {}
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"chain-bridge-solidity/utils/SafeMath.sol": "SafeMath"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"chain-bridge-solidity/utils/SafeMath.sol": {
"keccak256": "0x0f714e07671743649ebdc961f0380ecb7b86b9572e4a43f77e18c77c015e2977",
"urls": [
"bzz-raw://d39b51548731cf4968c01ad302330697df92c297d4edace1c4c020017178264d",
"dweb:/ipfs/QmeNowPEdLsw558fStna6zoh4actw95gVXB5pU5YAoqAzg"
]
}
},
"version": 1
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This is a stripped down version of Open zeppelin's Pausable contract.
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol
*
*/
contract Pausable {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_whenNotPaused();
_;
}
function _whenNotPaused() private view {
require(!_paused, "Pausable: paused");
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenPaused() {
_whenPaused();
_;
}
function _whenPaused() private view {
require(_paused, "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(msg.sender);
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* note that this is a stripped down version of open zeppelin's safemath
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
*/
contract SafeMath {
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return _sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function _sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b506109b0806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063095ea7b31461006757806318160ddd146100cd57806323b872dd146100eb57806370a0823114610171578063a9059cbb146101c9578063dd62ed3e1461022f575b600080fd5b6100b36004803603604081101561007d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102a7565b604051808215151515815260200191505060405180910390f35b6100d5610430565b6040518082815260200191505060405180910390f35b6101576004803603606081101561010157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610436565b604051808215151515815260200191505060405180910390f35b6101b36004803603602081101561018757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106e6565b6040518082815260200191505060405180910390f35b610215600480360360408110156101df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061072f565b604051808215151515815260200191505060405180910390f35b6102916004803603604081101561024557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108ca565b6040518082815260200191505060405180910390f35b600080821415801561033657506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1561034057600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60015481565b600080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061050a83600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461095190919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061059f83600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461096890919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506105f5838261095190919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061078382600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461095190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061081882600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461096890919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282111561095d57fe5b818303905092915050565b60008082840190508381101561097a57fe5b809150509291505056fea165627a7a723058208d95708b5e38af23489309b1a62bc874235e51bce6bafa6455d321edca14cb8b0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9B0 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xCD JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xEB JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x171 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1C9 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x22F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2A7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD5 PUSH2 0x430 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x436 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6E6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x215 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x72F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x291 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x8CA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP3 EQ ISZERO DUP1 ISZERO PUSH2 0x336 JUMPI POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO JUMPDEST ISZERO PUSH2 0x340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH2 0x50A DUP4 PUSH1 0x3 PUSH1 0x0 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x951 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x59F DUP4 PUSH1 0x3 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x968 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x5F5 DUP4 DUP3 PUSH2 0x951 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x783 DUP3 PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x951 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x818 DUP3 PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x968 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x95D JUMPI INVALID JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x97A JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP14 SWAP6 PUSH17 0x8B5E38AF23489309B1A62BC874235E51BC 0xe6 0xba STATICCALL PUSH5 0x55D321EDCA EQ 0xcb DUP12 STOP 0x29 ",
"sourceMap": "9369:1926:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9369:1926:0;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100625760003560e01c8063095ea7b31461006757806318160ddd146100cd57806323b872dd146100eb57806370a0823114610171578063a9059cbb146101c9578063dd62ed3e1461022f575b600080fd5b6100b36004803603604081101561007d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102a7565b604051808215151515815260200191505060405180910390f35b6100d5610430565b6040518082815260200191505060405180910390f35b6101576004803603606081101561010157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610436565b604051808215151515815260200191505060405180910390f35b6101b36004803603602081101561018757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106e6565b6040518082815260200191505060405180910390f35b610215600480360360408110156101df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061072f565b604051808215151515815260200191505060405180910390f35b6102916004803603604081101561024557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108ca565b6040518082815260200191505060405180910390f35b600080821415801561033657506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1561034057600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60015481565b600080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061050a83600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461095190919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061059f83600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461096890919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506105f5838261095190919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061078382600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461095190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061081882600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461096890919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282111561095d57fe5b818303905092915050565b60008082840190508381101561097a57fe5b809150509291505056fea165627a7a723058208d95708b5e38af23489309b1a62bc874235e51bce6bafa6455d321edca14cb8b0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xCD JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xEB JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x171 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1C9 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x22F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2A7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD5 PUSH2 0x430 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x436 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6E6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x215 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x72F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x291 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x8CA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP3 EQ ISZERO DUP1 ISZERO PUSH2 0x336 JUMPI POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO JUMPDEST ISZERO PUSH2 0x340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH2 0x50A DUP4 PUSH1 0x3 PUSH1 0x0 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x951 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x59F DUP4 PUSH1 0x3 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x968 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x5F5 DUP4 DUP3 PUSH2 0x951 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x783 DUP3 PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x951 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x818 DUP3 PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x968 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x95D JUMPI INVALID JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x97A JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP14 SWAP6 PUSH17 0x8B5E38AF23489309B1A62BC874235E51BC 0xe6 0xba STATICCALL PUSH5 0x55D321EDCA EQ 0xcb DUP12 STOP 0x29 ",
"sourceMap": "9369:1926:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9369:1926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9978:383;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9978:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9437:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10906:387;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10906:387:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10516:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10516:113:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10637:263;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10637:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10367:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10367:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9978:383;10045:4;10153:1;10143:6;:11;;10142:53;;;;;10193:1;10160:7;:19;10168:10;10160:19;;;;;;;;;;;;;;;:29;10180:8;10160:29;;;;;;;;;;;;;;;;:34;;10142:53;10138:92;;;10211:8;;;10138:92;10272:6;10240:7;:19;10248:10;10240:19;;;;;;;;;;;;;;;:29;10260:8;10240:29;;;;;;;;;;;;;;;:38;;;;10315:8;10294:38;;10303:10;10294:38;;;10325:6;10294:38;;;;;;;;;;;;;;;;;;10350:4;10343:11;;9978:383;;;;:::o;9437:26::-;;;;:::o;10906:387::-;10988:4;11004:18;11025:7;:14;11033:5;11025:14;;;;;;;;;;;;;;;:26;11040:10;11025:26;;;;;;;;;;;;;;;;11004:47;;11080:27;11100:6;11080:8;:15;11089:5;11080:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;11062:8;:15;11071:5;11062:15;;;;;;;;;;;;;;;:45;;;;11133:25;11151:6;11133:8;:13;11142:3;11133:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;11117:8;:13;11126:3;11117:13;;;;;;;;;;;;;;;:41;;;;11198:22;11213:6;11198:10;:14;;:22;;;;:::i;:::-;11169:7;:14;11177:5;11169:14;;;;;;;;;;;;;;;:26;11184:10;11169:26;;;;;;;;;;;;;;;:51;;;;11252:3;11236:28;;11245:5;11236:28;;;11257:6;11236:28;;;;;;;;;;;;;;;;;;11282:4;11275:11;;;10906:387;;;;;:::o;10516:113::-;10572:15;10606:8;:16;10615:6;10606:16;;;;;;;;;;;;;;;;10599:23;;10516:113;;;:::o;10637:263::-;10700:4;10739:32;10764:6;10739:8;:20;10748:10;10739:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;10716:8;:20;10725:10;10716:20;;;;;;;;;;;;;;;:55;;;;10797:25;10815:6;10797:8;:13;10806:3;10797:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;10781:8;:13;10790:3;10781:13;;;;;;;;;;;;;;;:41;;;;10859:3;10838:33;;10847:10;10838:33;;;10864:6;10838:33;;;;;;;;;;;;;;;;;;10889:4;10882:11;;10637:263;;;;:::o;10367:142::-;10441:17;10477:7;:15;10485:6;10477:15;;;;;;;;;;;;;;;:25;10493:8;10477:25;;;;;;;;;;;;;;;;10470:32;;10367:142;;;;:::o;7473:120::-;7531:7;7562:1;7557;:6;;7550:14;;;;7585:1;7581;:5;7574:12;;7473:120;;;;:::o;7599:143::-;7657:7;7676:9;7692:1;7688;:5;7676:17;;7715:1;7710;:6;;7703:14;;;;7734:1;7727:8;;;7599:143;;;;:::o"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "496000",
"executionCost": "530",
"totalCost": "496530"
},
"external": {
"allowance(address,address)": "809",
"approve(address,uint256)": "22788",
"balanceOf(address)": "640",
"totalSupply()": "405",
"transfer(address,uint256)": "infinite",
"transferFrom(address,address,uint256)": "infinite"
}
},
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb",
"transferFrom(address,address,uint256)": "23b872dd"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_from",
"type": "address"
},
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
},
{
"name": "_spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "remaining",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "owner",
"type": "address"
},
{
"indexed": true,
"name": "spender",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_from",
"type": "address"
},
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
},
{
"name": "_spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "remaining",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "owner",
"type": "address"
},
{
"indexed": true,
"name": "spender",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
}
],
"devdoc": {
"methods": {
"approve(address,uint256)": {
"details": "Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.",
"params": {
"_spender": "address The address which will spend the funds.",
"_value": "uint256 The amount of tokens to be spent."
}
}
},
"title": "Basic ERC20 token contract implementation."
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"contracts/Mltitoken.sol": "BasicToken"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/Mltitoken.sol": {
"keccak256": "0xc129c1b3a6f3ba6a2bbd622c14b0bcf2e01fadb34a70d643e962403f6dac2160",
"urls": [
"bzzr://4fbc4edc88a06484b1983def3326976c854df7d5a1f19b680dd283c76a7d12df"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb",
"transferFrom(address,address,uint256)": "23b872dd"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_from",
"type": "address"
},
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
},
{
"name": "_spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "remaining",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "_from",
"type": "address"
},
{
"indexed": true,
"name": "_to",
"type": "address"
},
{
"indexed": false,
"name": "_value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "_owner",
"type": "address"
},
{
"indexed": true,
"name": "_spender",
"type": "address"
},
{
"indexed": false,
"name": "_value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_from",
"type": "address"
},
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
},
{
"name": "_spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "remaining",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "_from",
"type": "address"
},
{
"indexed": true,
"name": "_to",
"type": "address"
},
{
"indexed": false,
"name": "_value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "_owner",
"type": "address"
},
{
"indexed": true,
"name": "_spender",
"type": "address"
},
{
"indexed": false,
"name": "_value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"contracts/Mltitoken.sol": "ERC20"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/Mltitoken.sol": {
"keccak256": "0xc129c1b3a6f3ba6a2bbd622c14b0bcf2e01fadb34a70d643e962403f6dac2160",
"urls": [
"bzzr://4fbc4edc88a06484b1983def3326976c854df7d5a1f19b680dd283c76a7d12df"
]
}
},
"version": 1
}
// Copyright (c) 2017-2019 Curvegrid Inc.
/// @title MltiToken is a test contract for the ERC20 token standard
/// @author Curvegrid Inc.
/// @notice THIS IS A TEST CONTRACT AND SHOULD NOT BE USED FOR PRODUCTION PURPOSES. See provided user documentation for more information.
// This is a flattened version of the contract
pragma solidity >=0.5.7;
/* @dev ERC Token Standard #20 Interface (https://github.com/ethereum/EIPs/issues/20)
*/
contract ERC20 {
//Use original ERC20 totalSupply function instead of public variable since
//we are mapping the functions for upgradeability
uint256 public totalSupply;
function balanceOf(address _owner) public view returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public view returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
// Copyright (c) 2017 Curvegrid Inc.
/// @title OfflineSecret
/// @dev The OfflineSecret contract provide functionality to verify and ensure a caller
/// provides a valid secret that was exchanged offline. It offers an additional level of verification
/// for sensitive contract operations.
contract OfflineSecret {
/// @dev Modifier that requires a provided plaintext match a previously stored hash
modifier validSecret(address to, string memory secret, bytes32 hashed) {
require(checkSecret(to, secret, hashed));
_;
}
/// @dev Generate a hash from the provided plaintext. A pure function so can (should) be
/// run off-chain.
/// @param to address The recipient address, as a salt.
/// @param secret string The secret to hash.
function generateHash(address to, string memory secret) public pure returns(bytes32 hashed) {
return keccak256(abi.encodePacked(to, secret));
}
/// @dev Check whether a provided plaintext secret hashes to a provided hash. A pure
/// function so can (should) be run off-chain.
/// @param to address The recipient address, as a salt.
/// @param secret string The secret to hash.
/// @param hashed string The hash to check the secret against.
function checkSecret(address to, string memory secret, bytes32 hashed) public pure returns(bool valid) {
if (hashed == keccak256(abi.encodePacked(to, secret))) {
return true;
}
return false;
}
}
// Copyright (c) 2017 Curvegrid Inc.
/// @title Ownable
/// @dev The Ownable contract has an owner address, and provides basic authorization control functions, this simplifies
/// and the implementation of "user permissions".
contract OwnableWithFoundation is OfflineSecret {
address public owner;
address public newOwnerCandidate;
address public foundation;
address public newFoundationCandidate;
bytes32 public ownerHashed;
bytes32 public foundationHashed;
event OwnershipRequested(address indexed by, address indexed to, bytes32 hashed);
event OwnershipTransferred(address indexed from, address indexed to);
event FoundationRequested(address indexed by, address indexed to, bytes32 hashed);
event FoundationTransferred(address indexed from, address indexed to);
/// @dev The Ownable constructor sets the original `owner` of the contract to the sender
/// account.
constructor(address _owner) public {
foundation = msg.sender;
owner = _owner;
}
/// @dev Reverts if called by any account other than the owner.
modifier onlyOwner() {
if (msg.sender != owner) {
revert();
}
_;
}
modifier onlyOwnerCandidate() {
if (msg.sender != newOwnerCandidate) {
revert();
}
_;
}
/// @dev Reverts if called by any account other than the foundation.
modifier onlyFoundation() {
if (msg.sender != foundation) {
revert();
}
_;
}
modifier onlyFoundationCandidate() {
if (msg.sender != newFoundationCandidate) {
revert();
}
_;
}
/// @dev Proposes to transfer control of the contract to a newOwnerCandidate.
/// @param _newOwnerCandidate address The address to transfer ownership to.
/// @param _ownerHashed string The hashed secret to use as protection.
function requestOwnershipTransfer(
address _newOwnerCandidate,
bytes32 _ownerHashed)
external
onlyFoundation
{
require(_newOwnerCandidate != address(0));
require(_newOwnerCandidate != owner);
newOwnerCandidate = _newOwnerCandidate;
ownerHashed = _ownerHashed;
emit OwnershipRequested(msg.sender, newOwnerCandidate, ownerHashed);
}
/// @dev Accept ownership transfer. This method needs to be called by the previously proposed owner.
/// @param _ownerSecret string The secret to check against the hash.
function acceptOwnership(
string calldata _ownerSecret)
external
onlyOwnerCandidate
validSecret(newOwnerCandidate, _ownerSecret, ownerHashed)
{
address previousOwner = owner;
owner = newOwnerCandidate;
newOwnerCandidate = address(0);
emit OwnershipTransferred(previousOwner, owner);
}
/// @dev Proposes to transfer control of the contract to a newFoundationCandidate.
/// @param _newFoundationCandidate address The address to transfer oversight to.
/// @param _foundationHashed string The hashed secret to use as protection.
function requestFoundationTransfer(
address _newFoundationCandidate,
bytes32 _foundationHashed)
external
onlyFoundation
{
require(_newFoundationCandidate != address(0));
require(_newFoundationCandidate != foundation);
newFoundationCandidate = _newFoundationCandidate;
foundationHashed = _foundationHashed;
emit FoundationRequested(msg.sender, newFoundationCandidate, foundationHashed);
}
/// @dev Accept foundation transfer. This method needs to be called by the previously proposed foundation.
/// @param _foundationSecret string The secret to check against the hash.
function acceptFoundation(
string calldata _foundationSecret)
external
onlyFoundationCandidate
validSecret(newFoundationCandidate, _foundationSecret, foundationHashed)
{
address previousFoundation = foundation;
foundation = newFoundationCandidate;
newFoundationCandidate = address(0);
emit FoundationTransferred(previousFoundation, foundation);
}
}
/* @dev Math operations with safety checks
*/
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
function max64(uint64 a, uint64 b) internal pure returns (uint64) {
return a >= b ? a : b;
}
function min64(uint64 a, uint64 b) internal pure returns (uint64) {
return a < b ? a : b;
}
function max256(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function min256(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
}
// Copyright (c) 2017 Curvegrid Inc.
/**
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
*/
contract Pausable is OwnableWithFoundation {
event Pause();
event Unpause();
bool public paused = false;
constructor(address _owner) public OwnableWithFoundation(_owner) {
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused);
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(paused);
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() public onlyOwner whenNotPaused {
paused = true;
emit Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() public onlyOwner whenPaused {
paused = false;
emit Unpause();
}
}
/// @title Basic ERC20 token contract implementation.
/* @dev Kin's BasicToken based on OpenZeppelin's StandardToken.
*/
contract BasicToken is ERC20 {
using SafeMath for uint256;
uint256 public totalSupply;
mapping (address => mapping (address => uint256)) allowed;
mapping (address => uint256) balances;
event Approval(address indexed owner, address indexed spender, uint256 value);
event Transfer(address indexed from, address indexed to, uint256 value);
/// @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
/// @param _spender address The address which will spend the funds.
/// @param _value uint256 The amount of tokens to be spent.
function approve(address _spender, uint256 _value) public returns (bool) {
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) {
revert();
}
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
function transfer(address _to, uint256 _value) public returns (bool) {
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
uint256 _allowance = allowed[_from][msg.sender];
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = _allowance.sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
}
// Copyright (c) 2017 Curvegrid Inc.
/**
* @dev ERC Token Standard #20 Interface (https://github.com/ethereum/EIPs/issues/20)
* MltiToken is the main contract for the MultiBaas platform.
*/
contract MltiToken is BasicToken, Pausable {
using SafeMath for uint256;
string public name;
string public symbol;
uint8 public decimals;
address theCoin = address(this);
// Hashed secrets required to unlock coins transferred from one address to another address
struct ProtectedBalanceStruct {
uint256 balance;
bytes32 hashed;
}
mapping (address => mapping (address => ProtectedBalanceStruct)) protectedBalances;
uint256 public protectedSupply;
// constructor passes owner (Mint) down to Pausable() => OwnableWithFoundation()
constructor(address _owner, string memory _name, string memory _symbol, uint8 _decimals) public Pausable(_owner) {
require(bytes(_name).length > 0, "Must provide a name");
require(bytes(_symbol).length > 0, "Must provide a symbol");
name = _name;
symbol = _symbol;
decimals = _decimals;
}
event Mint(address indexed minter, address indexed receiver, uint256 value);
event ProtectedTransfer(address indexed from, address indexed to, uint256 value, bytes32 hashed);
event ProtectedUnlock(address indexed from, address indexed to, uint256 value);
event ProtectedReclaim(address indexed from, address indexed to, uint256 value);
event Burn(address indexed burner, uint256 value);
/// @dev Transfer token to this contract, which is shorthand for the owner (Mint).
/// Avoids race conditions in cases where the owner has changed just before a
/// transfer is called.
/// @param _value uint256 The amount to be transferred.
function transferToMint(uint256 _value) external whenNotPaused returns (bool) {
return transfer(theCoin, _value);
}
/// @dev Approve this contract, proxy for owner (Mint), to spend the specified amount of tokens
/// on behalf of msg.sender. Avoids race conditions in cases where the owner has changed
/// just before an approve is called.
/// @param _value uint256 The amount of tokens to be spent.
function approveToMint(uint256 _value) external whenNotPaused returns (bool) {
return approve(theCoin, _value);
}
/// @dev Protected transfer tokens to this contract, which is shorthand for the owner (Mint).
/// Avoids race conditions in cases where the owner has changed just before a
/// transfer is called.
/// @param _value uint256 The amount to be transferred.
/// @param _hashed string The hashed secret to use as protection.
function protectedTransferToMint(uint256 _value, bytes32 _hashed) external whenNotPaused returns (bool) {
return protectedTransfer(theCoin, _value, _hashed);
}
/// @dev Transfer tokens from an address to this contract, a proxy for the owner (Mint).
/// Subject to pre-approval from the address. Avoids race conditions in cases where the owner has changed
/// just before an approve is called.
/// @param _from address The address which you want to send tokens from.
/// @param _value uint256 the amount of tokens to be transferred.
function withdrawByMint(address _from, uint256 _value) external onlyOwner whenNotPaused returns (bool) {
// retrieve allowance
uint256 _allowance = allowed[_from][theCoin];
// adjust balances
balances[_from] = balances[_from].sub(_value);
balances[theCoin] = balances[theCoin].add(_value);
// adjust allowance
allowed[_from][theCoin] = _allowance.sub(_value);
emit Transfer(_from, theCoin, _value);
return true;
}
/// @dev Creates a specific amount of tokens and credits them to the Mint.
/// @param _amount uint256 Amount tokens to mint.
function mint(uint256 _amount) external onlyOwner whenNotPaused {
require(_amount > 0);
totalSupply = totalSupply.add(_amount);
balances[msg.sender] = balances[msg.sender].add(_amount);
emit Mint(msg.sender, msg.sender, _amount);
// optional in ERC-20 standard, but required by Etherscan
emit Transfer(address(0), msg.sender, _amount);
}
/// @dev Retrieve the protected balance and hashed passphrase for a pending protected transfer.
/// @param _from address The address transferred from.
/// @param _to address The address transferred to.
function protectedBalance(address _from, address _to) public view returns (uint256 balance, bytes32 hashed) {
return(protectedBalances[_from][_to].balance, protectedBalances[_from][_to].hashed);
}
/// @dev Transfer tokens to a specified address protected by a secret.
/// @param _to address The address to transfer to.
/// @param _value uint256 The amount to be transferred.
/// @param _hashed string The hashed secret to use as protection.
function protectedTransfer(address _to, uint256 _value, bytes32 _hashed) public whenNotPaused returns (bool) {
require(_value > 0);
// "transfers" to address(0) should only be by the burn() function
require(_to != address(0));
// explicitly disallow tranfer to the owner, as it's automatically translated into the coin
// in protectedUnlock() and protectedReclaim()
require(_to != owner);
address from = msg.sender;
// special case: msg.sender is the owner (Mint)
if (msg.sender == owner) {
from = theCoin;
// ensure Mint is actually holding this supply; not required below because of revert in .sub()
require(balances[theCoin].sub(protectedSupply) >= _value);
} else {
// otherwise, adjust the balances: transfer the tokens to the Mint to have them held in escrow
balances[from] = balances[from].sub(_value);
balances[theCoin] = balances[theCoin].add(_value);
}
// protected balance must be zero (unlocked or reclaimed in its entirety)
// avoid a situation similar to: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
if (protectedBalances[from][_to].balance != 0) {
revert();
}
// disallow reusing the previous secret
// (not intended to prevent reuse of an N-x, x > 1 secret)
require(protectedBalances[from][_to].hashed != _hashed);
// set the protected balance and hashed value
protectedBalances[from][_to].balance = _value;
protectedBalances[from][_to].hashed = _hashed;
// adjust the protected supply
protectedSupply = protectedSupply.add(_value);
emit ProtectedTransfer(from, _to, _value, _hashed);
return true;
}
/// @dev Unlock protected tokens from an address.
/// @param _from address The address to transfer from.
/// @param _value uint256 The amount to be transferred.
/// @param _secret string The secret phrase protecting the tokens.
function protectedUnlock(address _from, uint256 _value, string calldata _secret) external whenNotPaused returns (bool) {
address to = msg.sender;
// special case: msg.sender is the owner (Mint)
if (msg.sender == owner) {
to = theCoin;
}
// validate secret against hash
require(checkSecret(to, _secret, protectedBalances[_from][to].hashed));
// must transfer all protected tokens at once as secret will have been leaked on the blockchain
require(protectedBalances[_from][to].balance == _value);
// adjust the balances: the Mint is holding the tokens in escrow
balances[theCoin] = balances[theCoin].sub(_value);
balances[to] = balances[to].add(_value);
// adjust the protected balances and protected supply
protectedBalances[_from][to].balance = 0;
protectedSupply = protectedSupply.sub(_value);
emit ProtectedUnlock(_from, to, _value);
emit Transfer(_from, to, _value);
return true;
}
/// @dev Reclaim protected tokens granted to a specified address.
/// @param _to address The address to the tokens were granted to.
/// @param _value uint256 The amount to be transferred.
function protectedReclaim(address _to, uint256 _value) external whenNotPaused returns (bool) {
address from = msg.sender;
// special case: msg.sender is the owner (Mint)
if (msg.sender == owner) {
from = theCoin;
} else {
// otherwise, adjust the balances: transfer the tokens to the sender from the Mint, which was holding them in escrow
balances[theCoin] = balances[theCoin].sub(_value);
balances[from] = balances[from].add(_value);
}
// must transfer all protected tokens at once
require(protectedBalances[from][_to].balance == _value);
// adjust the protected balances and protected supply
protectedBalances[from][_to].balance = 0;
protectedSupply = protectedSupply.sub(_value);
emit ProtectedReclaim(from, _to, _value);
return true;
}
/// @dev Destroys (removes from supply) a specific amount of tokens.
/// @param _amount uint256 The amount of tokens to be burned.
function burn(uint256 _amount) external onlyOwner whenNotPaused {
// The Mint is the owner of this contract. In this implementation, the
// address of this contract (proxy for owner's account) is used to control
// the money supply. Avoids the problem of having to transfer balances on owner change.
require(_amount > 0);
require(_amount <= balances[msg.sender]); // account for protected balances
// adjust the balances and supply
balances[msg.sender] = balances[msg.sender].sub(_amount);
totalSupply = totalSupply.sub(_amount);
// not part of the ERC-20 standard, but required by Etherscan
emit Transfer(msg.sender, address(0), _amount);
emit Burn(msg.sender, _amount);
}
/// @dev ERC20 behaviour but revert if paused
/// @param _spender address The address which will spend the funds.
/// @param _value uint256 The amount of tokens to be spent.
function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) {
return super.approve(_spender, _value);
}
/// @dev ERC20 behaviour but revert if paused
/// @param _owner address The address which owns the funds.
/// @param _spender address The address which will spend the funds.
/// @return uint256 specifying the amount of tokens still available for the spender.
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return super.allowance(_owner, _spender);
}
/// @dev ERC20 behaviour but revert if paused
/// @param _to address The address to transfer to.
/// @param _value uint256 The amount to be transferred.
function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) {
// "transfers" to address(0) should only be by the burn() function
require(_to != address(0));
return super.transfer(_to, _value);
}
/// @dev ERC20 behaviour but revert if paused
/// @param _from address The address which you want to send tokens from.
/// @param _to address The address which you want to transfer to.
/// @param _value uint256 the amount of tokens to be transferred.
function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) {
// "transfers" to address(0) should only be by the burn() function
require(_to != address(0));
// special case: _from is the Mint
// note: within the current MultiBaas Token design, should never encounter this case
if (_from == theCoin) {
// ensure Mint is not exceeding its balance less protected supply
require(_value <= balances[theCoin].sub(protectedSupply));
}
return super.transferFrom(_from, _to, _value);
}
}
This file has been truncated, but you can view the full file.
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "60806040526000600a60006101000a81548160ff02191690831515021790555030600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006d57600080fd5b506040516200408238038062004082833981018060405260808110156200009357600080fd5b81019080805190602001909291908051640100000000811115620000b657600080fd5b82810190506020810184811115620000cd57600080fd5b8151856001820283011164010000000082111715620000eb57600080fd5b505092919060200180516401000000008111156200010857600080fd5b828101905060208101848111156200011f57600080fd5b81518560018202830111640100000000821117156200013d57600080fd5b505092919060200180519060200190929190505050838033600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050600083511162000250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d7573742070726f766964652061206e616d650000000000000000000000000081525060200191505060405180910390fd5b6000825111620002c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d7573742070726f7669646520612073796d626f6c000000000000000000000081525060200191505060405180910390fd5b82600b9080519060200190620002e09291906200031f565b5081600c9080519060200190620002f99291906200031f565b5080600d60006101000a81548160ff021916908360ff16021790555050505050620003ce565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200036257805160ff191683800117855562000393565b8280016001018555821562000393579182015b828111156200039257825182559160200191906001019062000375565b5b509050620003a29190620003a6565b5090565b620003cb91905b80821115620003c7576000816000905550600101620003ad565b5090565b90565b613ca480620003de6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80635e91ba2111610125578063a9059cbb116100ad578063d091b5501161007c578063d091b55014610cc1578063dd62ed3e14610d0b578063f74a4e6314610d83578063fc882dff14610dc9578063ff83f56214610de757610211565b8063a9059cbb14610b24578063c43b
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment