Token migration announcement. AurusSILVER token has been renamed to tSILVER and the contract has migrated to a new address.
ERC-20
Overview
Max Total Supply
1,132,127.580282958199357 AWS
Holders
86 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
426.458294641791162981 AWSValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AWS
Compiler Version
v0.5.4+commit.9549d8ff
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-15 */ // File: openzeppelin-solidity/contracts/access/Roles.sol pragma solidity 0.5.4; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: contracts/roles/BurnerRole.sol /** * @title Burner Role * @dev Follows the openzeppelin's guidelines of working with roles. * @dev Derived contracts must implement the `addBurner` and the `removeBurner` functions. */ contract BurnerRole { using Roles for Roles.Role; Roles.Role private _burners; /** * @notice Fired when a new role is added. */ event BurnerAdded(address indexed account); /** * @notice Fired when a new role is added. */ event BurnerRemoved(address indexed account); /** * @dev The role is granted to the deployer. */ constructor () internal { _addBurner(msg.sender); } /** * @dev Callers must have the role. */ modifier onlyBurner() { require(isBurner(msg.sender), "BurnerRole: caller does not have the Burner role"); _; } /** * @dev The role is removed for the caller. */ function renounceBurner() public { _removeBurner(msg.sender); } /** * @dev Checks if @param account has the role. */ function isBurner(address account) public view returns (bool) { return _burners.has(account); } /** * @dev Assigns the role to @param account. */ function _addBurner(address account) internal { _burners.add(account); emit BurnerAdded(account); } /** * @dev Removes the role from @param account. */ function _removeBurner(address account) internal { _burners.remove(account); emit BurnerRemoved(account); } } // File: contracts/roles/MinterRole.sol /** * @title Minter Role * @dev Follows the openzeppelin's guidelines of working with roles. * @dev Derived contracts must implement the `addMinter` and the `removeMinter` functions. */ contract MinterRole { using Roles for Roles.Role; Roles.Role private _minters; /** * @notice Fired when a new role is added. */ event MinterAdded(address indexed account); /** * @notice Fired when a new role is added. */ event MinterRemoved(address indexed account); /** * @dev The role is granted to the deployer. */ constructor () internal { _addMinter(msg.sender); } /** * @dev Callers must have the role. */ modifier onlyMinter() { require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); _; } /** * @dev The role is removed for the caller. */ function renounceMinter() public { _removeMinter(msg.sender); } /** * @dev Checks if @param account has the role. */ function isMinter(address account) public view returns (bool) { return _minters.has(account); } /** * @dev Assigns the role to @param account. */ function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } /** * @dev Removes the role from @param account. */ function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ 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. * * > 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); /** * @dev Emitted when the `owner` initiates a force transfer * * Note that `value` may be zero. * Note that `details` may be zero. */ event ForceTransfer(address indexed from, address indexed to, uint256 value, bytes32 details); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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-solidity/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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); 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) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Fee.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 `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * 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 ERC20Fee is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; /** * @dev List of whitelisted accounts. * 0 = default (initial value for all accounts) * 1 = verified account * 2 = partner account * 3 = blacklisted account (cannot send or receive tokens) */ mapping (address => uint8) public whitelist; /** * @dev The timestamp when the fee starts. */ uint256 public feeStartTimestamp; /** * @dev List of daily storage fees in order of account level (0 to 2). Value is in mpip (milipip or 1/1000 of a PIP) per day (24 hours) per amount. */ uint[] public dailyStorageFee = [uint32(0), uint32(0), uint32(0)]; /** * @dev List of fixed transfer fees in order of account level (0 to 2). Value is in wei. */ uint[] public fixedTransferFee = [uint32(0), uint32(0), uint32(0)]; /** * @dev List of dynamic transfer fees in order of account level (0 to 2). Value is in mpip (milipip or 1/1000 of a PIP) per amount transferred. */ uint[] public dynamicTransferFee = [uint32(0), uint32(0), uint32(0)]; /** * @dev Minting fee in mpip (milipip or 1/1000 of a PIP) per amount. */ uint256 public mintingFee = 0; /** * @dev Constant mpip divider */ uint256 private constant mpipDivider = 10000000; /** * @dev Account mapping for last day of paid storage fees. */ mapping (address => uint256) public storageFees; /** * @dev The account that receives the fees (minting, storage and transfer). */ address public feeManager; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev Returns the current storage day. */ function getStorageDay() public view returns (uint256) { return (block.timestamp - feeStartTimestamp).div(86400); } /** * @dev Forced transfer from one account to another. Will contain details about AML procedure. */ function _forceTransfer(address sender, address recipient, uint256 amount, bytes32 details) internal { _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); emit ForceTransfer(sender, recipient, amount, details); } /** * @dev Calculate the storage fees for an account. */ function calculateStorageFees(address account) public view returns (uint256) { return (((getStorageDay().sub(storageFees[account])).mul(_balances[account])).mul(dailyStorageFee[whitelist[account]])).div(mpipDivider); } /** * @dev Retrieve the storage fees for an account. */ function _retrieveStorageFee(address account) internal { uint256 storageFee = calculateStorageFees(account); storageFees[account] = getStorageDay(); if (storageFee > 0) { _transfer(account,feeManager,storageFee); } } /** * @dev Retrieve the storage fees for an account. */ function _resetStorageFee(address account) internal { storageFees[account] = getStorageDay(); } /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); 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 `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(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 returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][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 returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); uint8 level = whitelist[sender]; require(level != 3, "Sender is blacklisted"); uint256 senderFee = calculateStorageFees(sender) + fixedTransferFee[level] + ((dynamicTransferFee[level].mul(amount)).div(mpipDivider)); uint256 receiverStorageFee = calculateStorageFees(recipient); uint256 totalFee = senderFee.add(receiverStorageFee); _balances[sender] = (_balances[sender].sub(amount)).sub(senderFee); _balances[recipient] = (_balances[recipient].add(amount)).sub(receiverStorageFee); storageFees[sender] = getStorageDay(); storageFees[recipient] = getStorageDay(); emit Transfer(sender, recipient, amount); if (totalFee > 0) { _balances[feeManager] = _balances[feeManager].add(totalFee); emit Transfer(sender, feeManager, senderFee); emit Transfer(recipient, feeManager, receiverStorageFee); (bool success, ) = feeManager.call(abi.encodeWithSignature("processFee(uint256)",totalFee)); require(success, "Fee Manager is not responding."); } } /** @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 { require(account != address(0), "ERC20: mint to the zero address"); uint256 mintingFeeAmount = amount.mul(mintingFee).div(mpipDivider); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount).sub(mintingFeeAmount); emit Transfer(address(0), account, (amount.sub(mintingFeeAmount))); if (mintingFeeAmount > 0) { _balances[feeManager] = _balances[feeManager].add(mintingFeeAmount); emit Transfer(address(0), feeManager, mintingFeeAmount); (bool success, ) = feeManager.call(abi.encodeWithSignature("processFee(uint256)",mintingFeeAmount)); require(success, "Fee Manager is not responding."); } } /** * @dev Destoys `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 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is 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 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See `_burn` and `_approve`. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); } } // File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol contract PauserRole { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } // File: openzeppelin-solidity/contracts/lifecycle/Pausable.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. */ contract Pausable is PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ 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. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(msg.sender); } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20StorageFee.sol /** * @title Pausable token * @dev ERC20 modified with pausable transfers. */ contract ERC20StorageFee is ERC20Fee, Pausable { function transfer(address to, uint256 value) public whenNotPaused returns (bool) { return super.transfer(to, value); } function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) { return super.transferFrom(from, to, value); } function approve(address spender, uint256 value) public whenNotPaused returns (bool) { return super.approve(spender, value); } function increaseAllowance(address spender, uint addedValue) public whenNotPaused returns (bool) { return super.increaseAllowance(spender, addedValue); } function decreaseAllowance(address spender, uint subtractedValue) public whenNotPaused returns (bool) { return super.decreaseAllowance(spender, subtractedValue); } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * > Note: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/IToken.sol /** * @title Token Interface * @dev Exposes token functionality */ interface IToken { function burn(uint256 amount) external ; function mint(address account, uint256 amount) external ; } // File: contracts/token/ECRecovery.sol /** * @title Eliptic curve signature operations * @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d * TODO Remove this library once solidity supports passing a signature to ecrecover. * See https://github.com/ethereum/solidity/issues/864 */ library ECRecovery { /** * @dev Recover signer address from a message by using their signature * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address. * @param sig bytes signature, the signature is generated using web3.eth.sign() */ function recover(bytes32 hash, bytes memory sig) internal pure returns (address) { bytes32 r; bytes32 s; uint8 v; // Check the signature length if (sig.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solium-disable-next-line security/no-inline-assembly assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } // If the version is correct return the signer address if (v != 27 && v != 28) { return (address(0)); } else { // solium-disable-next-line arg-overflow return ecrecover(hash, v, r, s); } } /** * toEthSignedMessageHash * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:" * and hash the result */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } } // File: contracts/token/Feeless.sol /** * @title Feeless * @dev Usage: Used as an extension in contracts that want to execute feeless functions. * @dev Usage: Apply the feeless modifier. * @dev Based on https://github.com/bitclave/Feeless */ contract Feeless { /** * @dev The replacement for msg.sender on functions that use the feeless modifier. */ address internal msgSender; /** * @dev Mimics the blockchain nonce relative to this contract (or contract that extents). */ mapping(address => uint256) public nonces; /** * @dev Holds reference to the initial signer of the transaction in the msgSender variable. * @dev After execution the variable is reset. */ modifier feeless() { if (msgSender == address(0)) { msgSender = msg.sender; _; msgSender = address(0); } else { _; } } struct CallResult { bool success; bytes payload; } /// @notice Only the certSign owner can call this function. /// @dev Signed transactions are passed to this function. function performFeelessTransaction( address sender, address target, bytes memory data, uint256 nonce, bytes memory sig) public payable { require(address(this) == target, "Feeless: Target should be the extended contract"); bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 hash = keccak256(abi.encodePacked(prefix, keccak256(abi.encodePacked(target, data, nonce)))); msgSender = ECRecovery.recover(hash, sig); require(msgSender == sender, "Feeless: Unexpected sender"); require(nonces[msgSender]++ == nonce, "Feeless: nonce does not comply"); (bool _success, bytes memory _payload) = target.call.value(msg.value)(data); CallResult memory callResult = CallResult(_success, _payload); require(callResult.success, "Feeless: Call failed"); msgSender = address(0); } } // File: contracts/token/AWS.sol /** * @title AWS Token * @notice ERC20 token implementation. * @dev Implements mintable, burnable and pausable token interfaces. */ contract AWS is ERC20StorageFee, MinterRole, BurnerRole, Ownable, Feeless, IToken { /** * @dev Fired when a feeless transfer has been executed. */ event TransferFeeless(address indexed account, uint256 indexed value); /** * @dev Fired when a feeless approve has been executed. */ event ApproveFeeless(address indexed spender, uint256 indexed value); /** * @notice ERC20 convention. */ uint8 public constant decimals = 18; /** * @notice ERC20 convention. */ string public constant name = "AurusSILVER"; /** * @notice ERC20 convention. */ string public constant symbol = "AWS"; /** * @dev Flag to indicate that the migration from old token has stopped. */ bool private _migrationOpen = true; constructor() public { feeStartTimestamp = block.timestamp; } /** * @dev Stop migration by setting flag. */ function stopMigration() public onlyOwner { _migrationOpen = false; } /** * @dev Check if migration is open. */ modifier whenMigration() { require(_migrationOpen, "Migration: stopped"); _; } /** * @dev Force a transfer between 2 accounts. AML logs on https://aurus.io/aml */ function forceTransfer(address sender, address recipient, uint256 amount, bytes32 details) external onlyOwner { _forceTransfer(sender,recipient,amount,details); } /** * @dev Set the whitelisting level for an account. */ function whitelistAddress(address account, uint8 level) external onlyOwner { require(level<=3, "Level: Please use level 0 to 3."); whitelist[account] = level; } /** * @dev Set the fees in the system. All the fees are in mpip, except fixedTransferFee that is in wei. Level is between 0 and 2 */ function setFees(uint256 _dailyStorageFee, uint256 _fixedTransferFee, uint256 _dynamicTransferFee, uint256 _mintingFee, uint8 level) external onlyOwner { require(level<=2, "Level: Please use level 0 to 2."); dailyStorageFee[level] = _dailyStorageFee; fixedTransferFee[level] = _fixedTransferFee; dynamicTransferFee[level] = _dynamicTransferFee; mintingFee = _mintingFee; } /** * @dev Set the address where the fees are forwarded. */ function setFeeManager(address account) external onlyOwner { (bool success, ) = feeManager.call(abi.encodeWithSignature("processFee(uint256)",0)); require(success); feeManager = account; } /** * @dev Function called by the owner to force an account to pay storage fee to date. */ function retrieveStorageFee(address account) external onlyOwner { _retrieveStorageFee(account); } /** * @dev Function called by the owner to reset storage fees for selected accounts. */ function resetStorageFees(address[] calldata _accounts) external onlyOwner { for (uint i=0; i<_accounts.length; i++) { _resetStorageFee(_accounts[i]); } } /** * @dev See `MinterRole._addMinter`. */ function addMinter(address account) external onlyOwner { _addMinter(account); } /** * @dev See `MinterRole._removeMinter`. */ function removeMinter(address account) external onlyOwner { _removeMinter(account); } /** * @dev See `BurnerRole._addBurner`. */ function addBurner(address account) external onlyOwner { _addBurner(account); } /** * @dev See `BurnerRole._removeBurner`. */ function removeBurner(address account) external onlyOwner { _removeBurner(account); } /** * @notice The caller must have the `BurnerRole`. * @dev See `ERC20._burn`. */ function burn(uint256 amount) external onlyBurner { _burn(msg.sender, amount); } /** * @notice The caller must have the `MinterRole`. * @dev See `ERC20._mint`. */ function mint(address account, uint256 amount) external onlyMinter { _mint(account, amount); } /** * @notice Feeless ERC20 transfer. */ function transferFeeless(address account, uint256 value) feeless whenNotPaused external { _transfer(msgSender, account, value); emit TransferFeeless(account, value); } /** * @notice Feeless ERC20 transfer. */ function approveFeeless(address spender, uint256 value) feeless whenNotPaused external { _approve(msgSender, spender, value); emit ApproveFeeless(spender, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dynamicTransferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"calculateStorageFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"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":"_accounts","type":"address[]"}],"name":"resetStorageFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"","type":"address"}],"name":"storageFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStorageDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isBurner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"setFeeManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"target","type":"address"},{"name":"data","type":"bytes"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"}],"name":"performFeelessTransaction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approveFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dailyStorageFee","type":"uint256"},{"name":"_fixedTransferFee","type":"uint256"},{"name":"_dynamicTransferFee","type":"uint256"},{"name":"_mintingFee","type":"uint256"},{"name":"level","type":"uint8"}],"name":"setFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"level","type":"uint8"}],"name":"whitelistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nonces","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dailyStorageFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fixedTransferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"retrieveStorageFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeStartTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"details","type":"bytes32"}],"name":"forceTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"stopMigration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":true,"name":"value","type":"uint256"}],"name":"TransferFeeless","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"spender","type":"address"},{"indexed":true,"name":"value","type":"uint256"}],"name":"ApproveFeeless","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","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"},{"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"},{"indexed":false,"name":"details","type":"bytes32"}],"name":"ForceTransfer","type":"event"}]
Contract Creation Code
6080604052606060405190810160405280600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff1681525060039060036200005992919062000577565b50606060405190810160405280600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152506004906003620000af92919062000577565b50606060405190810160405280600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff168152602001600063ffffffff1663ffffffff1681525060059060036200010592919062000577565b5060006006556001601260006101000a81548160ff0219169083151502179055503480156200013357600080fd5b506200014e3362000268640100000000026401000000009004565b6000600c60006101000a81548160ff0219169083151502179055506200018333620002d2640100000000026401000000009004565b6200019d336200033c640100000000026401000000009004565b33600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a342600281905550620005f9565b6200028c81600b620003a66401000000000262005609179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b620002f681600d620003a66401000000000262005609179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6200036081600e620003a66401000000000262005609179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b620003c1828262000495640100000000026401000000009004565b15151562000437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151562000520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062005f2f6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054828255906000526020600020908101928215620005be579160200282015b82811115620005bd578251829063ffffffff1690559160200191906001019062000598565b5b509050620005cd9190620005d1565b5090565b620005f691905b80821115620005f2576000816000905550600101620005d8565b5090565b90565b61592680620006096000396000f3fe60806040526004361061031c576000357c0100000000000000000000000000000000000000000000000000000000900480636ef8d66d116101ad5780639b19251a116100f9578063d0fb0203116100b2578063e19a7bc81161008c578063e19a7bc814611445578063e9ec9e8b1461145c578063f2fde38b14611473578063f44637ba146114c45761031c565b8063d0fb0203146112e4578063dd62ed3e1461133b578063de94e0f6146113c05761031c565b80639b19251a146110ae5780639e6ff61014611119578063a457c2d71461116a578063a9059cbb146111dd578063aa271e1a14611250578063bfdd2184146112b95761031c565b80638456cb59116101665780638f32d59b116101405780638f32d59b14610f8757806395d89b4114610fb6578063983b2d561461104657806398650275146110975761031c565b80638456cb5914610eca5780638929b55e14610ee15780638da5cb5b14610f305761031c565b80636ef8d66d14610d3257806370a0823114610d49578063715018a614610dae5780637ecebe0014610dc557806382dc1ec414610e2a57806383ed379014610e7b5761031c565b8063395093511161026c578063472d35b9116102255780635a64ad95116101ff5780635a64ad9514610c145780635c975abb14610c3f57806367fcfc3f14610c6e5780636b9a5c6c14610cd45761031c565b8063472d35b9146109cc57806351b7949514610a1d5780635522498c14610bb95761031c565b806339509351146107da5780633f4ba83a1461084d57806340c10f191461086457806342966c68146108bf5780634334614a146108fa57806346fbf68e146109635761031c565b806319feb0fa116102d95780632f53e22f116102b35780632f53e22f146106c85780633092afd51461072d57806330a6e8a41461077e578063313ce567146107a95761031c565b806319feb0fa146105545780631f48d35f146105da57806323b872dd146106355761031c565b8063028468581461032157806305fff8f71461037257806306fdde03146103c157806308286e1214610451578063095ea7b3146104b657806318160ddd14610529575b600080fd5b34801561032d57600080fd5b506103706004803603602081101561034457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611515565b005b34801561037e57600080fd5b506103ab6004803603602081101561039557600080fd5b810190808035906020019092919050505061159d565b6040518082815260200191505060405180910390f35b3480156103cd57600080fd5b506103d66115c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104165780820151818401526020810190506103fb565b50505050905090810190601f1680156104435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561045d57600080fd5b506104a06004803603602081101561047457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115f9565b6040518082815260200191505060405180910390f35b3480156104c257600080fd5b5061050f600480360360408110156104d957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061173a565b604051808215151515815260200191505060405180910390f35b34801561053557600080fd5b5061053e6117d3565b6040518082815260200191505060405180910390f35b34801561056057600080fd5b506105d86004803603602081101561057757600080fd5b810190808035906020019064010000000081111561059457600080fd5b8201836020820111156105a657600080fd5b803590602001918460208302840111640100000000831117156105c857600080fd5b90919293919293905050506117dd565b005b3480156105e657600080fd5b50610633600480360360408110156105fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118af565b005b34801561064157600080fd5b506106ae6004803603606081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b7f565b604051808215151515815260200191505060405180910390f35b3480156106d457600080fd5b50610717600480360360208110156106eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c1a565b6040518082815260200191505060405180910390f35b34801561073957600080fd5b5061077c6004803603602081101561075057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c32565b005b34801561078a57600080fd5b50610793611cba565b6040518082815260200191505060405180910390f35b3480156107b557600080fd5b506107be611cdb565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107e657600080fd5b50610833600480360360408110156107fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ce0565b604051808215151515815260200191505060405180910390f35b34801561085957600080fd5b50610862611d79565b005b34801561087057600080fd5b506108bd6004803603604081101561088757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611edd565b005b3480156108cb57600080fd5b506108f8600480360360208110156108e257600080fd5b8101908080359060200190929190505050611f4b565b005b34801561090657600080fd5b506109496004803603602081101561091d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb8565b604051808215151515815260200191505060405180910390f35b34801561096f57600080fd5b506109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fd5565b604051808215151515815260200191505060405180910390f35b3480156109d857600080fd5b50610a1b600480360360208110156109ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff2565b005b610bb7600480360360a0811015610a3357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a9057600080fd5b820183602082011115610aa257600080fd5b80359060200191846001830284011164010000000083111715610ac457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190640100000000811115610b3157600080fd5b820183602082011115610b4357600080fd5b80359060200191846001830284011164010000000083111715610b6557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061222c565b005b348015610bc557600080fd5b50610c1260048036036040811015610bdc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127c5565b005b348015610c2057600080fd5b50610c29612a95565b6040518082815260200191505060405180910390f35b348015610c4b57600080fd5b50610c54612a9b565b604051808215151515815260200191505060405180910390f35b348015610c7a57600080fd5b50610cd2600480360360a0811015610c9157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050612ab2565b005b348015610ce057600080fd5b50610d3060048036036040811015610cf757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612c1b565b005b348015610d3e57600080fd5b50610d47612d6f565b005b348015610d5557600080fd5b50610d9860048036036020811015610d6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d7a565b6040518082815260200191505060405180910390f35b348015610dba57600080fd5b50610dc3612dc2565b005b348015610dd157600080fd5b50610e1460048036036020811015610de857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eff565b6040518082815260200191505060405180910390f35b348015610e3657600080fd5b50610e7960048036036020811015610e4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f17565b005b348015610e8757600080fd5b50610eb460048036036020811015610e9e57600080fd5b8101908080359060200190929190505050612f83565b6040518082815260200191505060405180910390f35b348015610ed657600080fd5b50610edf612fa6565b005b348015610eed57600080fd5b50610f1a60048036036020811015610f0457600080fd5b810190808035906020019092919050505061310b565b6040518082815260200191505060405180910390f35b348015610f3c57600080fd5b50610f4561312e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f9357600080fd5b50610f9c613158565b604051808215151515815260200191505060405180910390f35b348015610fc257600080fd5b50610fcb6131b0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561100b578082015181840152602081019050610ff0565b50505050905090810190601f1680156110385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561105257600080fd5b506110956004803603602081101561106957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131e9565b005b3480156110a357600080fd5b506110ac613271565b005b3480156110ba57600080fd5b506110fd600480360360208110156110d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061327c565b604051808260ff1660ff16815260200191505060405180910390f35b34801561112557600080fd5b506111686004803603602081101561113c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329c565b005b34801561117657600080fd5b506111c36004803603604081101561118d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613324565b604051808215151515815260200191505060405180910390f35b3480156111e957600080fd5b506112366004803603604081101561120057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506133bd565b604051808215151515815260200191505060405180910390f35b34801561125c57600080fd5b5061129f6004803603602081101561127357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613456565b604051808215151515815260200191505060405180910390f35b3480156112c557600080fd5b506112ce613473565b6040518082815260200191505060405180910390f35b3480156112f057600080fd5b506112f9613479565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561134757600080fd5b506113aa6004803603604081101561135e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061349f565b6040518082815260200191505060405180910390f35b3480156113cc57600080fd5b50611443600480360360808110156113e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050613526565b005b34801561145157600080fd5b5061145a6135b4565b005b34801561146857600080fd5b5061147161364d565b005b34801561147f57600080fd5b506114c26004803603602081101561149657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613658565b005b3480156114d057600080fd5b50611513600480360360208110156114e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136e0565b005b61151d613158565b1515611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61159a81613768565b50565b6005818154811015156115ac57fe5b906000526020600020016000915090505481565b6040805190810160405280600b81526020017f417572757353494c56455200000000000000000000000000000000000000000081525081565b6000611733629896806117256003600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1681548110151561166357fe5b90600052602060002001546117176000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611709600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116fb611cba565b6137c290919063ffffffff16565b61384d90919063ffffffff16565b61384d90919063ffffffff16565b6138d790919063ffffffff16565b9050919050565b6000600c60009054906101000a900460ff161515156117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6117cb838361396a565b905092915050565b6000600a54905090565b6117e5613158565b1515611859576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b828290508110156118aa5761189d838383818110151561187b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613981565b808060010191505061185f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a845733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff161515156119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6119f9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683836139cf565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b7b565b600c60009054906101000a900460ff16151515611b09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611b36601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683836139cf565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a35b5050565b6000600c60009054906101000a900460ff16151515611c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611c1184848461425c565b90509392505050565b60076020528060005260406000206000915090505481565b611c3a613158565b1515611cae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611cb78161430d565b50565b6000611cd66201518060025442036138d790919063ffffffff16565b905090565b601281565b6000600c60009054906101000a900460ff16151515611d67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611d718383614367565b905092915050565b611d8233611fd5565b1515611dd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157266030913960400191505060405180910390fd5b600c60009054906101000a900460ff161515611e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b611ee633613456565b1515611f3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157ce6030913960400191505060405180910390fd5b611f47828261440c565b5050565b611f5433611fb8565b1515611fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061579e6030913960400191505060405180910390fd5b611fb53382614964565b50565b6000611fce82600e614b0490919063ffffffff16565b9050919050565b6000611feb82600b614b0490919063ffffffff16565b9050919050565b611ffa613158565b151561206e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000604051602401808260ff1681526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515612170578051825260208201915060208101905060208303925061214b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146121d2576040519150601f19603f3d011682016040523d82523d6000602084013e6121d7565b606091505b505090508015156121e757600080fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b8373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415156122b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806158cc602f913960400191505060405180910390fd5b60606040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081868686604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183805190602001908083835b60208310151561236b5780518252602082019150602081019050602083039250612346565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019350505050604051602081830303815290604052805190602001206040516020018083805190602001908083835b6020831015156123e657805182526020820191506020810190506020830392506123c1565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040528051906020012090506124348184614be4565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4665656c6573733a20556e65787065637465642073656e64657200000000000081525060200191505060405180910390fd5b8360116000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505514151561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4665656c6573733a206e6f6e636520646f6573206e6f7420636f6d706c79000081525060200191505060405180910390fd5b600060608773ffffffffffffffffffffffffffffffffffffffff1634886040518082805190602001908083835b602083101515612671578051825260208201915060208101905060208303925061264c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126d3576040519150601f19603f3d011682016040523d82523d6000602084013e6126d8565b606091505b50915091506126e56156e6565b6040805190810160405280841515815260200183815250905080600001511515612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4665656c6573733a2043616c6c206661696c656400000000000000000000000081525060200191505060405180910390fd5b6000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561299a5733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff161515156128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61290f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614cc8565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612a91565b600c60009054906101000a900460ff16151515612a1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a4c601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614cc8565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a35b5050565b60065481565b6000600c60009054906101000a900460ff16905090565b612aba613158565b1515612b2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60028160ff1611151515612baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20322e0081525060200191505060405180910390fd5b8460038260ff16815481101515612bbd57fe5b90600052602060002001819055508360048260ff16815481101515612bde57fe5b90600052602060002001819055508260058260ff16815481101515612bff57fe5b9060005260206000200181905550816006819055505050505050565b612c23613158565b1515612c97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60038160ff1611151515612d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20332e0081525060200191505060405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b612d7833614ec3565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612dca613158565b1515612e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60116020528060005260406000206000915090505481565b612f2033611fd5565b1515612f77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157266030913960400191505060405180910390fd5b612f8081614f1d565b50565b600381815481101515612f9257fe5b906000526020600020016000915090505481565b612faf33611fd5565b1515613006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157266030913960400191505060405180910390fd5b600c60009054906101000a900460ff1615151561308b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60048181548110151561311a57fe5b906000526020600020016000915090505481565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040805190810160405280600381526020017f415753000000000000000000000000000000000000000000000000000000000081525081565b6131f1613158565b1515613265576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61326e81614f77565b50565b61327a3361430d565b565b60016020528060005260406000206000915054906101000a900460ff1681565b6132a4613158565b1515613318576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61332181614fd1565b50565b6000600c60009054906101000a900460ff161515156133ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6133b58383615064565b905092915050565b6000600c60009054906101000a900460ff16151515613444576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61344e8383615109565b905092915050565b600061346c82600d614b0490919063ffffffff16565b9050919050565b60025481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61352e613158565b15156135a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6135ae84848484615120565b50505050565b6135bc613158565b1515613630576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601260006101000a81548160ff021916908315150217905550565b61365633613768565b565b613660613158565b15156136d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6136dd8161531e565b50565b6136e8613158565b151561375c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61376581615466565b50565b61377c81600e6154c090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b600082821115151561383c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b60008083141561386057600090506138d1565b6000828402905082848281151561387357fe5b041415156138cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061581f6021913960400191505060405180910390fd5b809150505b92915050565b60008082111515613950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561395d57fe5b0490508091505092915050565b6000613977338484614cc8565b6001905092915050565b613989611cba565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158836025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613adf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806157036023913960400191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060038160ff1614151515613bac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f53656e64657220697320626c61636b6c6973746564000000000000000000000081525060200191505060405180910390fd5b6000613bf262989680613be48560058660ff16815481101515613bcb57fe5b906000526020600020015461384d90919063ffffffff16565b6138d790919063ffffffff16565b60048360ff16815481101515613c0457fe5b9060005260206000200154613c18876115f9565b010190506000613c27856115f9565b90506000613c3e828461557f90919063ffffffff16565b9050613ca383613c95876000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b6137c290919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d4882613d3a876000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b6137c290919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d92611cba565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ddd611cba565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600081111561425357613f0181600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515614171578051825260208201915060208101905060208303925061414c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141d3576040519150601f19603f3d011682016040523d82523d6000602084013e6141d8565b606091505b50509050801515614251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b50505050505050565b60006142698484846139cf565b61430284336142fd85600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b614cc8565b600190509392505050565b61432181600d6154c090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600061440233846143fd85600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b614cc8565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156144b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b60006144dd629896806144cf6006548561384d90919063ffffffff16565b6138d790919063ffffffff16565b90506144f482600a5461557f90919063ffffffff16565b600a8190555061455d8161454f846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b6137c290919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61460284866137c290919063ffffffff16565b6040518082815260200191505060405180910390a3600081111561495f5761469381600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310151561487d5780518252602082019150602081019050602083039250614858565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146148df576040519150601f19603f3d011682016040523d82523d6000602084013e6148e4565b606091505b5050905080151561495d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156149ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158626021913960400191505060405180910390fd5b614a0181600a546137c290919063ffffffff16565b600a81905550614a58816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158406022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060008060418551141515614c015760009350505050614cc2565b6020850151925060408501519150606085015160001a9050601b8160ff161015614c2c57601b810190505b601b8160ff1614158015614c445750601c8160ff1614155b15614c555760009350505050614cc2565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614cb2573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614d50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158a86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061577c6022913960400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b614ed781600b6154c090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b614f3181600b61560990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b614f8b81600d61560990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6000614fdc826115f9565b9050614fe6611cba565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008111156150605761505f82600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836139cf565b5b5050565b60006150ff33846150fa85600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b614cc8565b6001905092915050565b60006151163384846139cf565b6001905092915050565b615171826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615204826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a38273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f91f8b835be584629107fbfe5be695e33c56ebe55697d7c8a30d309a2b8dce9378484604051808381526020018281526020019250505060405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156153a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806157566026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61547a81600e61560990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b6154ca8282614b04565b1515615521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157fe6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008082840190508381101515156155ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6156138282614b04565b151515615688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b604080519081016040528060001515815260200160608152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734665656c6573733a205461726765742073686f756c642062652074686520657874656e64656420636f6e7472616374a165627a7a72305820a7e20a1e5963f6f64f541718c31e49c023594d59a6cb50b11d8b7400d389df940029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373
Deployed Bytecode
0x60806040526004361061031c576000357c0100000000000000000000000000000000000000000000000000000000900480636ef8d66d116101ad5780639b19251a116100f9578063d0fb0203116100b2578063e19a7bc81161008c578063e19a7bc814611445578063e9ec9e8b1461145c578063f2fde38b14611473578063f44637ba146114c45761031c565b8063d0fb0203146112e4578063dd62ed3e1461133b578063de94e0f6146113c05761031c565b80639b19251a146110ae5780639e6ff61014611119578063a457c2d71461116a578063a9059cbb146111dd578063aa271e1a14611250578063bfdd2184146112b95761031c565b80638456cb59116101665780638f32d59b116101405780638f32d59b14610f8757806395d89b4114610fb6578063983b2d561461104657806398650275146110975761031c565b80638456cb5914610eca5780638929b55e14610ee15780638da5cb5b14610f305761031c565b80636ef8d66d14610d3257806370a0823114610d49578063715018a614610dae5780637ecebe0014610dc557806382dc1ec414610e2a57806383ed379014610e7b5761031c565b8063395093511161026c578063472d35b9116102255780635a64ad95116101ff5780635a64ad9514610c145780635c975abb14610c3f57806367fcfc3f14610c6e5780636b9a5c6c14610cd45761031c565b8063472d35b9146109cc57806351b7949514610a1d5780635522498c14610bb95761031c565b806339509351146107da5780633f4ba83a1461084d57806340c10f191461086457806342966c68146108bf5780634334614a146108fa57806346fbf68e146109635761031c565b806319feb0fa116102d95780632f53e22f116102b35780632f53e22f146106c85780633092afd51461072d57806330a6e8a41461077e578063313ce567146107a95761031c565b806319feb0fa146105545780631f48d35f146105da57806323b872dd146106355761031c565b8063028468581461032157806305fff8f71461037257806306fdde03146103c157806308286e1214610451578063095ea7b3146104b657806318160ddd14610529575b600080fd5b34801561032d57600080fd5b506103706004803603602081101561034457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611515565b005b34801561037e57600080fd5b506103ab6004803603602081101561039557600080fd5b810190808035906020019092919050505061159d565b6040518082815260200191505060405180910390f35b3480156103cd57600080fd5b506103d66115c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104165780820151818401526020810190506103fb565b50505050905090810190601f1680156104435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561045d57600080fd5b506104a06004803603602081101561047457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115f9565b6040518082815260200191505060405180910390f35b3480156104c257600080fd5b5061050f600480360360408110156104d957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061173a565b604051808215151515815260200191505060405180910390f35b34801561053557600080fd5b5061053e6117d3565b6040518082815260200191505060405180910390f35b34801561056057600080fd5b506105d86004803603602081101561057757600080fd5b810190808035906020019064010000000081111561059457600080fd5b8201836020820111156105a657600080fd5b803590602001918460208302840111640100000000831117156105c857600080fd5b90919293919293905050506117dd565b005b3480156105e657600080fd5b50610633600480360360408110156105fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118af565b005b34801561064157600080fd5b506106ae6004803603606081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b7f565b604051808215151515815260200191505060405180910390f35b3480156106d457600080fd5b50610717600480360360208110156106eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c1a565b6040518082815260200191505060405180910390f35b34801561073957600080fd5b5061077c6004803603602081101561075057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c32565b005b34801561078a57600080fd5b50610793611cba565b6040518082815260200191505060405180910390f35b3480156107b557600080fd5b506107be611cdb565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107e657600080fd5b50610833600480360360408110156107fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ce0565b604051808215151515815260200191505060405180910390f35b34801561085957600080fd5b50610862611d79565b005b34801561087057600080fd5b506108bd6004803603604081101561088757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611edd565b005b3480156108cb57600080fd5b506108f8600480360360208110156108e257600080fd5b8101908080359060200190929190505050611f4b565b005b34801561090657600080fd5b506109496004803603602081101561091d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb8565b604051808215151515815260200191505060405180910390f35b34801561096f57600080fd5b506109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fd5565b604051808215151515815260200191505060405180910390f35b3480156109d857600080fd5b50610a1b600480360360208110156109ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff2565b005b610bb7600480360360a0811015610a3357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a9057600080fd5b820183602082011115610aa257600080fd5b80359060200191846001830284011164010000000083111715610ac457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190640100000000811115610b3157600080fd5b820183602082011115610b4357600080fd5b80359060200191846001830284011164010000000083111715610b6557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061222c565b005b348015610bc557600080fd5b50610c1260048036036040811015610bdc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127c5565b005b348015610c2057600080fd5b50610c29612a95565b6040518082815260200191505060405180910390f35b348015610c4b57600080fd5b50610c54612a9b565b604051808215151515815260200191505060405180910390f35b348015610c7a57600080fd5b50610cd2600480360360a0811015610c9157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050612ab2565b005b348015610ce057600080fd5b50610d3060048036036040811015610cf757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612c1b565b005b348015610d3e57600080fd5b50610d47612d6f565b005b348015610d5557600080fd5b50610d9860048036036020811015610d6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d7a565b6040518082815260200191505060405180910390f35b348015610dba57600080fd5b50610dc3612dc2565b005b348015610dd157600080fd5b50610e1460048036036020811015610de857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eff565b6040518082815260200191505060405180910390f35b348015610e3657600080fd5b50610e7960048036036020811015610e4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f17565b005b348015610e8757600080fd5b50610eb460048036036020811015610e9e57600080fd5b8101908080359060200190929190505050612f83565b6040518082815260200191505060405180910390f35b348015610ed657600080fd5b50610edf612fa6565b005b348015610eed57600080fd5b50610f1a60048036036020811015610f0457600080fd5b810190808035906020019092919050505061310b565b6040518082815260200191505060405180910390f35b348015610f3c57600080fd5b50610f4561312e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f9357600080fd5b50610f9c613158565b604051808215151515815260200191505060405180910390f35b348015610fc257600080fd5b50610fcb6131b0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561100b578082015181840152602081019050610ff0565b50505050905090810190601f1680156110385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561105257600080fd5b506110956004803603602081101561106957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131e9565b005b3480156110a357600080fd5b506110ac613271565b005b3480156110ba57600080fd5b506110fd600480360360208110156110d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061327c565b604051808260ff1660ff16815260200191505060405180910390f35b34801561112557600080fd5b506111686004803603602081101561113c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329c565b005b34801561117657600080fd5b506111c36004803603604081101561118d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613324565b604051808215151515815260200191505060405180910390f35b3480156111e957600080fd5b506112366004803603604081101561120057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506133bd565b604051808215151515815260200191505060405180910390f35b34801561125c57600080fd5b5061129f6004803603602081101561127357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613456565b604051808215151515815260200191505060405180910390f35b3480156112c557600080fd5b506112ce613473565b6040518082815260200191505060405180910390f35b3480156112f057600080fd5b506112f9613479565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561134757600080fd5b506113aa6004803603604081101561135e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061349f565b6040518082815260200191505060405180910390f35b3480156113cc57600080fd5b50611443600480360360808110156113e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050613526565b005b34801561145157600080fd5b5061145a6135b4565b005b34801561146857600080fd5b5061147161364d565b005b34801561147f57600080fd5b506114c26004803603602081101561149657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613658565b005b3480156114d057600080fd5b50611513600480360360208110156114e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136e0565b005b61151d613158565b1515611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61159a81613768565b50565b6005818154811015156115ac57fe5b906000526020600020016000915090505481565b6040805190810160405280600b81526020017f417572757353494c56455200000000000000000000000000000000000000000081525081565b6000611733629896806117256003600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1681548110151561166357fe5b90600052602060002001546117176000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611709600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116fb611cba565b6137c290919063ffffffff16565b61384d90919063ffffffff16565b61384d90919063ffffffff16565b6138d790919063ffffffff16565b9050919050565b6000600c60009054906101000a900460ff161515156117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6117cb838361396a565b905092915050565b6000600a54905090565b6117e5613158565b1515611859576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b828290508110156118aa5761189d838383818110151561187b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613981565b808060010191505061185f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a845733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff161515156119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6119f9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683836139cf565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b7b565b600c60009054906101000a900460ff16151515611b09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611b36601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683836139cf565b808273ffffffffffffffffffffffffffffffffffffffff167f5667ad70f18b8164281540d6ea385a4b9e80eef045e39dc7e58a54b33c65978a60405160405180910390a35b5050565b6000600c60009054906101000a900460ff16151515611c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611c1184848461425c565b90509392505050565b60076020528060005260406000206000915090505481565b611c3a613158565b1515611cae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611cb78161430d565b50565b6000611cd66201518060025442036138d790919063ffffffff16565b905090565b601281565b6000600c60009054906101000a900460ff16151515611d67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611d718383614367565b905092915050565b611d8233611fd5565b1515611dd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157266030913960400191505060405180910390fd5b600c60009054906101000a900460ff161515611e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b611ee633613456565b1515611f3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157ce6030913960400191505060405180910390fd5b611f47828261440c565b5050565b611f5433611fb8565b1515611fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061579e6030913960400191505060405180910390fd5b611fb53382614964565b50565b6000611fce82600e614b0490919063ffffffff16565b9050919050565b6000611feb82600b614b0490919063ffffffff16565b9050919050565b611ffa613158565b151561206e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000604051602401808260ff1681526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515612170578051825260208201915060208101905060208303925061214b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146121d2576040519150601f19603f3d011682016040523d82523d6000602084013e6121d7565b606091505b505090508015156121e757600080fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b8373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415156122b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806158cc602f913960400191505060405180910390fd5b60606040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081868686604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183805190602001908083835b60208310151561236b5780518252602082019150602081019050602083039250612346565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019350505050604051602081830303815290604052805190602001206040516020018083805190602001908083835b6020831015156123e657805182526020820191506020810190506020830392506123c1565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040528051906020012090506124348184614be4565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4665656c6573733a20556e65787065637465642073656e64657200000000000081525060200191505060405180910390fd5b8360116000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505514151561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4665656c6573733a206e6f6e636520646f6573206e6f7420636f6d706c79000081525060200191505060405180910390fd5b600060608773ffffffffffffffffffffffffffffffffffffffff1634886040518082805190602001908083835b602083101515612671578051825260208201915060208101905060208303925061264c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126d3576040519150601f19603f3d011682016040523d82523d6000602084013e6126d8565b606091505b50915091506126e56156e6565b6040805190810160405280841515815260200183815250905080600001511515612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4665656c6573733a2043616c6c206661696c656400000000000000000000000081525060200191505060405180910390fd5b6000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561299a5733601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900460ff161515156128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61290f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614cc8565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a36000601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612a91565b600c60009054906101000a900460ff16151515612a1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a4c601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383614cc8565b808273ffffffffffffffffffffffffffffffffffffffff167f47fd10448ce4fa2ed210fbbc62caf5a4102d280c8ee3888de704e90e8bf1ae7b60405160405180910390a35b5050565b60065481565b6000600c60009054906101000a900460ff16905090565b612aba613158565b1515612b2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60028160ff1611151515612baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20322e0081525060200191505060405180910390fd5b8460038260ff16815481101515612bbd57fe5b90600052602060002001819055508360048260ff16815481101515612bde57fe5b90600052602060002001819055508260058260ff16815481101515612bff57fe5b9060005260206000200181905550816006819055505050505050565b612c23613158565b1515612c97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60038160ff1611151515612d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c6576656c3a20506c6561736520757365206c6576656c203020746f20332e0081525060200191505060405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b612d7833614ec3565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612dca613158565b1515612e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60116020528060005260406000206000915090505481565b612f2033611fd5565b1515612f77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157266030913960400191505060405180910390fd5b612f8081614f1d565b50565b600381815481101515612f9257fe5b906000526020600020016000915090505481565b612faf33611fd5565b1515613006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806157266030913960400191505060405180910390fd5b600c60009054906101000a900460ff1615151561308b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60048181548110151561311a57fe5b906000526020600020016000915090505481565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040805190810160405280600381526020017f415753000000000000000000000000000000000000000000000000000000000081525081565b6131f1613158565b1515613265576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61326e81614f77565b50565b61327a3361430d565b565b60016020528060005260406000206000915054906101000a900460ff1681565b6132a4613158565b1515613318576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61332181614fd1565b50565b6000600c60009054906101000a900460ff161515156133ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6133b58383615064565b905092915050565b6000600c60009054906101000a900460ff16151515613444576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61344e8383615109565b905092915050565b600061346c82600d614b0490919063ffffffff16565b9050919050565b60025481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61352e613158565b15156135a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6135ae84848484615120565b50505050565b6135bc613158565b1515613630576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601260006101000a81548160ff021916908315150217905550565b61365633613768565b565b613660613158565b15156136d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6136dd8161531e565b50565b6136e8613158565b151561375c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61376581615466565b50565b61377c81600e6154c090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b600082821115151561383c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b60008083141561386057600090506138d1565b6000828402905082848281151561387357fe5b041415156138cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061581f6021913960400191505060405180910390fd5b809150505b92915050565b60008082111515613950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561395d57fe5b0490508091505092915050565b6000613977338484614cc8565b6001905092915050565b613989611cba565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158836025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613adf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806157036023913960400191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060038160ff1614151515613bac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f53656e64657220697320626c61636b6c6973746564000000000000000000000081525060200191505060405180910390fd5b6000613bf262989680613be48560058660ff16815481101515613bcb57fe5b906000526020600020015461384d90919063ffffffff16565b6138d790919063ffffffff16565b60048360ff16815481101515613c0457fe5b9060005260206000200154613c18876115f9565b010190506000613c27856115f9565b90506000613c3e828461557f90919063ffffffff16565b9050613ca383613c95876000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b6137c290919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d4882613d3a876000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b6137c290919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d92611cba565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ddd611cba565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600081111561425357613f0181600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515614171578051825260208201915060208101905060208303925061414c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141d3576040519150601f19603f3d011682016040523d82523d6000602084013e6141d8565b606091505b50509050801515614251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b50505050505050565b60006142698484846139cf565b61430284336142fd85600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b614cc8565b600190509392505050565b61432181600d6154c090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600061440233846143fd85600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b614cc8565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156144b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b60006144dd629896806144cf6006548561384d90919063ffffffff16565b6138d790919063ffffffff16565b90506144f482600a5461557f90919063ffffffff16565b600a8190555061455d8161454f846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b6137c290919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61460284866137c290919063ffffffff16565b6040518082815260200191505060405180910390a3600081111561495f5761469381600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051602401808281526020019150506040516020818303038152906040527fbe4474b4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310151561487d5780518252602082019150602081019050602083039250614858565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146148df576040519150601f19603f3d011682016040523d82523d6000602084013e6148e4565b606091505b5050905080151561495d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466565204d616e61676572206973206e6f7420726573706f6e64696e672e000081525060200191505060405180910390fd5b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156149ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158626021913960400191505060405180910390fd5b614a0181600a546137c290919063ffffffff16565b600a81905550614a58816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158406022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060008060418551141515614c015760009350505050614cc2565b6020850151925060408501519150606085015160001a9050601b8160ff161015614c2c57601b810190505b601b8160ff1614158015614c445750601c8160ff1614155b15614c555760009350505050614cc2565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614cb2573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614d50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158a86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061577c6022913960400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b614ed781600b6154c090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b614f3181600b61560990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b614f8b81600d61560990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6000614fdc826115f9565b9050614fe6611cba565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008111156150605761505f82600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836139cf565b5b5050565b60006150ff33846150fa85600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b614cc8565b6001905092915050565b60006151163384846139cf565b6001905092915050565b615171826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c290919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615204826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557f90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a38273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f91f8b835be584629107fbfe5be695e33c56ebe55697d7c8a30d309a2b8dce9378484604051808381526020018281526020019250505060405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156153a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806157566026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61547a81600e61560990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b6154ca8282614b04565b1515615521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157fe6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008082840190508381101515156155ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6156138282614b04565b151515615688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b604080519081016040528060001515815260200160608152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734665656c6573733a205461726765742073686f756c642062652074686520657874656e64656420636f6e7472616374a165627a7a72305820a7e20a1e5963f6f64f541718c31e49c023594d59a6cb50b11d8b7400d389df940029
Deployed Bytecode Sourcemap
35131:4809:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38901:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38901:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38901:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13560:68;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13560:68:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13560:68:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35684:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35684:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35684:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15014:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15014:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15014:232:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27405:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27405:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27405:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15852:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15852:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38148:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38148:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38148:190:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38148:190:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38148:190:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38148:190:0;;;;;;;;;;;;:::i;:::-;;39494;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39494:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39494:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27237:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27237:160:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27237:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13958:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13958:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13958:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38570:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38570:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38570:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14326:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14326:129:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35588:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35588:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27553:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27553:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27553:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26759:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26759:118:0;;;:::i;:::-;;39320:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39320:108:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39320:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39113:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39113:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39113:94:0;;;;;;;;;;;;;;;;;:::i;:::-;;2218:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2218:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2218:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24276;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24276:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24276:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37588:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37588:220:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37588:220:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34017:926;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;34017:926:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34017:926:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;34017:926:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34017:926:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;34017:926:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;34017:926:0;;;;;;;;;;;;;;;:::i;:::-;;39750:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39750:187:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39750:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13729:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13729:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25968:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25968:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37081:422;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37081:422:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;37081:422:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36740:183;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36740:183:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36740:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24493:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24493:77:0;;;:::i;:::-;;16006:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16006:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16006:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29601:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29601:140:0;;;:::i;:::-;;33381:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33381:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33381:41:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24393:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24393:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24393:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13132:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13132:65:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13132:65:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26548:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26548:116:0;;;:::i;:::-;;13318:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13318:66:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13318:66:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28790:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28790:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29156:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29156:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35792:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35792:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35792:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38406:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38406:93:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38406:93:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;3729:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3729:77:0;;;:::i;:::-;;12802:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12802:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12802:43:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37924:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37924:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37924:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;27728:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27728:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27728:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27097:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27097:132:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27097:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3884:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3884:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3884:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12920:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12920:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14113:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14113:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16548:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16548:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16548:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36482:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36482:176:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36482:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36122:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36122:83:0;;;:::i;:::-;;2063:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2063:77:0;;;:::i;:::-;;29896:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29896:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29896:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;38737:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38737:93:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38737:93:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;38901:99;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38970:22;38984:7;38970:13;:22::i;:::-;38901:99;:::o;13560:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35684:43::-;;;;;;;;;;;;;;;;;;;;:::o;15014:232::-;15082:7;15109:129;13859:8;15110:110;15184:15;15200:9;:18;15210:7;15200:18;;;;;;;;;;;;;;;;;;;;;;;;;15184:35;;;;;;;;;;;;;;;;;;;;15111:67;15159:9;:18;15169:7;15159:18;;;;;;;;;;;;;;;;15112:41;15132:11;:20;15144:7;15132:20;;;;;;;;;;;;;;;;15112:15;:13;:15::i;:::-;:19;;:41;;;;:::i;:::-;15111:47;;:67;;;;:::i;:::-;15110:73;;:110;;;;:::i;:::-;15109:116;;:129;;;;:::i;:::-;15102:136;;15014:232;;;:::o;27405:140::-;27484:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27508:29;27522:7;27531:5;27508:13;:29::i;:::-;27501:36;;27405:140;;;;:::o;15852:91::-;15896:7;15923:12;;15916:19;;15852:91;:::o;38148:190::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38239:6;38246:1;38239:8;;38234:97;38251:9;;:16;;38249:1;:18;38234:97;;;38289:30;38306:9;;38316:1;38306:12;;;;;;;;;;;;;;;;;38289:16;:30::i;:::-;38269:3;;;;;;;38234:97;;;;38148:190;;:::o;39494:::-;33653:1;33632:23;;:9;;;;;;;;;;;:23;;;33628:165;;;33684:10;33672:9;;:22;;;;;;;;;;;;;;;;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39593:36;39603:9;;;;;;;;;;;39614:7;39623:5;39593:9;:36::i;:::-;39670:5;39661:7;39645:31;;;;;;;;;;;;33745:1;33725:9;;:22;;;;;;;;;;;;;;;;;;33628:165;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39593:36;39603:9;;;;;;;;;;;39614:7;39623:5;39593:9;:36::i;:::-;39670:5;39661:7;39645:31;;;;;;;;;;;;33628:165;39494:190;;:::o;27237:160::-;27330:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27354:35;27373:4;27379:2;27383:5;27354:18;:35::i;:::-;27347:42;;27237:160;;;;;:::o;13958:47::-;;;;;;;;;;;;;;;;;:::o;38570:99::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38639:22;38653:7;38639:13;:22::i;:::-;38570:99;:::o;14326:129::-;14372:7;14399:48;14441:5;14418:17;;14400:15;:35;14399:41;;:48;;;;:::i;:::-;14392:55;;14326:129;:::o;35588:35::-;35621:2;35588:35;:::o;27553:167::-;27644:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27668:44;27692:7;27701:10;27668:23;:44::i;:::-;27661:51;;27553:167;;;;:::o;26759:118::-;24175:20;24184:10;24175:8;:20::i;:::-;24167:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:7;;;;;;;;;;;26396:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26828:5;26818:7;;:15;;;;;;;;;;;;;;;;;;26849:20;26858:10;26849:20;;;;;;;;;;;;;;;;;;;;;;26759:118::o;39320:108::-;3557:20;3566:10;3557:8;:20::i;:::-;3549:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39398:22;39404:7;39413:6;39398:5;:22::i;:::-;39320:108;;:::o;39113:94::-;1891:20;1900:10;1891:8;:20::i;:::-;1883:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39174:25;39180:10;39192:6;39174:5;:25::i;:::-;39113:94;:::o;2218:109::-;2274:4;2298:21;2311:7;2298:8;:12;;:21;;;;:::i;:::-;2291:28;;2218:109;;;:::o;24276:::-;24332:4;24356:21;24369:7;24356:8;:12;;:21;;;;:::i;:::-;24349:28;;24276:109;;;:::o;37588:220::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37659:12;37677:10;;;;;;;;;;;:15;;37739:1;37693:48;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37693:48: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;;;37693:48:0;37677:65;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;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;;;37677:65:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;37658:84:0;;;37761:7;37753:16;;;;;;;;37793:7;37780:10;;:20;;;;;;;;;;;;;;;;;;29059:1;37588:220;:::o;34017:926::-;34237:6;34220:23;;34228:4;34220:23;;;34212:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34312:19;:56;;;;;;;;;;;;;;;;;;;;34379:12;34421:6;34456;34464:4;34470:5;34439:37;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;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;;;34439:37:0;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;34439:37:0;;;34429:48;;;;;;34404:74;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;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;;;34404:74:0;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;34404:74:0;;;34394:85;;;;;;34379:100;;34502:29;34521:4;34527:3;34502:18;:29::i;:::-;34490:9;;:41;;;;;;;;;;;;;;;;;;34563:6;34550:19;;:9;;;;;;;;;;;:19;;;34542:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34642:5;34619:6;:17;34626:9;;;;;;;;;;;34619:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;:28;34611:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34694:13;34709:21;34734:6;:11;;34752:9;34763:4;34734:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;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;;;34734:34:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34693:75:0;;;;34779:28;;:::i;:::-;34810:30;;;;;;;;;34821:8;34810:30;;;;;;34831:8;34810:30;;;34779:61;;34859:10;:18;;;34851:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34933:1;34913:9;;:22;;;;;;;;;;;;;;;;;;34017:926;;;;;;;;;;:::o;39750:187::-;33653:1;33632:23;;:9;;;;;;;;;;;:23;;;33628:165;;;33684:10;33672:9;;:22;;;;;;;;;;;;;;;;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39848:35;39857:9;;;;;;;;;;;39868:7;39877:5;39848:8;:35::i;:::-;39923:5;39914:7;39899:30;;;;;;;;;;;;33745:1;33725:9;;:22;;;;;;;;;;;;;;;;;;33628:165;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39848:35;39857:9;;;;;;;;;;;39868:7;39877:5;39848:8;:35::i;:::-;39923:5;39914:7;39899:30;;;;;;;;;;;;33628:165;39750:187;;:::o;13729:29::-;;;;:::o;25968:78::-;26007:4;26031:7;;;;;;;;;;;26024:14;;25968:78;:::o;37081:422::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37259:1;37252:5;:8;;;;37244:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37332:16;37307:15;37323:5;37307:22;;;;;;;;;;;;;;;;;;;:41;;;;37385:17;37359:16;37376:5;37359:23;;;;;;;;;;;;;;;;;;;:43;;;;37441:19;37413:18;37432:5;37413:25;;;;;;;;;;;;;;;;;;;:47;;;;37484:11;37471:10;:24;;;;37081:422;;;;;:::o;36740:183::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36841:1;36834:5;:8;;;;36826:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36910:5;36889:9;:18;36899:7;36889:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;36740:183;;:::o;24493:77::-;24537:25;24551:10;24537:13;:25::i;:::-;24493:77::o;16006:110::-;16063:7;16090:9;:18;16100:7;16090:18;;;;;;;;;;;;;;;;16083:25;;16006:110;;;:::o;29601:140::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29700:1;29663:40;;29684:6;;;;;;;;;;;29663:40;;;;;;;;;;;;29731:1;29714:6;;:19;;;;;;;;;;;;;;;;;;29601:140::o;33381:41::-;;;;;;;;;;;;;;;;;:::o;24393:92::-;24175:20;24184:10;24175:8;:20::i;:::-;24167:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24458:19;24469:7;24458:10;:19::i;:::-;24393:92;:::o;13132:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26548:116::-;24175:20;24184:10;24175:8;:20::i;:::-;24167:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26618:4;26608:7;;:14;;;;;;;;;;;;;;;;;;26638:18;26645:10;26638:18;;;;;;;;;;;;;;;;;;;;;;26548:116::o;13318:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28790:79::-;28828:7;28855:6;;;;;;;;;;;28848:13;;28790:79;:::o;29156:92::-;29196:4;29234:6;;;;;;;;;;;29220:20;;:10;:20;;;29213:27;;29156:92;:::o;35792:37::-;;;;;;;;;;;;;;;;;;;;:::o;38406:93::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38472:19;38483:7;38472:10;:19::i;:::-;38406:93;:::o;3729:77::-;3773:25;3787:10;3773:13;:25::i;:::-;3729:77::o;12802:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;37924:111::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37999:28;38019:7;37999:19;:28::i;:::-;37924:111;:::o;27728:177::-;27824:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27848:49;27872:7;27881:15;27848:23;:49::i;:::-;27841:56;;27728:177;;;;:::o;27097:132::-;27172:4;26205:7;;;;;;;;;;;26204:8;26196:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27196:25;27211:2;27215:5;27196:14;:25::i;:::-;27189:32;;27097:132;;;;:::o;3884:109::-;3940:4;3964:21;3977:7;3964:8;:12;;:21;;;;:::i;:::-;3957:28;;3884:109;;;:::o;12920:32::-;;;;:::o;14113:25::-;;;;;;;;;;;;;:::o;16548:134::-;16620:7;16647:11;:18;16659:5;16647:18;;;;;;;;;;;;;;;:27;16666:7;16647:27;;;;;;;;;;;;;;;;16640:34;;16548:134;;;;:::o;36482:176::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36603:47;36618:6;36625:9;36635:6;36642:7;36603:14;:47::i;:::-;36482:176;;;;:::o;36122:83::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36192:5;36175:14;;:22;;;;;;;;;;;;;;;;;;36122:83::o;2063:77::-;2107:25;2121:10;2107:13;:25::i;:::-;2063:77::o;29896:109::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29969:28;29988:8;29969:18;:28::i;:::-;29896:109;:::o;38737:93::-;29002:9;:7;:9::i;:::-;28994:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38803:19;38814:7;38803:10;:19::i;:::-;38737:93;:::o;2601:130::-;2661:24;2677:7;2661:8;:15;;:24;;;;:::i;:::-;2715:7;2701:22;;;;;;;;;;;;2601:130;:::o;8879:184::-;8937:7;8970:1;8965;:6;;8957:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9017:9;9033:1;9029;:5;9017:17;;9054:1;9047:8;;;8879:184;;;;:::o;9314:470::-;9372:7;9621:1;9616;:6;9612:47;;;9646:1;9639:8;;;;9612:47;9671:9;9687:1;9683;:5;9671:17;;9716:1;9711;9707;:5;;;;;;;;:10;9699:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9775:1;9768:8;;;9314:470;;;;;:::o;10252:333::-;10310:7;10409:1;10405;:5;10397:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10452:9;10468:1;10464;:5;;;;;;;;10452:17;;10576:1;10569:8;;;10252:333;;;;:::o;16829:148::-;16894:4;16911:36;16920:10;16932:7;16941:5;16911:8;:36::i;:::-;16965:4;16958:11;;16829:148;;;;:::o;15678:109::-;15764:15;:13;:15::i;:::-;15741:11;:20;15753:7;15741:20;;;;;;;;;;;;;;;:38;;;;15678:109;:::o;19528:1373::-;19644:1;19626:20;;:6;:20;;;;19618:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19728:1;19707:23;;:9;:23;;;;19699:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19785:11;19799:9;:17;19809:6;19799:17;;;;;;;;;;;;;;;;;;;;;;;;;19785:31;;19844:1;19835:5;:10;;;;19827:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19884:17;19962:56;13859:8;19963:37;19993:6;19963:18;19982:5;19963:25;;;;;;;;;;;;;;;;;;;;:29;;:37;;;;:::i;:::-;19962:43;;:56;;;;:::i;:::-;19935:16;19952:5;19935:23;;;;;;;;;;;;;;;;;;;;19904:28;19925:6;19904:20;:28::i;:::-;:54;:115;19884:135;;20030:26;20059:31;20080:9;20059:20;:31::i;:::-;20030:60;;20101:16;20120:33;20134:18;20120:9;:13;;:33;;;;:::i;:::-;20101:52;;20186:46;20222:9;20187:29;20209:6;20187:9;:17;20197:6;20187:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;20186:35;;:46;;;;:::i;:::-;20166:9;:17;20176:6;20166:17;;;;;;;;;;;;;;;:66;;;;20266:58;20305:18;20267:32;20292:6;20267:9;:20;20277:9;20267:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;20266:38;;:58;;;;:::i;:::-;20243:9;:20;20253:9;20243:20;;;;;;;;;;;;;;;:81;;;;20359:15;:13;:15::i;:::-;20337:11;:19;20349:6;20337:19;;;;;;;;;;;;;;;:37;;;;20410:15;:13;:15::i;:::-;20385:11;:22;20397:9;20385:22;;;;;;;;;;;;;;;:40;;;;20458:9;20441:35;;20450:6;20441:35;;;20469:6;20441:35;;;;;;;;;;;;;;;;;;20504:1;20493:8;:12;20489:405;;;20546:35;20572:8;20546:9;:21;20556:10;;;;;;;;;;;20546:21;;;;;;;;;;;;;;;;:25;;:35;;;;:::i;:::-;20522:9;:21;20532:10;;;;;;;;;;;20522:21;;;;;;;;;;;;;;;:59;;;;20618:10;;;;;;;;;;;20601:39;;20610:6;20601:39;;;20630:9;20601:39;;;;;;;;;;;;;;;;;;20680:10;;;;;;;;;;;20660:51;;20669:9;20660:51;;;20692:18;20660:51;;;;;;;;;;;;;;;;;;20727:12;20745:10;;;;;;;;;;;:15;;20807:8;20761:55;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20761:55: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;;;20761:55:0;20745:72;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;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;;;20745:72:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20726:91:0;;;20840:7;20832:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20489:405;;19528:1373;;;;;;;:::o;17448:256::-;17537:4;17554:36;17564:6;17572:9;17583:6;17554:9;:36::i;:::-;17601:73;17610:6;17618:10;17630:43;17666:6;17630:11;:19;17642:6;17630:19;;;;;;;;;;;;;;;:31;17650:10;17630:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;17601:8;:73::i;:::-;17692:4;17685:11;;17448:256;;;;;:::o;4267:130::-;4327:24;4343:7;4327:8;:15;;:24;;;;:::i;:::-;4381:7;4367:22;;;;;;;;;;;;4267:130;:::o;18113:206::-;18193:4;18210:79;18219:10;18231:7;18240:48;18277:10;18240:11;:23;18252:10;18240:23;;;;;;;;;;;;;;;:32;18264:7;18240:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;18210:8;:79::i;:::-;18307:4;18300:11;;18113:206;;;;:::o;21182:814::-;21277:1;21258:21;;:7;:21;;;;21250:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21328:24;21355:39;13859:8;21355:22;21366:10;;21355:6;:10;;:22;;;;:::i;:::-;:26;;:39;;;;:::i;:::-;21328:66;;21422:24;21439:6;21422:12;;:16;;:24;;;;:::i;:::-;21407:12;:39;;;;21478:52;21513:16;21478:30;21501:6;21478:9;:18;21488:7;21478:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;:34;;:52;;;;:::i;:::-;21457:9;:18;21467:7;21457:18;;;;;;;;;;;;;;;:73;;;;21567:7;21546:61;;21563:1;21546:61;;;21577:28;21588:16;21577:6;:10;;:28;;;;:::i;:::-;21546:61;;;;;;;;;;;;;;;;;;21643:1;21624:16;:20;21620:369;;;21685:43;21711:16;21685:9;:21;21695:10;;;;;;;;;;;21685:21;;;;;;;;;;;;;;;;:25;;:43;;;;:::i;:::-;21661:9;:21;21671:10;;;;;;;;;;;21661:21;;;;;;;;;;;;;;;:67;;;;21769:10;;;;;;;;;;;21748:50;;21765:1;21748:50;;;21781:16;21748:50;;;;;;;;;;;;;;;;;;21814:12;21832:10;;;;;;;;;;;:15;;21894:16;21848:63;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21848:63: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;;;21848:63:0;21832:80;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;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;;;21832:80:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21813:99:0;;;21935:7;21927:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21620:369;;21182:814;;;:::o;22328:306::-;22422:1;22403:21;;:7;:21;;;;22395:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22490:23;22507:5;22490:12;;:16;;:23;;;;:::i;:::-;22475:12;:38;;;;22545:29;22568:5;22545:9;:18;22555:7;22545:18;;;;;;;;;;;;;;;;:22;;:29;;;;:::i;:::-;22524:9;:18;22534:7;22524:18;;;;;;;;;;;;;;;:50;;;;22616:1;22590:36;;22599:7;22590:36;;;22620:5;22590:36;;;;;;;;;;;;;;;;;;22328:306;;:::o;868:203::-;940:4;984:1;965:21;;:7;:21;;;;957:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1043:4;:11;;:20;1055:7;1043:20;;;;;;;;;;;;;;;;;;;;;;;;;1036:27;;868:203;;;;:::o;31239:1115::-;31338:7;31363:9;31383;31403:7;31480:2;31466:3;:10;:16;;31462:68;;;31515:1;31499:19;;;;;;;31462:68;31833:2;31828:3;31824:12;31818:19;31813:24;;31871:2;31866:3;31862:12;31856:19;31851:24;;31917:2;31912:3;31908:12;31902:19;31899:1;31894:28;31889:33;;32045:2;32041:1;:6;;;32037:46;;;32069:2;32064:7;;;;32037:46;32168:2;32163:1;:7;;;;:18;;;;;32179:2;32174:1;:7;;;;32163:18;32159:188;;;32214:1;32198:19;;;;;;;32159:188;32311:24;32321:4;32327:1;32330;32333;32311:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32311:24:0;;;;;;;;32304:31;;;;;31239:1115;;;;;:::o;23074:335::-;23184:1;23167:19;;:5;:19;;;;23159:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23265:1;23246:21;;:7;:21;;;;23238:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23349:5;23319:11;:18;23331:5;23319:18;;;;;;;;;;;;;;;:27;23338:7;23319:27;;;;;;;;;;;;;;;:35;;;;23386:7;23370:31;;23379:5;23370:31;;;23395:5;23370:31;;;;;;;;;;;;;;;;;;23074:335;;;:::o;24708:130::-;24768:24;24784:7;24768:8;:15;;:24;;;;:::i;:::-;24822:7;24808:22;;;;;;;;;;;;24708:130;:::o;24578:122::-;24635:21;24648:7;24635:8;:12;;:21;;;;:::i;:::-;24684:7;24672:20;;;;;;;;;;;;24578:122;:::o;4068:::-;4125:21;4138:7;4125:8;:12;;:21;;;;:::i;:::-;4174:7;4162:20;;;;;;;;;;;;4068:122;:::o;15327:270::-;15393:18;15414:29;15435:7;15414:20;:29::i;:::-;15393:50;;15477:15;:13;:15::i;:::-;15454:11;:20;15466:7;15454:20;;;;;;;;;;;;;;;:38;;;;15520:1;15507:10;:14;15503:87;;;15538:40;15548:7;15556:10;;;;;;;;;;;15567;15538:9;:40::i;:::-;15503:87;15327:270;;:::o;18822:216::-;18907:4;18924:84;18933:10;18945:7;18954:53;18991:15;18954:11;:23;18966:10;18954:23;;;;;;;;;;;;;;;:32;18978:7;18954:32;;;;;;;;;;;;;;;;:36;;:53;;;;:::i;:::-;18924:8;:84::i;:::-;19026:4;19019:11;;18822:216;;;;:::o;16329:156::-;16398:4;16415:40;16425:10;16437:9;16448:6;16415:9;:40::i;:::-;16473:4;16466:11;;16329:156;;;;:::o;14581:351::-;14713:29;14735:6;14713:9;:17;14723:6;14713:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;14693:9;:17;14703:6;14693:17;;;;;;;;;;;;;;;:49;;;;14776:32;14801:6;14776:9;:20;14786:9;14776:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;14753:9;:20;14763:9;14753:20;;;;;;;;;;;;;;;:55;;;;14841:9;14824:35;;14833:6;14824:35;;;14852:6;14824:35;;;;;;;;;;;;;;;;;;14897:9;14875:49;;14889:6;14875:49;;;14908:6;14916:7;14875:49;;;;;;;;;;;;;;;;;;;;;;;;14581:351;;;;:::o;30111:229::-;30205:1;30185:22;;:8;:22;;;;30177:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30295:8;30266:38;;30287:6;;;;;;;;;;;30266:38;;;;;;;;;;;;30324:8;30315:6;;:17;;;;;;;;;;;;;;;;;;30111:229;:::o;2402:122::-;2459:21;2472:7;2459:8;:12;;:21;;;;:::i;:::-;2508:7;2496:20;;;;;;;;;;;;2402:122;:::o;590:183::-;670:18;674:4;680:7;670:3;:18::i;:::-;662:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;760:5;737:4;:11;;:20;749:7;737:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;590:183;;:::o;8423:181::-;8481:7;8501:9;8517:1;8513;:5;8501:17;;8542:1;8537;:6;;8529:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8595:1;8588:8;;;8423:181;;;;:::o;332:178::-;410:18;414:4;420:7;410:3;:18::i;:::-;409:19;401:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;498:4;475;:11;;:20;487:7;475:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;332:178;;:::o;35131:4809::-;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://a7e20a1e5963f6f64f541718c31e49c023594d59a6cb50b11d8b7400d389df94
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.