BscScan - Sponsored slots available. Book your slot here!
BEP-20
DeFi
Overview
Max Total Supply
456,970,991.447769wBTCZ
Holders
10,378 ( 0.039%)
Total Transfers
-
Market
Price
$0.0001 @ 0.000000 BNB (+8.30%)
Onchain Market Cap
$29,739.67
Circulating Supply Market Cap
$820,864.00
Other Info
Token Contract (WITH 8 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
wBTCz
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "./ProposableGroupSystem.sol"; import "./WrappableToken.sol"; import "./wBTCzConstants.sol"; contract wBTCz is WrappableToken, ProposableGroupSystem, wBTCzConstants{ using SafeMath for uint256; constructor() { assert(addGroup(_msgSender())==ADMIN_GROUP); setVoterNumberLimit(MAX_ADMIN_NUMBER); for(uint8 i=0; i<ACTION_NUMBER; ++i) { setActionPct(i, INITIAL_PCTS[i]); } } /* MODIFIERS */ // modifiers use too much bytecode function onlyAdmin() internal view { require(isGroupMember(ADMIN_GROUP, _msgSender())==true,"BA01"); } /* VIEWS */ // EXTERNAL returns admins accounts function getAdmins() external view returns (address[] memory){ return getGroupMembers(ADMIN_GROUP); } // EXTERNAL check if account is admin function isAdmin(address account) external view returns (bool) { return isGroupMember(ADMIN_GROUP, account); } // EXTERNAL returns minting address function getMintingAddress() external view returns (address) { return _getMintingAddress(); } /* Z ADMIN */ // Deletes a proposal taking the string representing it function ZDeleteProposal(string calldata actionString) external returns (bool) { onlyAdmin(); (uint8 actionIndex, ErrNo errCode) = _getActionIndex(actionString); if(errCode == ErrNo.OK) { return removeProposal(_msgSender(), actionIndex); } revert("BP00"); } // EXTERNAL get proposal using proposal index function ZGetProposal(uint256 proposalIndex) external view returns ( address proposer, string memory description, uint8 minPositive, uint8 minNegative, string memory result, uint256 valueU, address valueA ){ uint256 value; uint8 action; int8 resultValue; value=getProposal[proposalIndex].value; proposer=getProposal[proposalIndex].proposer; action=getProposal[proposalIndex].action; minPositive=getProposal[proposalIndex].minPositive; minNegative=getProposal[proposalIndex].minNegative; resultValue=getProposal[proposalIndex].result; require(minPositive>0,"BP01"); result=ResultString[uint8(resultValue+1)]; ActionValueType actionValueType=_getActionType(action); if(actionValueType==ActionValueType.ADDRESS){ valueA=address(uint160(value)); }else{ valueU=value; } description=ActionString[action]; } // Gets the index of the proposal of type "actionString" made by "proposer" function ZGetProposalIndex(address proposer, string calldata actionString) external view returns (uint256 proposalIndex) { (uint8 actionIndex, ErrNo errCode) = _getActionIndex(actionString); if(errCode == ErrNo.OK){ proposalIndex=getAddressProposalIndex[proposer][actionIndex]; } } // EXTERNAL get action using action index function ZGetAction(string calldata actionString) external view returns ( uint8 actionIndex, string memory description, uint8 pct, string memory valueType ){ ErrNo errCode; (actionIndex, errCode) = _getActionIndex(actionString); if(errCode == ErrNo.OK) { pct=getActionPct(actionIndex); description=ActionString[actionIndex]; valueType=ActionValueTypeString[uint8(_getActionType(actionIndex))]; }else{ revert("BP00"); } } // EXTERNAL returns admins accounts function ZGetActionList() external view returns (string[] memory actionList){ actionList= new string[](ActionString.length); for(uint256 i = 0; i < ActionString.length; ++i) { actionList[i]=ActionString[i]; } } // EXTERNAL propose a value to a specific action function ZPropose(string calldata actionString, uint256 value) external returns (uint256 proposalIndex) { onlyAdmin(); (uint8 actionIndex, ErrNo errCode) = _getActionIndex(actionString); if(errCode == ErrNo.OK) { return _submitProposal(_msgSender(), actionIndex, value); } revert("BP00"); } /* EXTERNALS */ function ZProposePause() external returns (uint256 proposalIndex) { onlyAdmin(); whenNotPaused(); return _submitProposal(_msgSender(), uint8(Action.PAUSE_TOKEN), 1); } function ZProposeUnpause() external returns (uint256 proposalIndex) { onlyAdmin(); whenPaused(); return _submitProposal(_msgSender(), uint8(Action.UNPAUSE_TOKEN), 1); } // vote function ZVote(uint256 proposalIndex, uint8 decision) external returns (bool) { onlyAdmin(); _voteProposal(_msgSender(), proposalIndex, decision); return true; } function _getActionIndex(string calldata actionString) internal view returns (uint8, ErrNo) { for(uint8 i=0; i<ActionString.length; ++i){ if(compareStrings(ActionString[i],actionString)){ return (i, ErrNo.OK); } } return (0, ErrNo.BP00); } /* TOKEN TOOLS */ // INTERNAL transfer from user1 to user2 function _transfer(address sender, address recipient, uint256 amount) internal override { require(sender != _getMintingAddress(), "BT03"); require(recipient != _getMintingAddress(), "BT04"); super._transfer(sender, recipient, amount); } // INTERNAL transfer from user1 to user2 function _transferToN(address sender, address[] calldata recipient, uint256[] calldata amount) internal override { require(sender != _getMintingAddress(), "BT03"); uint256 recipientNumber=recipient.length; for(uint256 i=0; i<recipientNumber; ++i){ require(recipient[i] != _getMintingAddress(), "BT04"); } super._transferToN(sender, recipient, amount); } /* ADMINISTRATIVE TOOLS */ function compareStrings(string memory a, string memory b) internal pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } /* EVENTS DEFINITION */ event New_proposal(uint256 indexed proposalIndex, address indexed from, string action, uint256 value); event New_proposal(uint256 indexed proposalIndex, address indexed from, string action, address account); event Deleted_proposal(uint256 indexed proposalIndex, address indexed from, string action); event Approved_proposal(uint256 indexed proposalIndex, address indexed from, string action, uint256 value); event Approved_proposal(uint256 indexed proposalIndex, address indexed from, string action, address account); event Denied_proposal(uint256 indexed proposalIndex, address indexed from, string action, uint256 value); event Denied_proposal(uint256 indexed proposalIndex, address indexed from, string action, address account); /* EVENTS EMITTAL */ function _emitNewProposal(uint256 proposalIndex, address proposer, uint8 actionIndex, uint256 value) internal { if(_getActionType(actionIndex)==ActionValueType.ADDRESS){ emit New_proposal(proposalIndex, proposer, ActionString[actionIndex], address(uint160(value))); }else{ emit New_proposal(proposalIndex, proposer, ActionString[actionIndex], value); } } function _emitDeniedProposal(uint256 proposalIndex, address proposer, uint8 actionIndex, uint256 value) internal { if(_getActionType(actionIndex)==ActionValueType.ADDRESS){ emit Denied_proposal(proposalIndex, proposer, ActionString[actionIndex], address(uint160(value))); }else{ emit Denied_proposal(proposalIndex, proposer, ActionString[actionIndex], value); } } function _emitApprovedProposal(uint256 proposalIndex, address proposer, uint8 actionIndex, uint256 value) internal { if(_getActionType(actionIndex)==ActionValueType.ADDRESS){ emit Approved_proposal(proposalIndex, proposer, ActionString[actionIndex], address(uint160(value))); }else{ emit Approved_proposal(proposalIndex, proposer, ActionString[actionIndex], value); } } /* TOKEN TOOLS */ //execute approved actions function _executeApprovedProposal(uint8 action, uint256 value) internal returns (bool) { if(Action(action)==Action.ADD_ADMIN){ return addMemberToGroup(ADMIN_GROUP,address(uint160(value))); }else if(Action(action)==Action.REMOVE_ADMIN){ address oldAdmin=address(uint160(value)); return removeMemberFromGroup(ADMIN_GROUP, oldAdmin); }else if(Action(action)==Action.MINT_TOKEN){ _mint(_getMintingAddress(),value); }else if(Action(action)==Action.BURN_TOKEN){ _burn(_getMintingAddress(),value); }else if(Action(action)==Action.MINTING_ADDRESS){ _changeMintingAddress(address(uint160(value))); }else if(Action(action)==Action.PAUSE_TOKEN){ _pause(); }else if(Action(action)==Action.UNPAUSE_TOKEN){ _unpause(); }else if(Action(action)==Action.CHANGE_ADMIN_PCT){ setActionPct(uint8(Action.ADD_ADMIN),uint8(value)); setActionPct(uint8(Action.REMOVE_ADMIN),uint8(value)); setActionPct(uint8(Action.MINTING_ADDRESS),uint8(value)); setActionPct(uint8(Action.PAUSE_TOKEN),uint8(value)); setActionPct(uint8(Action.UNPAUSE_TOKEN),uint8(value)); }else if(Action(action)==Action.CHANGE_TOKEN_PCT){ setActionPct(uint8(Action.MINT_TOKEN),uint8(value)); setActionPct(uint8(Action.BURN_TOKEN),uint8(value)); }else if(Action(action)==Action.MANAGEMENT_PCT){ setActionPct(uint8(Action.CHANGE_ADMIN_PCT),uint8(value)); setActionPct(uint8(Action.CHANGE_TOKEN_PCT),uint8(value)); }else{ revert("BP00"); } return true; } function _getActionTypeFromProposal(uint256 proposalIndex) internal view returns (ActionValueType) { uint8 actionIndex=getProposal[proposalIndex].action; return _getActionType(actionIndex); } function _getActionType(uint8 action) internal view returns (ActionValueType) { require(action<ActionString.length,"Invalid action"); Action actionIndex=Action(action); if( actionIndex==Action.MINT_TOKEN || actionIndex==Action.BURN_TOKEN || actionIndex==Action.PAUSE_TOKEN || actionIndex==Action.UNPAUSE_TOKEN ){ return ActionValueType.AMOUNT; }else if( actionIndex==Action.ADD_ADMIN || actionIndex==Action.REMOVE_ADMIN || actionIndex==Action.MINTING_ADDRESS ){ return ActionValueType.ADDRESS; }else {// if( //actionIndex==Action.ADMIN_PCT || //actionIndex==Action.TOKEN_PCT || //actionIndex==Action.MANAGEMENT_PCT || //){ return ActionValueType.PCT; } } function _submitProposal( address proposedBy, uint8 action, uint256 value ) internal returns (uint256) { if(_getActionType(action)==ActionValueType.PCT){ require(isPct(value)==true,"BP10"); }else{ require(value>0,"BA00"); } (uint256 proposalIndex, ErrNo errNo)=addProposal(proposedBy, action, ADMIN_GROUP, value); require(errNo==ErrNo.OK, ErrNoString[uint256(errNo)]); _emitNewProposal(proposalIndex, proposedBy, action, value); _voteProposal(proposedBy, proposalIndex, 1); return proposalIndex; } // INTERNAL vote function _voteProposal(address voter, uint256 proposalIndex, uint8 decision) internal { (int8 result, ErrNo errNo)=voteProposal(voter, proposalIndex, decision); require(errNo==ErrNo.OK, ErrNoString[uint256(errNo)]); uint256 value; address proposer; uint8 action; value=getProposal[proposalIndex].value; proposer=getProposal[proposalIndex].proposer; action=getProposal[proposalIndex].action; if(result==1){ bool executed=_executeApprovedProposal(action, value); if(executed==true){ _emitApprovedProposal(proposalIndex, proposer, action, value); }else{ _emitDeniedProposal(proposalIndex, proposer, action, value); } removeProposal(proposer, action); }else if(result==-1){ _emitDeniedProposal(proposalIndex, proposer, action, value); removeProposal(proposer, action); } } // Flush proposals made by admin before his removal function beforeRemovingMemberFromGroup(uint256 groupIndex, address account) internal override { for(uint8 h=0; h<ActionString.length; ++h){ removeProposal(account,h); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; /* ADMIN BA00 Zero not allowed. BA01 ONLY_MEMBER: Account does not belong to the group. TOKEN BT01 ONLY_MINTING_ADDRESS: Caller not minting address. BT02 TRANSFER_TO_N: Must submit same addresses and amounts quantity. BT03 TRANSFER: can't transfer from minting address. BT04 TRANSFER: can't transfer to minting address. BT05 UNWRAP: minting address can't unwrap BT06 WRAP: can't wrap to minting address BT07 CHANGE_MINTING_ADDRESS: please empty new minting address balance and re-submit last vote. BT08 TRANSFER: transfer amount exceeds balance BT09 BT10 TRANSFER: can't transfer to zero address BT11 TRANSFER: can't transfer from zero address PROPOSAL BP00 EXECUTE_ACTION: Invalid action. BP01 EXECUTE_ACTION: Proposal not found. BP02 GET_ACTION: Action not found. BP03 ADD_PROPOSAL: Pending user active proposal. BP04 ADD_PROPOSAL: Group not active. BP05 ADD_PROPOSAL: Too many voters. BP06 ADD_PROPOSAL: Action not found. BP07 VOTE: You have already voted this proposal. BP08 VOTE: Invalid vote. 0: Disgree. 1:Agree. BP09 ADD_MEMBER: Too many members in this group. BP10 INVALID_PCT: Percentage must be from 1 to 100 BP11 PAUSABLE: token PAUSED BP12 PAUSABLE: token UNPAUSED SAFEMATH SM00 SafeMath: addition overflow SM01 SafeMath: subtraction overflow SM02 SafeMath: multiplication overflow SM03 SafeMath: division by zero SM04 SafeMath: modulo by zero BEP20 BE00 BEP20: decreased allowance below zero BE01 BEP20: transfer amount exceeds allowance BE02 BEP20: approve from the zero address BE03 BEP20: approve to the zero address */ contract ERRNO { enum ErrNo{ OK, BA00, BA01, BT01, BT02, BT03, BT04, BT05, BT06, BT07, BT08, BT09, BT10, BP00, BP01, BP02, BP03, BP04, BP05, BP06, BP07, BP08, BP09, BP10, BP11, BP12, SM00, SM01, SM02, SM03, SM04 } string[50] ErrNoString=[ "OK", "BA00", "BA01", "BT01", "BT02", "BT03", "BT04", "BT05", "BT06", "BT07", "BT08", "BT09", "BT10", "BP00", "BP01", "BP02", "BP03", "BP04", "BP05", "BP06", "BP07", "BP08", "BP09", "BP10", "BP11", "BP12", "SM00", "SM01", "SM02", "SM03", "SM04" ]; constructor() {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; abstract contract Groupable { constructor() {} /*########## OBSERVERS ##########*/ // INTERNAL - returns TRUE if account is member of the given group, FALSE otherwise function isGroupMember(uint256 groupIndex, address account) internal view virtual returns (bool); // INTERNAL - returns TRUE if the gruop is active (>=1 members), FALSE otherwise function isGroupActive(uint256 groupIndex) internal view virtual returns (bool); // INTERNAL - returns the number of members of the given group function getGroupMemberNumber(uint256 groupIndex) internal view virtual returns (uint256); // INTERNAL - returns an array containing the members of the given group function getGroupMembers(uint256 groupIndex) internal view virtual returns (address[] memory); /*########## MODIFIERS ##########*/ // INTERNAL - creates a group with "account" in it function addGroup(address account) internal virtual returns (uint256); // INTERNAL - creates a group with a list of accounts in it function addGroup(address[] calldata account) internal virtual returns (uint256); // INTERNAL adds a single member to the given group function addMemberToGroup(uint256 groupIndex, address account) internal virtual returns (bool); // INTERNAL adds a list of members to the given group function addMemberToGroup(uint256 groupIndex, address[] calldata account) internal virtual returns (bool); // INTERNAL - disables the given group function removeGroup(uint256 groupIndex) internal virtual returns (bool); // INTERNAL - removes the account from the given group function removeMemberFromGroup(uint256 groupIndex, address account) internal virtual returns (bool); function beforeAddingMemberToGroup(uint256 groupIndex, address account) internal virtual; function beforeRemovingMemberFromGroup(uint256 groupIndex, address account) internal virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "./Groupable.sol"; contract GroupSystem is Groupable { struct Group{ mapping (address => bool) isMember; mapping (uint256 => address) memberList; uint256 firstEmptyMember; } mapping (uint256 => Group) private _groupList; uint256 private _firstEmptyGroup; constructor() {} /*########## OBSERVERS ##########*/ // INTERNAL - returns TRUE if account is member of the given group, FALSE otherwise function isGroupMember(uint256 groupIndex, address account) internal view override returns (bool) { return _groupList[groupIndex].isMember[account]; } // INTERNAL - returns TRUE if the gruop is active (>=1 members), FALSE otherwise function isGroupActive(uint256 groupIndex) internal view override returns (bool) { return (_groupList[groupIndex].firstEmptyMember!=0); } // INTERNAL - returns the number of members of the given group function getGroupMemberNumber(uint256 groupIndex) internal view override returns (uint256){ return _groupList[groupIndex].firstEmptyMember; } // INTERNAL - returns an array containing the members of the given group function getGroupMembers(uint256 groupIndex) internal view override returns (address[] memory){ //Be careful, limitations should applied in caller class //possible crash if returned array too big return _getGroupMembers(groupIndex); } /*########## MODIFIERS ##########*/ // INTERNAL - creates a group with "account" in it function addGroup(address account) internal override returns (uint256) { _addMemberToGroup(_firstEmptyGroup, account); return _firstEmptyGroup++; } // INTERNAL - creates a group with a list of accounts in it function addGroup(address[] calldata account) internal override returns (uint256) { _addMemberToGroup(_firstEmptyGroup, account); return _firstEmptyGroup++; } // INTERNAL adds a single member to the given group function addMemberToGroup(uint256 groupIndex, address account) internal override returns (bool) { if(isGroupActive(groupIndex)==false){ return false; } _addMemberToGroup(groupIndex, account); return true; } // INTERNAL adds a list of members to the given group function addMemberToGroup(uint256 groupIndex, address[] calldata account) internal override returns (bool) { if(isGroupActive(groupIndex)==false){ return false; } _addMemberToGroup(groupIndex, account); return true; } // INTERNAL - disables the given group function removeGroup(uint256 groupIndex) internal override returns (bool) { return _removeGroup(groupIndex); } // INTERNAL - removes the account from the given group function removeMemberFromGroup(uint256 groupIndex, address account) internal override returns (bool) { return _removeMemberFromGroup(groupIndex, account); } /*########## ADMINISTRATIVE TOOLS ##########*/ function _getGroupMembers(uint256 groupIndex) private view returns (address[] memory) { uint256 FEM=_groupList[groupIndex].firstEmptyMember; address[] memory members = new address[](FEM); for(uint256 i = 0; i < FEM; ++i) { members[i]=_groupList[groupIndex].memberList[i]; } return members; } // PRIVATE - implements addMemberToGroup function _addMemberToGroup(uint256 groupIndex, address account) private { beforeAddingMemberToGroup(groupIndex, account); if(_groupList[groupIndex].isMember[account]==true){ return; } _groupList[groupIndex].isMember[account]=true; _groupList[groupIndex].memberList[_groupList[groupIndex].firstEmptyMember++]=account; return; } // PRIVATE - implements addMemberToGroup function _addMemberToGroup(uint256 groupIndex, address[] calldata account) private { for(uint256 i=0; i<account.length; ++i){ _addMemberToGroup(groupIndex, account[i]); } } // PRIVATE - implements removeMemberFromGroup function _removeMemberFromGroup(uint256 groupIndex, address account) private returns (bool) { beforeRemovingMemberFromGroup(groupIndex, account); if(_groupList[groupIndex].isMember[account]==false){ return true; } uint256 FEM=_groupList[groupIndex].firstEmptyMember; if(FEM<2){ return false; } _groupList[groupIndex].isMember[account]=false; for(uint256 i=0; i<FEM; ++i){ if(_groupList[groupIndex].memberList[i]==account){ _groupList[groupIndex].memberList[i]=_groupList[groupIndex].memberList[--FEM]; _groupList[groupIndex].firstEmptyMember=FEM; return true; } } return false; } // PRIVATE - implements removeGroup function _removeGroup(uint256 groupIndex) private returns (bool) { _groupList[groupIndex].firstEmptyMember=0; return true; } function beforeAddingMemberToGroup(uint256 groupIndex, address account) internal virtual override {} function beforeRemovingMemberFromGroup(uint256 groupIndex, address account) internal virtual override {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/BEP20/IBEP20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the BEP20 standard as defined in the EIP. */ interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/BEP20/extensions/IBEP20Metadata.sol) pragma solidity ^0.8.0; import "./IBEP20.sol"; /** * @dev Interface for the optional metadata functions from the BEP20 standard. * * _Available since v4.1._ */ interface IBEP20Metadata is IBEP20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ function whenNotPaused() internal view { require(!paused(), "BP11"); } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ function whenPaused() internal view { require(paused(), "BP12"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual { whenNotPaused(); _paused = true; } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual { whenPaused(); _paused = false; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "./ERRNO.sol"; abstract contract Proposable is ERRNO { constructor() {} /*########## OBSERVERS ##########*/ function getVoterNumberLimit() internal view virtual returns (uint256); function isActive(uint256 proposalIndex) internal view virtual returns (bool); function isPct(uint256 pct) internal pure virtual returns (bool); function getActionPct(uint8 action) internal view virtual returns (uint8); /*########## MODIFIERS ##########*/ function setVoterNumberLimit(uint256 limit) internal virtual; function addProposal( address proposedBy, uint8 action, uint256 groupIndex, uint256 value ) internal virtual returns (uint256 proposalIndex, ErrNo errNo); function voteProposal(address voter, address proposedBy, uint8 action, uint8 decision) internal virtual returns (int8, ErrNo); function voteProposal(address voter, uint256 proposalIndex, uint8 decision) internal virtual returns (int8, ErrNo); function removeProposal(address proposedBy, uint8 action) internal virtual returns (bool); function setActionPct(uint8 action, uint8 pct) internal virtual returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "./Proposable.sol"; import "./GroupSystem.sol"; contract ProposableGroupSystem is Proposable, GroupSystem { struct Proposal{ uint256 value; uint256 groupIndex; address proposer; uint8 action; uint8 minPositive; uint8 minNegative; uint8 nowPositive; uint8 nowNegative; int8 result; mapping(address => bool) votePool; } mapping(uint256 => Proposal) internal getProposal; uint256 private _proposalIndex = 1; mapping(uint8 => uint8) private _actionPct; mapping(address => mapping( uint8 => uint256 )) internal getAddressProposalIndex; uint256 private _voterNumberLimit=0; constructor() {} /* INTERFACES */ function setVoterNumberLimit(uint256 limit) internal override { _voterNumberLimit=limit; } function getVoterNumberLimit() internal view override returns (uint256) { return _voterNumberLimit; } function isBelowMaxAllowedMembers(uint256 voterNumber) internal view returns (bool) { return (_voterNumberLimit==0 || voterNumber<_voterNumberLimit); } function isActive(uint256 proposalIndex) internal view override returns (bool){ if( getProposal[proposalIndex].minPositive>0 && getProposal[proposalIndex].result==0 ){ return true; } return false; } function addProposal( address proposedBy, uint8 action, uint256 groupIndex, uint256 value ) internal override returns (uint256 proposalIndex, ErrNo errNo){ (proposalIndex, errNo)=_addProposal(proposedBy, action, groupIndex, value); } function voteProposal(address voter, address proposedBy, uint8 action, uint8 decision) internal override returns (int8, ErrNo) { uint256 proposalIndex=getAddressProposalIndex[proposedBy][action]; return _vote(voter, proposalIndex, decision); } function voteProposal(address voter, uint256 proposalIndex, uint8 decision) internal override returns (int8, ErrNo) { return _vote(voter, proposalIndex, decision); } function removeProposal(address proposedBy, uint8 action) internal override returns (bool) { return _deleteProposal(proposedBy, action); } function beforeAddingMemberToGroup(uint256 groupIndex, address account) internal override view { require(isBelowMaxAllowedMembers(getGroupMemberNumber(groupIndex)), "BP09"); } /* ACTIONS MANAGMENT */ function isPct(uint256 pct) internal pure override returns (bool) { if(pct==0 || pct>100){ return false; } return true; } function setActionPct(uint8 action, uint8 pct) internal override returns (bool) { if(isPct(pct)==false){ return false; } _actionPct[action]=pct; return true; } function getActionPct(uint8 action) internal view override returns (uint8) { return _actionPct[action]; } /* PROPOSAL SYSTEM TOOLS */ function _getConsensus(uint256 voterNumber, uint8 pct) private pure returns (uint8, uint8) { uint8 neg=uint8((voterNumber*(100-pct))/100); uint8 pos=uint8(voterNumber-neg); if(pos==0){ pos=1; } if(neg==0){ neg=1; } return (pos,neg); } function _addProposal( address proposedBy, uint8 action, uint256 groupIndex, uint256 value ) private returns (uint256 proposalIndex, ErrNo errNo) { uint256 voterNumber=getGroupMemberNumber(groupIndex); if(isGroupMember(groupIndex, proposedBy)==false){ return (0, ErrNo.BA01); } if(getAddressProposalIndex[proposedBy][action]!=0){ return (0, ErrNo.BP03); } if(voterNumber==0){ return (0, ErrNo.BP04); } if(_actionPct[action]==0){ return (0, ErrNo.BP06); } proposalIndex=_proposalIndex++; ( getProposal[proposalIndex].minPositive, getProposal[proposalIndex].minNegative ) = _getConsensus(voterNumber, _actionPct[action]); getProposal[proposalIndex].value=value; getProposal[proposalIndex].groupIndex=groupIndex; getProposal[proposalIndex].proposer=proposedBy; getProposal[proposalIndex].action=action; getAddressProposalIndex[proposedBy][action]=proposalIndex; return (proposalIndex, ErrNo.OK); } function _deleteProposal(uint256 proposalIndex) private returns (bool) { address proposedBy=getProposal[proposalIndex].proposer; uint8 action=getProposal[proposalIndex].action; return _deleteProposal(proposedBy, action, proposalIndex); } function _deleteProposal(address proposedBy, uint8 action) private returns (bool) { uint256 proposalIndex=getAddressProposalIndex[proposedBy][action]; return _deleteProposal(proposedBy, action, proposalIndex); } function _deleteProposal(address proposedBy, uint8 action, uint256 proposalIndex) private returns (bool) { //some functions could delete proposal multiple times //so no revert if proposal not active if(isActive(proposalIndex)==false){ return false; } // result==1 means proposal has passed, 0 still voting, -1 denied if(getProposal[proposalIndex].result==0){ getProposal[proposalIndex].result=-1; } getAddressProposalIndex[proposedBy][action]=0; return true; } function _result(uint256 proposalIndex) private returns (int8) { if(getProposal[proposalIndex].nowPositive >= getProposal[proposalIndex].minPositive ){ _deleteProposal(proposalIndex); getProposal[proposalIndex].result=1; return 1; }else if(getProposal[proposalIndex].nowNegative >= getProposal[proposalIndex].minNegative ){ _deleteProposal(proposalIndex); getProposal[proposalIndex].result=-1; return -1; } return 0; } function _vote(address voter, uint256 proposalIndex, uint8 decision) private returns (int8, ErrNo) { if(isGroupMember(getProposal[proposalIndex].groupIndex, voter)==false){ return (0, ErrNo.BA01); } if(getProposal[proposalIndex].votePool[voter]==true){ return (0, ErrNo.BP07); } if(isActive(proposalIndex)==false){ return (0, ErrNo.BP01); } if(decision==1){ getProposal[proposalIndex].nowPositive++; }else if(decision==0){ getProposal[proposalIndex].nowNegative++; }else{ return (0, ErrNo.BP08); } getProposal[proposalIndex].votePool[voter]=true; return (_result(proposalIndex), ErrNo.OK); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.2; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SM00"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SM01"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SM02"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SM03"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SM04"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/BEP20/BEP20.sol) pragma solidity ^0.8.0; import "./IBEP20.sol"; import "./IBEP20Metadata.sol"; import "./Context.sol"; import "./TokenConstants.sol"; import "./SafeMath.sol"; /** * @dev Implementation of the {IBEP20} 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 {BEP20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-BEP20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of BEP20 * 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 {IBEP20-approve}. */ contract StandardToken is Context, IBEP20, IBEP20Metadata, TokenConstants { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor() { _balances[_msgSender()]=INITIAL_SUPPLY; _totalSupply=INITIAL_SUPPLY; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return TOKEN_NAME; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return TOKEN_SYMBOL; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {BEP20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IBEP20-balanceOf} and {IBEP20-transfer}. */ function decimals() public view virtual override returns (uint8) { return TOKEN_DECIMALS; } /** * @dev See {IBEP20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IBEP20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IBEP20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferToN( address[] calldata recipient, uint256[] calldata amount ) public virtual returns (bool) { _transferToN(_msgSender(), recipient, amount); return true; } /** * @dev See {IBEP20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IBEP20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IBEP20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {BEP20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 remainingAllowance = _allowances[sender][_msgSender()].sub(amount, "BE01"); _approve(sender, _msgSender(), remainingAllowance); 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 {IBEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IBEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 remainingAllowance = _allowances[_msgSender()][spender].sub(subtractedValue, "BE00"); _approve(_msgSender(), spender, remainingAllowance); return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "BT11"); require(recipient != address(0), "BT10"); _tokenTransfer(sender, recipient, amount); emit Transfer(sender, recipient, amount); } function _tokenTransfer( address sender, address recipient, uint256 amount ) internal virtual { _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "BT08"); _balances[recipient] = _balances[recipient].add(amount); _afterTokenTransfer(sender, recipient, amount); } function _transferToN( address sender, address[] calldata recipient, uint256[] calldata amount ) internal virtual { require(sender != address(0), "BT11"); _tokenTransferToN(sender, recipient, amount); uint256 recipientNumber=recipient.length; for(uint256 i=0; i<recipientNumber; ++i){ require(recipient[i] != address(0), "BT10"); emit Transfer(sender, recipient[i], amount[i]); } } function _tokenTransferToN( address sender, address[] calldata recipient, uint256[] calldata amount ) internal virtual { _beforeTokenTransfer(); uint256 recipientNumber=recipient.length; require(recipientNumber==amount.length,"BT02"); uint256 previousBalance = _balances[sender]; uint256 transactionBalance = 0; for(uint256 i=0; i<recipientNumber; ++i){ transactionBalance = transactionBalance.add(amount[i]); _balances[recipient[i]] = _balances[recipient[i]].add(amount[i]); } require(previousBalance>=transactionBalance, "BT08"); _balances[sender] = _balances[sender].sub(transactionBalance, "BT08"); _afterTokenTransfer(); } /** @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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "BT10"); require(amount>0, "BA00"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "BT11"); require(amount>0, "BA00"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "BT08"); _totalSupply = _totalSupply.sub(amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "BE02"); require(spender != address(0), "BE03"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual { _beforeTokenTransfer(); } function _beforeTokenTransfer( ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual { _afterTokenTransfer(); } function _afterTokenTransfer( ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; contract TokenConstants { string constant internal TOKEN_NAME = "Wrapped BitcoinZ"; string constant internal TOKEN_SYMBOL = "wBTCZ"; uint8 constant internal TOKEN_DECIMALS = 8; uint256 constant internal INITIAL_SUPPLY = 0; constructor(){} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; contract wBTCzConstants { uint256 constant MAX_ADMIN_NUMBER = 50; uint8 constant ACTION_NUMBER = 10; uint8 constant ACTION_VALUE_TYPE = 3; uint256 constant ADMIN_GROUP = 0; uint8[ACTION_NUMBER] INITIAL_PCTS = [60,60,60,60,60,40,40,80,80,100]; enum Action { ADD_ADMIN, REMOVE_ADMIN, MINTING_ADDRESS, PAUSE_TOKEN, UNPAUSE_TOKEN, MINT_TOKEN, BURN_TOKEN, CHANGE_ADMIN_PCT, CHANGE_TOKEN_PCT, MANAGEMENT_PCT } string[ACTION_NUMBER] ActionString=[ "ADD_ADMIN", "REMOVE_ADMIN", "MINTING_ADDRESS", "PAUSE_TOKEN", "UNPAUSE_TOKEN", "MINT_TOKEN", "BURN_TOKEN", "CHANGE_ADMIN_PCT", "CHANGE_TOKEN_PCT", "MANAGEMENT_PCT" ]; enum ActionValueType { PCT, AMOUNT, ADDRESS } string[ACTION_VALUE_TYPE] ActionValueTypeString=[ "PCT: 1 to 100", "AMOUNT", "ADDRESS" ]; string[3] ResultString=[ "DENIED", "ACTIVE", "APPROVED" ]; constructor(){} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; abstract contract Wrappable { event UNWRAP(address indexed sender, string indexed BTCZrecipient, uint256 amount); event WRAP(string indexed BTCZsender, address indexed recipient, uint256 amount); constructor() {} /* INTERFACES */ // INTERNAL transfer from user to mintingAddress storing btcz recipient address function unwrap(string calldata BTCZrecipient, uint256 amount) external virtual returns (bool); // INTERNAL transfer from mintingAddress to user storing btcz sender address function wrap(string calldata BTCZsender, address recipient, uint256 amount) external virtual returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "./SafeMath.sol"; import "./Pausable.sol"; import "./StandardToken.sol"; import "./Wrappable.sol"; contract WrappableToken is StandardToken, Wrappable, Pausable { using SafeMath for uint256; address private _mintingAddress; constructor() {} /* MODIFIERS */ // modifiers use too much bytecode function onlyMintingAddress() internal view { require(_msgSender()==_mintingAddress,"BT01"); } /* INTERFACES */ function totalSupply() public view virtual override returns (uint256) { return super.totalSupply()-super.balanceOf(_mintingAddress); } function balanceOf(address account) public view virtual override returns (uint256) { if(account==_mintingAddress){ return 0; } return super.balanceOf(account); } function balanceWrappable() public view virtual returns (uint256) { return super.balanceOf(_mintingAddress); } //MINTING_ADDRESS function _changeMintingAddress(address newMintingAddress) internal { require(super.balanceOf(newMintingAddress)==0, "BT07"); if(super.balanceOf(_mintingAddress)>0){ _tokenTransfer(_mintingAddress, newMintingAddress, super.balanceOf(_mintingAddress)); } _mintingAddress=newMintingAddress; } function _getMintingAddress() internal view returns (address) { return _mintingAddress; } function _beforeTokenTransfer( ) internal override view { whenNotPaused(); } // EXTERNAL transfer from user to mintingAddress storing btcz recipient address function unwrap(string calldata BTCZrecipient, uint256 amount) external override returns (bool) { _unwrap(msg.sender, BTCZrecipient, amount); return true; } // EXTERNAL transfer from mintingAddress to user storing btcz sender address function wrap(string calldata BTCZsender, address recipient, uint256 amount) external override returns (bool) { onlyMintingAddress(); _wrap(BTCZsender, recipient, amount); return true; } // INTERNAL transfer from user to mintingAddress storing btcz recipient address function _unwrap(address sender, string memory BTCZrecipient, uint256 amount) private { require(sender != _mintingAddress, "BT05"); _tokenTransfer(sender, _mintingAddress, amount); emit UNWRAP(sender, BTCZrecipient, amount); } // INTERNAL transfer from mintingAddress to user storing btcz sender address function _wrap(string memory BTCZsender, address recipient, uint256 amount) private { require(recipient != _mintingAddress, "BT06"); _tokenTransfer(_mintingAddress, recipient, amount); emit WRAP(BTCZsender, recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approved_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Approved_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"}],"name":"Deleted_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Denied_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Denied_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"New_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"New_proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"string","name":"BTCZrecipient","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UNWRAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"BTCZsender","type":"string"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WRAP","type":"event"},{"inputs":[{"internalType":"string","name":"actionString","type":"string"}],"name":"ZDeleteProposal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"actionString","type":"string"}],"name":"ZGetAction","outputs":[{"internalType":"uint8","name":"actionIndex","type":"uint8"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"pct","type":"uint8"},{"internalType":"string","name":"valueType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZGetActionList","outputs":[{"internalType":"string[]","name":"actionList","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"ZGetProposal","outputs":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"minPositive","type":"uint8"},{"internalType":"uint8","name":"minNegative","type":"uint8"},{"internalType":"string","name":"result","type":"string"},{"internalType":"uint256","name":"valueU","type":"uint256"},{"internalType":"address","name":"valueA","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"actionString","type":"string"}],"name":"ZGetProposalIndex","outputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"actionString","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ZPropose","outputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ZProposePause","outputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ZProposeUnpause","outputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"uint8","name":"decision","type":"uint8"}],"name":"ZVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceWrappable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipient","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"transferToN","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"BTCZrecipient","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"BTCZsender","type":"string"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6002610460908152614f4b60f01b61048052608090815260046104a0818152630424130360e41b6104c05260a0526104e0818152634241303160e01b6105005260c052610520818152634254303160e01b6105405260e05261056081815263212a181960e11b61058052610100526105a0818152634254303360e01b6105c052610120526105e08181526310950c0d60e21b6106005261014052610620818152634254303560e01b610640526101605261066081815263212a181b60e11b61068052610180526106a0818152634254303760e01b6106c0526101a0526106e081815263084a860760e31b610700526101c052610720818152634254303960e01b610740526101e052610760818152630425431360e41b61078052610200526107a0818152630425030360e41b6107c052610220526107e0818152634250303160e01b6108005261024052610820818152632128181960e11b6108405261026052610860818152634250303360e01b61088052610280526108a08181526310940c0d60e21b6108c0526102a0526108e0818152634250303560e01b610900526102c052610920818152632128181b60e11b610940526102e052610960818152634250303760e01b61098052610300526109a081815263084a060760e31b6109c052610320526109e0818152634250303960e01b610a005261034052610a20818152630425031360e41b610a405261036052610a60818152634250313160e01b610a805261038052610aa0818152632128189960e11b610ac0526103a052610ae0818152630534d30360e41b610b00526103c052610b2081815263534d303160e01b610b40526103e052610b608181526329a6981960e11b610b805261040052610ba081815263534d303360e01b610bc05261042052610c20604052610be08181526314d34c0d60e21b610c005261044052620002bc91601f62000885565b5060016039556000603c908155604080516101408101825282815260208101839052908101829052606081018290526080810191909152602860a0820181905260c0820152605060e0820181905261010082015260646101208201526200032890603d90600a620008d5565b506040805161018081018252600961014082019081526820a2222fa0a226a4a760b91b610160830152815281518083018352600c81526b2922a6a7ab22afa0a226a4a760a11b6020828101919091528083019190915282518084018452600f81526e4d494e54494e475f4144445245535360881b818301528284015282518084018452600b81526a2820aaa9a2afaa27a5a2a760a91b81830152606083015282518084018452600d81526c2aa72820aaa9a2afaa27a5a2a760991b81830152608083015282518084018452600a8082526926a4a72a2faa27a5a2a760b11b8284015260a08401919091528351808501855281815269212aa9272faa27a5a2a760b11b8184015260c08401528351808501855260108082526f10d2105391d157d05113525397d410d560821b8285015260e0850191909152845180860186529081526f10d2105391d157d513d2d15397d410d560821b818401526101008401528351808501909452600e84526d1350539051d15351539517d410d560921b91840191909152610120820192909252620004c491603e91906200096b565b5060405180606001604052806040518060400160405280600d81526020016c05043543a203120746f2031303609c1b815250815260200160405180604001604052806006815260200165105353d5539560d21b8152508152602001604051806040016040528060078152602001664144445245535360c81b815250815250604890600362000554929190620009a9565b5060405180606001604052806040518060400160405280600681526020016511115392515160d21b81525081526020016040518060400160405280600681526020016541435449564560d01b8152508152602001604051806040016040528060088152602001671054141493d5915160c21b815250815250604b906003620005de929190620009a9565b50348015620005ec57600080fd5b5033600081815260208190526040812081905560028190556003805460ff19169055906200061a906200069a565b146200062a576200062a62000a61565b620006356032603c55565b60005b600a60ff8216101562000693576200067f81603d8360ff16600a811062000663576200066362000a77565b602081049091015460ff601f9092166101000a900416620006cc565b506200068b8162000aa3565b905062000638565b5062000c52565b6000620006b0603754836200071b60201b60201c565b60378054906000620006c28362000ac5565b9091555092915050565b6000620006dc60ff8316620007e7565b1515600003620006ef5750600062000715565b5060ff8281166000908152603a60205260409020805460ff191691831691909117905560015b92915050565b6200072782826200080d565b60008281526036602090815260408083206001600160a01b038516845290915290205460ff1615156001036200075b575050565b60008281526036602081815260408084206001600160a01b0386168552808352908420805460ff1916600190811790915586855292909152600281018054859492909301929082620007ad8362000ac5565b91905055815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6000811580620007f75750606482115b156200080557506000919050565b506001919050565b6000828152603660205260409020600201546200082a906200086e565b6200086a5760405162461bcd60e51b815260040162000861906020808252600490820152634250303960e01b604082015260600190565b60405180910390fd5b5050565b6000603c546000148062000715575050603c541190565b8260328101928215620008c3579160200282015b82811115620008c35782518290620008b2908262000b86565b509160200191906001019062000899565b50620008d1929150620009e7565b5090565b6001830191839082156200095d5791602002820160005b838211156200092c57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620008ec565b80156200095b5782816101000a81549060ff02191690556001016020816000010492830192600103026200092c565b505b50620008d192915062000a08565b82600a8101928215620008c3579160200282015b82811115620008c3578251829062000998908262000b86565b50916020019190600101906200097f565b8260038101928215620008c3579160200282015b82811115620008c35782518290620009d6908262000b86565b5091602001919060010190620009bd565b80821115620008d1576000620009fe828262000a1f565b50600101620009e7565b5b80821115620008d1576000815560010162000a09565b50805462000a2d9062000af7565b6000825580601f1062000a3e575050565b601f01602090049060005260206000209081019062000a5e919062000a08565b50565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff810362000abc5762000abc62000a8d565b60010192915050565b60006001820162000ada5762000ada62000a8d565b5060010190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b0c57607f821691505b60208210810362000b2d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b8157600081815260208120601f850160051c8101602086101562000b5c5750805b601f850160051c820191505b8181101562000b7d5782815560010162000b68565b5050505b505050565b81516001600160401b0381111562000ba25762000ba262000ae1565b62000bba8162000bb3845462000af7565b8462000b33565b602080601f83116001811462000bf2576000841562000bd95750858301515b600019600386901b1c1916600185901b17855562000b7d565b600085815260208120601f198616915b8281101562000c235788860151825594840194600190910190840162000c02565b508582101562000c425787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6135b78062000c626000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a9059cbb11610097578063d59fc26e11610071578063d59fc26e14610415578063dd62ed3e14610428578063f14aed9c14610461578063f53cc24d1461046957600080fd5b8063a9059cbb146103cc578063b05b6723146103df578063d58b2b5e146103f257600080fd5b80639289ff10116100d35780639289ff101461036757806395d89b411461036f578063974cf8d014610390578063a457c2d7146103b957600080fd5b806370a082311461031c57806377bb35591461032f5780638c70c3bd1461035457600080fd5b806324d7806c11610166578063395093511161014057806339509351146102c55780635a5f4644146102d85780635c975abb146102fe57806364d0736d1461030957600080fd5b806324d7806c1461028e578063313ce567146102a157806331ae450b146102b057600080fd5b8063095ea7b3116101a2578063095ea7b31461023f57806318160ddd146102525780631f22a38c1461026857806323b872dd1461027b57600080fd5b806306fdde03146101c957806307bc0bd61461020757806308fa5bf01461022a575b600080fd5b60408051808201909152601081526f2bb930b83832b2102134ba31b7b4b72d60811b60208201525b6040516101fe9190612dde565b60405180910390f35b61021a610215366004612df1565b61047c565b60405190151581526020016101fe565b61023261049b565b6040516101fe9190612e27565b61021a61024d366004612ea5565b6105a6565b61025a6105b3565b6040519081526020016101fe565b61021a610276366004612f11565b6105e5565b61021a610289366004612f53565b610667565b61021a61029c366004612f8f565b6106d7565b604051600881526020016101fe565b6102b86106e4565b6040516101fe9190612faa565b61021a6102d3366004612ea5565b6106f0565b6102eb6102e6366004612ff7565b61072b565b6040516101fe9796959493929190613010565b60035460ff1661021a565b61025a610317366004613073565b610944565b61025a61032a366004612f8f565b61098d565b60035461010090046001600160a01b031660009081526020819052604090205461025a565b61021a610362366004613073565b6109d1565b61025a610a1f565b6040805180820190915260058152643ba12a21ad60d91b60208201526101f1565b60035461010090046001600160a01b03166040516001600160a01b0390911681526020016101fe565b61021a6103c7366004612ea5565b610a3f565b61021a6103da366004612ea5565b610aac565b61025a6103ed3660046130bf565b610ab9565b610405610400366004612f11565b610b19565b6040516101fe9493929190613112565b61021a610423366004613154565b610cc9565b61025a6104363660046131b0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61025a610d21565b61021a610477366004613228565b610d3e565b6000610486610d4d565b610491338484610d94565b5060015b92915050565b60408051600a8082526101608201909252606091816020015b60608152602001906001900390816104b457905050905060005b600a8110156105a257603e81600a81106104ea576104ea6132aa565b0180546104f6906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610522906132c0565b801561056f5780601f106105445761010080835404028352916020019161056f565b820191906000526020600020905b81548152906001019060200180831161055257829003601f168201915b5050505050828281518110610586576105866132aa565b60200260200101819052508061059b9061330a565b90506104ce565b5090565b6000610491338484610eac565b60035461010090046001600160a01b03166000908152602081905260408120546002546105e09190613323565b905090565b60006105ef610d4d565b6000806105fc8585610f8c565b9092509050600081601e81111561061557610615613336565b0361062d5761062433836110ae565b92505050610495565b60405162461bcd60e51b815260040161065e906020808252600490820152630425030360e41b604082015260600190565b60405180910390fd5b60006106748484846110ba565b60408051808201825260048152634245303160e01b6020808301919091526001600160a01b038716600090815260018252838120338252909152918220546106bd91859061117e565b90506106ca853383610eac565b60019150505b9392505050565b60006104956000836111b8565b60606105e060006111e3565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161049191859061072690866111ee565b610eac565b600081815260386020526040812080546002909101546001600160a01b0381169260609260ff600160a81b8404811693600160b01b8104821693869390928392600160a01b810490911690600160c81b9004830b876107b55760405162461bcd60e51b815260040161065e906020808252600490820152634250303160e01b604082015260600190565b604b6107c282600161334c565b60ff16600381106107d5576107d56132aa565b0180546107e1906132c0565b80601f016020809104026020016040519081016040528092919081815260200182805461080d906132c0565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b50505050509550600061086c83611236565b9050600281600281111561088257610882613336565b0361088f57839450610893565b8395505b603e8360ff16600a81106108a9576108a96132aa565b0180546108b5906132c0565b80601f01602080910402602001604051908101604052809291908181526020018280546108e1906132c0565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050995050505050919395979092949650565b600061094e610d4d565b60008061095b8686610f8c565b9092509050600081601e81111561097457610974613336565b0361062d57610984338386611376565b925050506106d0565b6003546000906001600160a01b036101009091048116908316036109b357506000919050565b6001600160a01b038216600090815260208190526040902054610495565b6000610a153385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525087925061148f915050565b5060019392505050565b6000610a29610d4d565b610a31611549565b6105e03360045b6001611376565b600080610a9f83604051806040016040528060048152602001630424530360e41b81525060016000610a6e3390565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054919061117e565b9050610a15338583610eac565b60006104913384846110ba565b6000806000610ac88585610f8c565b9092509050600081601e811115610ae157610ae1613336565b03610b10576001600160a01b0386166000908152603b6020908152604080832060ff8616845290915290205492505b50509392505050565b60006060600060606000610b2d8787610f8c565b9095509050600081601e811115610b4657610b46613336565b0361062d5760ff8086166000908152603a6020526040902054169250603e8560ff16600a8110610b7857610b786132aa565b018054610b84906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb0906132c0565b8015610bfd5780601f10610bd257610100808354040283529160200191610bfd565b820191906000526020600020905b815481529060010190602001808311610be057829003601f168201915b505050505093506048610c0f86611236565b6002811115610c2057610c20613336565b60ff1660038110610c3357610c336132aa565b018054610c3f906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6b906132c0565b8015610cb85780601f10610c8d57610100808354040283529160200191610cb8565b820191906000526020600020905b815481529060010190602001808311610c9b57829003601f168201915b505050505091505092959194509250565b6000610cd3611584565b610d1685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792508691506115d59050565b506001949350505050565b6000610d2b610d4d565b610d3361168c565b6105e0336003610a38565b6000610d1633868686866116c8565b610d586000336111b8565b1515600114610d925760405162461bcd60e51b815260040161065e906020808252600490820152634241303160e01b604082015260600190565b565b600080610da28585856117cb565b9092509050600081601e811115610dbb57610dbb613336565b14600482601e811115610dd057610dd0613336565b60328110610de057610de06132aa565b0190610dff5760405162461bcd60e51b815260040161065e9190613411565b506000848152603860205260408120805460029091015490916001600160a01b03821691600160a01b900460ff169085900b600103610e7e576000610e4482856117e6565b9050801515600103610e6157610e5c88848487611a8b565b610e6d565b610e6d88848487611b6c565b610e7783836110ae565b5050610ea2565b8460000b60001903610ea257610e9687838386611b6c565b610ea082826110ae565b505b5050505050505050565b6001600160a01b038316610eeb5760405162461bcd60e51b815260040161065e906020808252600490820152632122981960e11b604082015260600190565b6001600160a01b038216610f2a5760405162461bcd60e51b815260040161065e906020808252600490820152634245303360e01b604082015260600190565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008060005b600a8160ff16101561109d5761107d603e8260ff16600a8110610fb757610fb76132aa565b018054610fc3906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fef906132c0565b801561103c5780601f106110115761010080835404028352916020019161103c565b820191906000526020600020905b81548152906001019060200180831161101f57829003601f168201915b505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c1192505050565b1561108d579150600090506110a7565b61109681613424565b9050610f92565b506000600d915091505b9250929050565b60006106d08383611c6a565b60035461010090046001600160a01b03166001600160a01b0316836001600160a01b0316036111145760405162461bcd60e51b815260040161065e906020808252600490820152634254303360e01b604082015260600190565b60035461010090046001600160a01b03166001600160a01b0316826001600160a01b03160361116e5760405162461bcd60e51b815260040161065e9060208082526004908201526310950c0d60e21b604082015260600190565b611179838383611ca4565b505050565b600081848411156111a25760405162461bcd60e51b815260040161065e9190612dde565b5060006111af8486613323565b95945050505050565b60009182526036602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606061049582611d40565b6000806111fb8385613443565b9050838110156106d05760405162461bcd60e51b815260040161065e906020808252600490820152630534d30360e41b604082015260600190565b6000600a8260ff161061127c5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21030b1ba34b7b760911b604482015260640161065e565b60008260ff16600981111561129357611293613336565b905060058160098111156112a9576112a9613336565b14806112c6575060068160098111156112c4576112c4613336565b145b806112e2575060038160098111156112e0576112e0613336565b145b806112fe575060048160098111156112fc576112fc613336565b145b1561130c5750600192915050565b600081600981111561132057611320613336565b148061133d5750600181600981111561133b5761133b613336565b145b806113595750600281600981111561135757611357613336565b145b156113675750600292915050565b50600092915050565b50919050565b60008061138284611236565b600281111561139357611393613336565b036113e0576113a182611e12565b15156001146113db5760405162461bcd60e51b815260040161065e906020808252600490820152630425031360e41b604082015260600190565b611400565b600082116114005760405162461bcd60e51b815260040161065e90613456565b6000806114108686600087611e36565b9092509050600081601e81111561142957611429613336565b14600482601e81111561143e5761143e613336565b6032811061144e5761144e6132aa565b019061146d5760405162461bcd60e51b815260040161065e9190613411565b5061147a82878787611e52565b61148686836001610d94565b50949350505050565b6003546001600160a01b036101009091048116908416036114db5760405162461bcd60e51b815260040161065e906020808252600490820152634254303560e01b604082015260600190565b6003546114f890849061010090046001600160a01b031683611ef7565b816040516115069190613474565b6040518091039020836001600160a01b03167fcc9a2b5f13cb8802803bf9b00dcf9b3f32574ad11ebac06a0c9c15ed1c30ce9a83604051610f7f91815260200190565b60035460ff16610d925760405162461bcd60e51b815260040161065e906020808252600490820152632128189960e11b604082015260600190565b60035461010090046001600160a01b0316336001600160a01b031614610d925760405162461bcd60e51b815260040161065e906020808252600490820152634254303160e01b604082015260600190565b6003546001600160a01b036101009091048116908316036116215760405162461bcd60e51b815260040161065e90602080825260049082015263212a181b60e11b604082015260600190565b60035461163d9061010090046001600160a01b03168383611ef7565b816001600160a01b0316836040516116559190613474565b604051908190038120838252907fd61b72522ef7f3a6368e8e1111f1842f86e8e14f181853de7b0369af3532179590602001610f7f565b60035460ff1615610d925760405162461bcd60e51b815260040161065e906020808252600490820152634250313160e01b604082015260600190565b60035461010090046001600160a01b03166001600160a01b0316856001600160a01b0316036117225760405162461bcd60e51b815260040161065e906020808252600490820152634254303360e01b604082015260600190565b8260005b818110156117b55760035461010090046001600160a01b0316868683818110611751576117516132aa565b90506020020160208101906117669190612f8f565b6001600160a01b0316036117a55760405162461bcd60e51b815260040161065e9060208082526004908201526310950c0d60e21b604082015260600190565b6117ae8161330a565b9050611726565b506117c38686868686611f90565b505050505050565b6000806117d98585856120c2565b915091505b935093915050565b6000808360ff1660098111156117fe576117fe613336565b600981111561180f5761180f613336565b036118265761181f600083612228565b9050610495565b60018360ff16600981111561183d5761183d613336565b600981111561184e5761184e613336565b03611867578161185f600082612254565b915050610495565b60058360ff16600981111561187e5761187e613336565b600981111561188f5761188f613336565b036118b4576003546118af9061010090046001600160a01b031683612260565b610491565b60068360ff1660098111156118cb576118cb613336565b60098111156118dc576118dc613336565b036118fc576003546118af9061010090046001600160a01b031683612306565b60028360ff16600981111561191357611913613336565b600981111561192457611924613336565b03611932576118af826123c6565b60038360ff16600981111561194957611949613336565b600981111561195a5761195a613336565b03611967576118af61248f565b60048360ff16600981111561197e5761197e613336565b600981111561198f5761198f613336565b0361199c576118af6124a6565b60078360ff1660098111156119b3576119b3613336565b60098111156119c4576119c4613336565b03611a07576119d560005b836124ba565b506119e060016119cf565b506119eb60026119cf565b506119f660036119cf565b50611a0160046119cf565b50610491565b60088360ff166009811115611a1e57611a1e613336565b6009811115611a2f57611a2f613336565b03611a4957611a3e60056119cf565b50611a0160066119cf565b60098360ff166009811115611a6057611a60613336565b6009811115611a7157611a71613336565b0361062d57611a8060076119cf565b50611a0160086119cf565b6002611a9683611236565b6002811115611aa757611aa7613336565b03611b0b57826001600160a01b0316847f5b4bbc2bbe51171e6be5a850b46896d477851f1ad0128242aa051e135494346f603e8560ff16600a8110611aee57611aee6132aa565b0184604051611afe929190613490565b60405180910390a3611b66565b826001600160a01b0316847f3fb330d797bf86e8b37a87d72ec4fb67a81777ab8d620d82594401d894a762a4603e8560ff16600a8110611b4d57611b4d6132aa565b0184604051611b5d9291906134ba565b60405180910390a35b50505050565b6002611b7783611236565b6002811115611b8857611b88613336565b03611bcf57826001600160a01b0316847fb644961276efc22d03022e10da542b79a616517a7f8ef476dc2a01315dcb07c0603e8560ff16600a8110611aee57611aee6132aa565b826001600160a01b0316847fc769e35087d74303f7f40ff3ecf3a71411ae43ad47c05499590c69e40feaaa3f603e8560ff16600a8110611b4d57611b4d6132aa565b600081604051602001611c249190613474565b6040516020818303038152906040528051906020012083604051602001611c4b9190613474565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b0382166000908152603b6020908152604080832060ff85168452909152812054611c9c8484836124ff565b949350505050565b6001600160a01b038316611cca5760405162461bcd60e51b815260040161065e906134dc565b6001600160a01b038216611cf05760405162461bcd60e51b815260040161065e906134fa565b611cfb838383611ef7565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f7f91815260200190565b6000818152603660205260408120600201546060918167ffffffffffffffff811115611d6e57611d6e613294565b604051908082528060200260200182016040528015611d97578160200160208202803683370190505b50905060005b82811015611e0a57600085815260366020908152604080832084845260010190915290205482516001600160a01b0390911690839083908110611de257611de26132aa565b6001600160a01b0390921660209283029190910190910152611e038161330a565b9050611d9d565b509392505050565b6000811580611e215750606482115b15611e2e57506000919050565b506001919050565b600080611e4586868686612590565b9097909650945050505050565b6002611e5d83611236565b6002811115611e6e57611e6e613336565b03611eb557826001600160a01b0316847f968636a989daf9a1acff01bb466cb735c19306670a6fb1f078e8aacfd8b27fe0603e8560ff16600a8110611aee57611aee6132aa565b826001600160a01b0316847fcfe66055c3bfe5750e634077e4ce5fa995209b92d60dc31440a5da83ec94d907603e8560ff16600a8110611b4d57611b4d6132aa565b611f0283838361270f565b6040805180820182526004815263084a860760e31b6020808301919091526001600160a01b0386166000908152908190529190912054611f4391839061117e565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f7290826111ee565b6001600160a01b038316600090815260208190526040902055505050565b6001600160a01b038516611fb65760405162461bcd60e51b815260040161065e906134dc565b611fc38585858585612717565b8260005b818110156120b9576000868683818110611fe357611fe36132aa565b9050602002016020810190611ff89190612f8f565b6001600160a01b03160361201e5760405162461bcd60e51b815260040161065e906134fa565b858582818110612030576120306132aa565b90506020020160208101906120459190612f8f565b6001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86868581811061208b5761208b6132aa565b905060200201356040516120a191815260200190565b60405180910390a36120b28161330a565b9050611fc7565b50505050505050565b60008281526038602052604081206001015481906120e090866111b8565b15156000036120f557506000905060026117de565b60008481526038602090815260408083206001600160a01b038916845260030190915290205460ff16151560010361213357506000905060146117de565b61213c846128fc565b1515600003612151575060009050600e6117de565b8260ff166001036121a35760008481526038602052604090206002018054600160b81b900460ff1690601761218583613424565b91906101000a81548160ff021916908360ff160217905550506121e3565b8260ff166000036121d75760008481526038602052604090206002018054600160c01b900460ff1690601861218583613424565b506000905060156117de565b60008481526038602090815260408083206001600160a01b03891684526003019091529020805460ff1916600117905561221c84612953565b95600095509350505050565b6000828152603660205260408120600201541515810361224a57506000610495565b6104918383612a0e565b60006106d08383612ad5565b6001600160a01b0382166122865760405162461bcd60e51b815260040161065e906134fa565b600081116122a65760405162461bcd60e51b815260040161065e90613456565b6122b26000838361270f565b6002546122bf90826111ee565b6002556001600160a01b0382166000908152602081905260409020546122e590826111ee565b6001600160a01b0383166000908152602081905260409020555050565b5050565b6001600160a01b03821661232c5760405162461bcd60e51b815260040161065e906134dc565b6000811161234c5760405162461bcd60e51b815260040161065e90613456565b6123588260008361270f565b6040805180820182526004815263084a860760e31b6020808301919091526001600160a01b038516600090815290819052919091205461239991839061117e565b6001600160a01b0383166000908152602081905260409020556002546123bf9082612c38565b6002555050565b6001600160a01b038116600090815260208190526040902054156124155760405162461bcd60e51b815260040161065e906020808252600490820152634254303760e01b604082015260600190565b60035461010090046001600160a01b031660009081526020819052604081205411156124675760035461010090046001600160a01b031660008181526020819052604090205461246791908390611ef7565b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b61249761168c565b6003805460ff19166001179055565b6124ae611549565b6003805460ff19169055565b60006124c88260ff16611e12565b15156000036124d957506000610495565b5060ff9182166000908152603a60205260409020805460ff191691909216179055600190565b600061250a826128fc565b151560000361251b575060006106d0565b600082815260386020526040812060020154600160c81b9004810b900361255f576000828152603860205260409020600201805460ff60c81b191660ff60c81b1790555b506001600160a01b0383166000908152603b6020908152604080832060ff8616845290915281205560019392505050565b60008281526036602052604081206002015481906125ae85886111b8565b15156000036125c557600060029250925050612706565b6001600160a01b0387166000908152603b6020908152604080832060ff8a168452909152902054156125ff57600060109250925050612706565b8060000361261557600060119250925050612706565b60ff8087166000908152603a6020526040812054909116900361264057600060139250925050612706565b603980549060006126508361330a565b9091555060ff8088166000908152603a602052604090205491945061267791839116612c61565b60008581526038602090815260408083206002810180548b835560019092018c90556001600160a01b038e1661ffff60a81b19909216600160b01b60ff9788160260ff60a81b191617600160a81b97871697909702969096176001600160a81b0319168117600160a01b958d1695860217909555938252603b8152838220928252919091529081208490559150505b94509492505050565b611179612cc4565b61271f612cc4565b828181146127585760405162461bcd60e51b815260040161065e90602080825260049082015263212a181960e11b604082015260600190565b6001600160a01b03861660009081526020819052604081205490805b83811015612863576127a7868683818110612791576127916132aa565b90506020020135836111ee90919063ffffffff16565b915061280f8686838181106127be576127be6132aa565b905060200201356000808b8b868181106127da576127da6132aa565b90506020020160208101906127ef9190612f8f565b6001600160a01b03168152602081019190915260400160002054906111ee565b6000808a8a85818110612824576128246132aa565b90506020020160208101906128399190612f8f565b6001600160a01b0316815260208101919091526040016000205561285c8161330a565b9050612774565b508082101561289d5760405162461bcd60e51b815260040161065e90602080825260049082015263084a860760e31b604082015260600190565b6040805180820182526004815263084a860760e31b6020808301919091526001600160a01b038b1660009081529081905291909120546128de91839061117e565b6001600160a01b038916600090815260208190526040902055610ea2565b600081815260386020526040812060020154600160a81b900460ff161580159061293e5750600082815260386020526040812060020154600160c81b9004900b155b1561294b57506001919050565b506000919050565b60008181526038602052604081206002015460ff600160a81b82048116600160b81b90920416106129b05761298782612ccc565b50506000908152603860205260409020600201805460ff60c81b1916600160c81b179055600190565b60008281526038602052604090206002015460ff600160b01b82048116600160c01b909204161061294b576129e482612ccc565b50506000908152603860205260409020600201805460ff60c81b191660ff60c81b17905560001990565b612a188282612cfe565b60008281526036602090815260408083206001600160a01b038516845290915290205460ff161515600103612a4b575050565b60008281526036602081815260408084206001600160a01b0386168552808352908420805460ff1916600190811790915586855292909152600281018054859492909301929082612a9b8361330a565b91905055815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6000612ae18383612d4e565b60008381526036602090815260408083206001600160a01b038616845290915281205460ff1615159003612b1757506001610495565b600083815260366020526040902060029081015490811015612b3d576000915050610495565b60008481526036602090815260408083206001600160a01b03871684529091528120805460ff191690555b81811015612c2d5760008581526036602090815260408083208484526001019091529020546001600160a01b03808616911603612c1d57600085815260366020526040812060010190612bba84613518565b808252602080830193909352604091820160009081205489825260368086528483209683526001878101875294832080546001600160a01b0319166001600160a01b03909316929092179091559089905290925260029092015591506104959050565b612c268161330a565b9050612b68565b506000949350505050565b60006106d0838360405180604001604052806004815260200163534d303160e01b81525061117e565b600080806064612c71858261352f565b612c7e9060ff1687613548565b612c88919061355f565b90506000612c9960ff831687613323565b90508060ff16600003612caa575060015b8160ff16600003612cba57600191505b9590945092505050565b610d9261168c565b6000818152603860205260408120600201546001600160a01b03811690600160a01b900460ff16611c9c8282866124ff565b600082815260366020526040902060020154612d1990612d78565b6123025760405162461bcd60e51b815260040161065e906020808252600490820152634250303960e01b604082015260600190565b60005b600a8160ff16101561117957612d6782826110ae565b50612d7181613424565b9050612d51565b6000603c5460001480610495575050603c541190565b60005b83811015612da9578181015183820152602001612d91565b50506000910152565b60008151808452612dca816020860160208601612d8e565b601f01601f19169290920160200192915050565b6020815260006106d06020830184612db2565b60008060408385031215612e0457600080fd5b82359150602083013560ff81168114612e1c57600080fd5b809150509250929050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612e7c57603f19888603018452612e6a858351612db2565b94509285019290850190600101612e4e565b5092979650505050505050565b80356001600160a01b0381168114612ea057600080fd5b919050565b60008060408385031215612eb857600080fd5b612ec183612e89565b946020939093013593505050565b60008083601f840112612ee157600080fd5b50813567ffffffffffffffff811115612ef957600080fd5b6020830191508360208285010111156110a757600080fd5b60008060208385031215612f2457600080fd5b823567ffffffffffffffff811115612f3b57600080fd5b612f4785828601612ecf565b90969095509350505050565b600080600060608486031215612f6857600080fd5b612f7184612e89565b9250612f7f60208501612e89565b9150604084013590509250925092565b600060208284031215612fa157600080fd5b6106d082612e89565b6020808252825182820181905260009190848201906040850190845b81811015612feb5783516001600160a01b031683529284019291840191600101612fc6565b50909695505050505050565b60006020828403121561300957600080fd5b5035919050565b600060018060a01b03808a16835260e0602084015261303260e084018a612db2565b60ff8916604085015260ff8816606085015283810360808501526130568188612db2565b60a0850196909652509290921660c0909101525095945050505050565b60008060006040848603121561308857600080fd5b833567ffffffffffffffff81111561309f57600080fd5b6130ab86828701612ecf565b909790965060209590950135949350505050565b6000806000604084860312156130d457600080fd5b6130dd84612e89565b9250602084013567ffffffffffffffff8111156130f957600080fd5b61310586828701612ecf565b9497909650939450505050565b60ff8516815260806020820152600061312e6080830186612db2565b60ff8516604084015282810360608401526131498185612db2565b979650505050505050565b6000806000806060858703121561316a57600080fd5b843567ffffffffffffffff81111561318157600080fd5b61318d87828801612ecf565b90955093506131a0905060208601612e89565b9396929550929360400135925050565b600080604083850312156131c357600080fd5b6131cc83612e89565b91506131da60208401612e89565b90509250929050565b60008083601f8401126131f557600080fd5b50813567ffffffffffffffff81111561320d57600080fd5b6020830191508360208260051b85010111156110a757600080fd5b6000806000806040858703121561323e57600080fd5b843567ffffffffffffffff8082111561325657600080fd5b613262888389016131e3565b9096509450602087013591508082111561327b57600080fd5b50613288878288016131e3565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600181811c908216806132d457607f821691505b60208210810361137057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161331c5761331c6132f4565b5060010190565b81810381811115610495576104956132f4565b634e487b7160e01b600052602160045260246000fd5b600081810b9083900b01607f8113607f1982121715610495576104956132f4565b8054600090600181811c908083168061338757607f831692505b602080841082036133a857634e487b7160e01b600052602260045260246000fd5b838852602088018280156133c357600181146133d957613404565b60ff198716825285151560051b82019750613404565b60008981526020902060005b878110156133fe578154848201529086019084016133e5565b83019850505b5050505050505092915050565b6020815260006106d0602083018461336d565b600060ff821660ff810361343a5761343a6132f4565b60010192915050565b80820180821115610495576104956132f4565b6020808252600490820152630424130360e41b604082015260600190565b60008251613486818460208701612d8e565b9190910192915050565b6040815260006134a3604083018561336d565b905060018060a01b03831660208301529392505050565b6040815260006134cd604083018561336d565b90508260208301529392505050565b6020808252600490820152634254313160e01b604082015260600190565b6020808252600490820152630425431360e41b604082015260600190565b600081613527576135276132f4565b506000190190565b60ff8281168282160390811115610495576104956132f4565b8082028115828204841417610495576104956132f4565b60008261357c57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212208e01b0e934ad6baba515bce91c9bd2dacfb659abd22c33d587c862a8cfd6e10264736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a9059cbb11610097578063d59fc26e11610071578063d59fc26e14610415578063dd62ed3e14610428578063f14aed9c14610461578063f53cc24d1461046957600080fd5b8063a9059cbb146103cc578063b05b6723146103df578063d58b2b5e146103f257600080fd5b80639289ff10116100d35780639289ff101461036757806395d89b411461036f578063974cf8d014610390578063a457c2d7146103b957600080fd5b806370a082311461031c57806377bb35591461032f5780638c70c3bd1461035457600080fd5b806324d7806c11610166578063395093511161014057806339509351146102c55780635a5f4644146102d85780635c975abb146102fe57806364d0736d1461030957600080fd5b806324d7806c1461028e578063313ce567146102a157806331ae450b146102b057600080fd5b8063095ea7b3116101a2578063095ea7b31461023f57806318160ddd146102525780631f22a38c1461026857806323b872dd1461027b57600080fd5b806306fdde03146101c957806307bc0bd61461020757806308fa5bf01461022a575b600080fd5b60408051808201909152601081526f2bb930b83832b2102134ba31b7b4b72d60811b60208201525b6040516101fe9190612dde565b60405180910390f35b61021a610215366004612df1565b61047c565b60405190151581526020016101fe565b61023261049b565b6040516101fe9190612e27565b61021a61024d366004612ea5565b6105a6565b61025a6105b3565b6040519081526020016101fe565b61021a610276366004612f11565b6105e5565b61021a610289366004612f53565b610667565b61021a61029c366004612f8f565b6106d7565b604051600881526020016101fe565b6102b86106e4565b6040516101fe9190612faa565b61021a6102d3366004612ea5565b6106f0565b6102eb6102e6366004612ff7565b61072b565b6040516101fe9796959493929190613010565b60035460ff1661021a565b61025a610317366004613073565b610944565b61025a61032a366004612f8f565b61098d565b60035461010090046001600160a01b031660009081526020819052604090205461025a565b61021a610362366004613073565b6109d1565b61025a610a1f565b6040805180820190915260058152643ba12a21ad60d91b60208201526101f1565b60035461010090046001600160a01b03166040516001600160a01b0390911681526020016101fe565b61021a6103c7366004612ea5565b610a3f565b61021a6103da366004612ea5565b610aac565b61025a6103ed3660046130bf565b610ab9565b610405610400366004612f11565b610b19565b6040516101fe9493929190613112565b61021a610423366004613154565b610cc9565b61025a6104363660046131b0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61025a610d21565b61021a610477366004613228565b610d3e565b6000610486610d4d565b610491338484610d94565b5060015b92915050565b60408051600a8082526101608201909252606091816020015b60608152602001906001900390816104b457905050905060005b600a8110156105a257603e81600a81106104ea576104ea6132aa565b0180546104f6906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610522906132c0565b801561056f5780601f106105445761010080835404028352916020019161056f565b820191906000526020600020905b81548152906001019060200180831161055257829003601f168201915b5050505050828281518110610586576105866132aa565b60200260200101819052508061059b9061330a565b90506104ce565b5090565b6000610491338484610eac565b60035461010090046001600160a01b03166000908152602081905260408120546002546105e09190613323565b905090565b60006105ef610d4d565b6000806105fc8585610f8c565b9092509050600081601e81111561061557610615613336565b0361062d5761062433836110ae565b92505050610495565b60405162461bcd60e51b815260040161065e906020808252600490820152630425030360e41b604082015260600190565b60405180910390fd5b60006106748484846110ba565b60408051808201825260048152634245303160e01b6020808301919091526001600160a01b038716600090815260018252838120338252909152918220546106bd91859061117e565b90506106ca853383610eac565b60019150505b9392505050565b60006104956000836111b8565b60606105e060006111e3565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161049191859061072690866111ee565b610eac565b600081815260386020526040812080546002909101546001600160a01b0381169260609260ff600160a81b8404811693600160b01b8104821693869390928392600160a01b810490911690600160c81b9004830b876107b55760405162461bcd60e51b815260040161065e906020808252600490820152634250303160e01b604082015260600190565b604b6107c282600161334c565b60ff16600381106107d5576107d56132aa565b0180546107e1906132c0565b80601f016020809104026020016040519081016040528092919081815260200182805461080d906132c0565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b50505050509550600061086c83611236565b9050600281600281111561088257610882613336565b0361088f57839450610893565b8395505b603e8360ff16600a81106108a9576108a96132aa565b0180546108b5906132c0565b80601f01602080910402602001604051908101604052809291908181526020018280546108e1906132c0565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050995050505050919395979092949650565b600061094e610d4d565b60008061095b8686610f8c565b9092509050600081601e81111561097457610974613336565b0361062d57610984338386611376565b925050506106d0565b6003546000906001600160a01b036101009091048116908316036109b357506000919050565b6001600160a01b038216600090815260208190526040902054610495565b6000610a153385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525087925061148f915050565b5060019392505050565b6000610a29610d4d565b610a31611549565b6105e03360045b6001611376565b600080610a9f83604051806040016040528060048152602001630424530360e41b81525060016000610a6e3390565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054919061117e565b9050610a15338583610eac565b60006104913384846110ba565b6000806000610ac88585610f8c565b9092509050600081601e811115610ae157610ae1613336565b03610b10576001600160a01b0386166000908152603b6020908152604080832060ff8616845290915290205492505b50509392505050565b60006060600060606000610b2d8787610f8c565b9095509050600081601e811115610b4657610b46613336565b0361062d5760ff8086166000908152603a6020526040902054169250603e8560ff16600a8110610b7857610b786132aa565b018054610b84906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb0906132c0565b8015610bfd5780601f10610bd257610100808354040283529160200191610bfd565b820191906000526020600020905b815481529060010190602001808311610be057829003601f168201915b505050505093506048610c0f86611236565b6002811115610c2057610c20613336565b60ff1660038110610c3357610c336132aa565b018054610c3f906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6b906132c0565b8015610cb85780601f10610c8d57610100808354040283529160200191610cb8565b820191906000526020600020905b815481529060010190602001808311610c9b57829003601f168201915b505050505091505092959194509250565b6000610cd3611584565b610d1685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792508691506115d59050565b506001949350505050565b6000610d2b610d4d565b610d3361168c565b6105e0336003610a38565b6000610d1633868686866116c8565b610d586000336111b8565b1515600114610d925760405162461bcd60e51b815260040161065e906020808252600490820152634241303160e01b604082015260600190565b565b600080610da28585856117cb565b9092509050600081601e811115610dbb57610dbb613336565b14600482601e811115610dd057610dd0613336565b60328110610de057610de06132aa565b0190610dff5760405162461bcd60e51b815260040161065e9190613411565b506000848152603860205260408120805460029091015490916001600160a01b03821691600160a01b900460ff169085900b600103610e7e576000610e4482856117e6565b9050801515600103610e6157610e5c88848487611a8b565b610e6d565b610e6d88848487611b6c565b610e7783836110ae565b5050610ea2565b8460000b60001903610ea257610e9687838386611b6c565b610ea082826110ae565b505b5050505050505050565b6001600160a01b038316610eeb5760405162461bcd60e51b815260040161065e906020808252600490820152632122981960e11b604082015260600190565b6001600160a01b038216610f2a5760405162461bcd60e51b815260040161065e906020808252600490820152634245303360e01b604082015260600190565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008060005b600a8160ff16101561109d5761107d603e8260ff16600a8110610fb757610fb76132aa565b018054610fc3906132c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fef906132c0565b801561103c5780601f106110115761010080835404028352916020019161103c565b820191906000526020600020905b81548152906001019060200180831161101f57829003601f168201915b505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c1192505050565b1561108d579150600090506110a7565b61109681613424565b9050610f92565b506000600d915091505b9250929050565b60006106d08383611c6a565b60035461010090046001600160a01b03166001600160a01b0316836001600160a01b0316036111145760405162461bcd60e51b815260040161065e906020808252600490820152634254303360e01b604082015260600190565b60035461010090046001600160a01b03166001600160a01b0316826001600160a01b03160361116e5760405162461bcd60e51b815260040161065e9060208082526004908201526310950c0d60e21b604082015260600190565b611179838383611ca4565b505050565b600081848411156111a25760405162461bcd60e51b815260040161065e9190612dde565b5060006111af8486613323565b95945050505050565b60009182526036602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606061049582611d40565b6000806111fb8385613443565b9050838110156106d05760405162461bcd60e51b815260040161065e906020808252600490820152630534d30360e41b604082015260600190565b6000600a8260ff161061127c5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21030b1ba34b7b760911b604482015260640161065e565b60008260ff16600981111561129357611293613336565b905060058160098111156112a9576112a9613336565b14806112c6575060068160098111156112c4576112c4613336565b145b806112e2575060038160098111156112e0576112e0613336565b145b806112fe575060048160098111156112fc576112fc613336565b145b1561130c5750600192915050565b600081600981111561132057611320613336565b148061133d5750600181600981111561133b5761133b613336565b145b806113595750600281600981111561135757611357613336565b145b156113675750600292915050565b50600092915050565b50919050565b60008061138284611236565b600281111561139357611393613336565b036113e0576113a182611e12565b15156001146113db5760405162461bcd60e51b815260040161065e906020808252600490820152630425031360e41b604082015260600190565b611400565b600082116114005760405162461bcd60e51b815260040161065e90613456565b6000806114108686600087611e36565b9092509050600081601e81111561142957611429613336565b14600482601e81111561143e5761143e613336565b6032811061144e5761144e6132aa565b019061146d5760405162461bcd60e51b815260040161065e9190613411565b5061147a82878787611e52565b61148686836001610d94565b50949350505050565b6003546001600160a01b036101009091048116908416036114db5760405162461bcd60e51b815260040161065e906020808252600490820152634254303560e01b604082015260600190565b6003546114f890849061010090046001600160a01b031683611ef7565b816040516115069190613474565b6040518091039020836001600160a01b03167fcc9a2b5f13cb8802803bf9b00dcf9b3f32574ad11ebac06a0c9c15ed1c30ce9a83604051610f7f91815260200190565b60035460ff16610d925760405162461bcd60e51b815260040161065e906020808252600490820152632128189960e11b604082015260600190565b60035461010090046001600160a01b0316336001600160a01b031614610d925760405162461bcd60e51b815260040161065e906020808252600490820152634254303160e01b604082015260600190565b6003546001600160a01b036101009091048116908316036116215760405162461bcd60e51b815260040161065e90602080825260049082015263212a181b60e11b604082015260600190565b60035461163d9061010090046001600160a01b03168383611ef7565b816001600160a01b0316836040516116559190613474565b604051908190038120838252907fd61b72522ef7f3a6368e8e1111f1842f86e8e14f181853de7b0369af3532179590602001610f7f565b60035460ff1615610d925760405162461bcd60e51b815260040161065e906020808252600490820152634250313160e01b604082015260600190565b60035461010090046001600160a01b03166001600160a01b0316856001600160a01b0316036117225760405162461bcd60e51b815260040161065e906020808252600490820152634254303360e01b604082015260600190565b8260005b818110156117b55760035461010090046001600160a01b0316868683818110611751576117516132aa565b90506020020160208101906117669190612f8f565b6001600160a01b0316036117a55760405162461bcd60e51b815260040161065e9060208082526004908201526310950c0d60e21b604082015260600190565b6117ae8161330a565b9050611726565b506117c38686868686611f90565b505050505050565b6000806117d98585856120c2565b915091505b935093915050565b6000808360ff1660098111156117fe576117fe613336565b600981111561180f5761180f613336565b036118265761181f600083612228565b9050610495565b60018360ff16600981111561183d5761183d613336565b600981111561184e5761184e613336565b03611867578161185f600082612254565b915050610495565b60058360ff16600981111561187e5761187e613336565b600981111561188f5761188f613336565b036118b4576003546118af9061010090046001600160a01b031683612260565b610491565b60068360ff1660098111156118cb576118cb613336565b60098111156118dc576118dc613336565b036118fc576003546118af9061010090046001600160a01b031683612306565b60028360ff16600981111561191357611913613336565b600981111561192457611924613336565b03611932576118af826123c6565b60038360ff16600981111561194957611949613336565b600981111561195a5761195a613336565b03611967576118af61248f565b60048360ff16600981111561197e5761197e613336565b600981111561198f5761198f613336565b0361199c576118af6124a6565b60078360ff1660098111156119b3576119b3613336565b60098111156119c4576119c4613336565b03611a07576119d560005b836124ba565b506119e060016119cf565b506119eb60026119cf565b506119f660036119cf565b50611a0160046119cf565b50610491565b60088360ff166009811115611a1e57611a1e613336565b6009811115611a2f57611a2f613336565b03611a4957611a3e60056119cf565b50611a0160066119cf565b60098360ff166009811115611a6057611a60613336565b6009811115611a7157611a71613336565b0361062d57611a8060076119cf565b50611a0160086119cf565b6002611a9683611236565b6002811115611aa757611aa7613336565b03611b0b57826001600160a01b0316847f5b4bbc2bbe51171e6be5a850b46896d477851f1ad0128242aa051e135494346f603e8560ff16600a8110611aee57611aee6132aa565b0184604051611afe929190613490565b60405180910390a3611b66565b826001600160a01b0316847f3fb330d797bf86e8b37a87d72ec4fb67a81777ab8d620d82594401d894a762a4603e8560ff16600a8110611b4d57611b4d6132aa565b0184604051611b5d9291906134ba565b60405180910390a35b50505050565b6002611b7783611236565b6002811115611b8857611b88613336565b03611bcf57826001600160a01b0316847fb644961276efc22d03022e10da542b79a616517a7f8ef476dc2a01315dcb07c0603e8560ff16600a8110611aee57611aee6132aa565b826001600160a01b0316847fc769e35087d74303f7f40ff3ecf3a71411ae43ad47c05499590c69e40feaaa3f603e8560ff16600a8110611b4d57611b4d6132aa565b600081604051602001611c249190613474565b6040516020818303038152906040528051906020012083604051602001611c4b9190613474565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b0382166000908152603b6020908152604080832060ff85168452909152812054611c9c8484836124ff565b949350505050565b6001600160a01b038316611cca5760405162461bcd60e51b815260040161065e906134dc565b6001600160a01b038216611cf05760405162461bcd60e51b815260040161065e906134fa565b611cfb838383611ef7565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f7f91815260200190565b6000818152603660205260408120600201546060918167ffffffffffffffff811115611d6e57611d6e613294565b604051908082528060200260200182016040528015611d97578160200160208202803683370190505b50905060005b82811015611e0a57600085815260366020908152604080832084845260010190915290205482516001600160a01b0390911690839083908110611de257611de26132aa565b6001600160a01b0390921660209283029190910190910152611e038161330a565b9050611d9d565b509392505050565b6000811580611e215750606482115b15611e2e57506000919050565b506001919050565b600080611e4586868686612590565b9097909650945050505050565b6002611e5d83611236565b6002811115611e6e57611e6e613336565b03611eb557826001600160a01b0316847f968636a989daf9a1acff01bb466cb735c19306670a6fb1f078e8aacfd8b27fe0603e8560ff16600a8110611aee57611aee6132aa565b826001600160a01b0316847fcfe66055c3bfe5750e634077e4ce5fa995209b92d60dc31440a5da83ec94d907603e8560ff16600a8110611b4d57611b4d6132aa565b611f0283838361270f565b6040805180820182526004815263084a860760e31b6020808301919091526001600160a01b0386166000908152908190529190912054611f4391839061117e565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f7290826111ee565b6001600160a01b038316600090815260208190526040902055505050565b6001600160a01b038516611fb65760405162461bcd60e51b815260040161065e906134dc565b611fc38585858585612717565b8260005b818110156120b9576000868683818110611fe357611fe36132aa565b9050602002016020810190611ff89190612f8f565b6001600160a01b03160361201e5760405162461bcd60e51b815260040161065e906134fa565b858582818110612030576120306132aa565b90506020020160208101906120459190612f8f565b6001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86868581811061208b5761208b6132aa565b905060200201356040516120a191815260200190565b60405180910390a36120b28161330a565b9050611fc7565b50505050505050565b60008281526038602052604081206001015481906120e090866111b8565b15156000036120f557506000905060026117de565b60008481526038602090815260408083206001600160a01b038916845260030190915290205460ff16151560010361213357506000905060146117de565b61213c846128fc565b1515600003612151575060009050600e6117de565b8260ff166001036121a35760008481526038602052604090206002018054600160b81b900460ff1690601761218583613424565b91906101000a81548160ff021916908360ff160217905550506121e3565b8260ff166000036121d75760008481526038602052604090206002018054600160c01b900460ff1690601861218583613424565b506000905060156117de565b60008481526038602090815260408083206001600160a01b03891684526003019091529020805460ff1916600117905561221c84612953565b95600095509350505050565b6000828152603660205260408120600201541515810361224a57506000610495565b6104918383612a0e565b60006106d08383612ad5565b6001600160a01b0382166122865760405162461bcd60e51b815260040161065e906134fa565b600081116122a65760405162461bcd60e51b815260040161065e90613456565b6122b26000838361270f565b6002546122bf90826111ee565b6002556001600160a01b0382166000908152602081905260409020546122e590826111ee565b6001600160a01b0383166000908152602081905260409020555050565b5050565b6001600160a01b03821661232c5760405162461bcd60e51b815260040161065e906134dc565b6000811161234c5760405162461bcd60e51b815260040161065e90613456565b6123588260008361270f565b6040805180820182526004815263084a860760e31b6020808301919091526001600160a01b038516600090815290819052919091205461239991839061117e565b6001600160a01b0383166000908152602081905260409020556002546123bf9082612c38565b6002555050565b6001600160a01b038116600090815260208190526040902054156124155760405162461bcd60e51b815260040161065e906020808252600490820152634254303760e01b604082015260600190565b60035461010090046001600160a01b031660009081526020819052604081205411156124675760035461010090046001600160a01b031660008181526020819052604090205461246791908390611ef7565b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b61249761168c565b6003805460ff19166001179055565b6124ae611549565b6003805460ff19169055565b60006124c88260ff16611e12565b15156000036124d957506000610495565b5060ff9182166000908152603a60205260409020805460ff191691909216179055600190565b600061250a826128fc565b151560000361251b575060006106d0565b600082815260386020526040812060020154600160c81b9004810b900361255f576000828152603860205260409020600201805460ff60c81b191660ff60c81b1790555b506001600160a01b0383166000908152603b6020908152604080832060ff8616845290915281205560019392505050565b60008281526036602052604081206002015481906125ae85886111b8565b15156000036125c557600060029250925050612706565b6001600160a01b0387166000908152603b6020908152604080832060ff8a168452909152902054156125ff57600060109250925050612706565b8060000361261557600060119250925050612706565b60ff8087166000908152603a6020526040812054909116900361264057600060139250925050612706565b603980549060006126508361330a565b9091555060ff8088166000908152603a602052604090205491945061267791839116612c61565b60008581526038602090815260408083206002810180548b835560019092018c90556001600160a01b038e1661ffff60a81b19909216600160b01b60ff9788160260ff60a81b191617600160a81b97871697909702969096176001600160a81b0319168117600160a01b958d1695860217909555938252603b8152838220928252919091529081208490559150505b94509492505050565b611179612cc4565b61271f612cc4565b828181146127585760405162461bcd60e51b815260040161065e90602080825260049082015263212a181960e11b604082015260600190565b6001600160a01b03861660009081526020819052604081205490805b83811015612863576127a7868683818110612791576127916132aa565b90506020020135836111ee90919063ffffffff16565b915061280f8686838181106127be576127be6132aa565b905060200201356000808b8b868181106127da576127da6132aa565b90506020020160208101906127ef9190612f8f565b6001600160a01b03168152602081019190915260400160002054906111ee565b6000808a8a85818110612824576128246132aa565b90506020020160208101906128399190612f8f565b6001600160a01b0316815260208101919091526040016000205561285c8161330a565b9050612774565b508082101561289d5760405162461bcd60e51b815260040161065e90602080825260049082015263084a860760e31b604082015260600190565b6040805180820182526004815263084a860760e31b6020808301919091526001600160a01b038b1660009081529081905291909120546128de91839061117e565b6001600160a01b038916600090815260208190526040902055610ea2565b600081815260386020526040812060020154600160a81b900460ff161580159061293e5750600082815260386020526040812060020154600160c81b9004900b155b1561294b57506001919050565b506000919050565b60008181526038602052604081206002015460ff600160a81b82048116600160b81b90920416106129b05761298782612ccc565b50506000908152603860205260409020600201805460ff60c81b1916600160c81b179055600190565b60008281526038602052604090206002015460ff600160b01b82048116600160c01b909204161061294b576129e482612ccc565b50506000908152603860205260409020600201805460ff60c81b191660ff60c81b17905560001990565b612a188282612cfe565b60008281526036602090815260408083206001600160a01b038516845290915290205460ff161515600103612a4b575050565b60008281526036602081815260408084206001600160a01b0386168552808352908420805460ff1916600190811790915586855292909152600281018054859492909301929082612a9b8361330a565b91905055815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6000612ae18383612d4e565b60008381526036602090815260408083206001600160a01b038616845290915281205460ff1615159003612b1757506001610495565b600083815260366020526040902060029081015490811015612b3d576000915050610495565b60008481526036602090815260408083206001600160a01b03871684529091528120805460ff191690555b81811015612c2d5760008581526036602090815260408083208484526001019091529020546001600160a01b03808616911603612c1d57600085815260366020526040812060010190612bba84613518565b808252602080830193909352604091820160009081205489825260368086528483209683526001878101875294832080546001600160a01b0319166001600160a01b03909316929092179091559089905290925260029092015591506104959050565b612c268161330a565b9050612b68565b506000949350505050565b60006106d0838360405180604001604052806004815260200163534d303160e01b81525061117e565b600080806064612c71858261352f565b612c7e9060ff1687613548565b612c88919061355f565b90506000612c9960ff831687613323565b90508060ff16600003612caa575060015b8160ff16600003612cba57600191505b9590945092505050565b610d9261168c565b6000818152603860205260408120600201546001600160a01b03811690600160a01b900460ff16611c9c8282866124ff565b600082815260366020526040902060020154612d1990612d78565b6123025760405162461bcd60e51b815260040161065e906020808252600490820152634250303960e01b604082015260600190565b60005b600a8160ff16101561117957612d6782826110ae565b50612d7181613424565b9050612d51565b6000603c5460001480610495575050603c541190565b60005b83811015612da9578181015183820152602001612d91565b50506000910152565b60008151808452612dca816020860160208601612d8e565b601f01601f19169290920160200192915050565b6020815260006106d06020830184612db2565b60008060408385031215612e0457600080fd5b82359150602083013560ff81168114612e1c57600080fd5b809150509250929050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612e7c57603f19888603018452612e6a858351612db2565b94509285019290850190600101612e4e565b5092979650505050505050565b80356001600160a01b0381168114612ea057600080fd5b919050565b60008060408385031215612eb857600080fd5b612ec183612e89565b946020939093013593505050565b60008083601f840112612ee157600080fd5b50813567ffffffffffffffff811115612ef957600080fd5b6020830191508360208285010111156110a757600080fd5b60008060208385031215612f2457600080fd5b823567ffffffffffffffff811115612f3b57600080fd5b612f4785828601612ecf565b90969095509350505050565b600080600060608486031215612f6857600080fd5b612f7184612e89565b9250612f7f60208501612e89565b9150604084013590509250925092565b600060208284031215612fa157600080fd5b6106d082612e89565b6020808252825182820181905260009190848201906040850190845b81811015612feb5783516001600160a01b031683529284019291840191600101612fc6565b50909695505050505050565b60006020828403121561300957600080fd5b5035919050565b600060018060a01b03808a16835260e0602084015261303260e084018a612db2565b60ff8916604085015260ff8816606085015283810360808501526130568188612db2565b60a0850196909652509290921660c0909101525095945050505050565b60008060006040848603121561308857600080fd5b833567ffffffffffffffff81111561309f57600080fd5b6130ab86828701612ecf565b909790965060209590950135949350505050565b6000806000604084860312156130d457600080fd5b6130dd84612e89565b9250602084013567ffffffffffffffff8111156130f957600080fd5b61310586828701612ecf565b9497909650939450505050565b60ff8516815260806020820152600061312e6080830186612db2565b60ff8516604084015282810360608401526131498185612db2565b979650505050505050565b6000806000806060858703121561316a57600080fd5b843567ffffffffffffffff81111561318157600080fd5b61318d87828801612ecf565b90955093506131a0905060208601612e89565b9396929550929360400135925050565b600080604083850312156131c357600080fd5b6131cc83612e89565b91506131da60208401612e89565b90509250929050565b60008083601f8401126131f557600080fd5b50813567ffffffffffffffff81111561320d57600080fd5b6020830191508360208260051b85010111156110a757600080fd5b6000806000806040858703121561323e57600080fd5b843567ffffffffffffffff8082111561325657600080fd5b613262888389016131e3565b9096509450602087013591508082111561327b57600080fd5b50613288878288016131e3565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600181811c908216806132d457607f821691505b60208210810361137057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161331c5761331c6132f4565b5060010190565b81810381811115610495576104956132f4565b634e487b7160e01b600052602160045260246000fd5b600081810b9083900b01607f8113607f1982121715610495576104956132f4565b8054600090600181811c908083168061338757607f831692505b602080841082036133a857634e487b7160e01b600052602260045260246000fd5b838852602088018280156133c357600181146133d957613404565b60ff198716825285151560051b82019750613404565b60008981526020902060005b878110156133fe578154848201529086019084016133e5565b83019850505b5050505050505092915050565b6020815260006106d0602083018461336d565b600060ff821660ff810361343a5761343a6132f4565b60010192915050565b80820180821115610495576104956132f4565b6020808252600490820152630424130360e41b604082015260600190565b60008251613486818460208701612d8e565b9190910192915050565b6040815260006134a3604083018561336d565b905060018060a01b03831660208301529392505050565b6040815260006134cd604083018561336d565b90508260208301529392505050565b6020808252600490820152634254313160e01b604082015260600190565b6020808252600490820152630425431360e41b604082015260600190565b600081613527576135276132f4565b506000190190565b60ff8281168282160390811115610495576104956132f4565b8082028115828204841417610495576104956132f4565b60008261357c57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212208e01b0e934ad6baba515bce91c9bd2dacfb659abd22c33d587c862a8cfd6e10264736f6c63430008110033
Deployed Bytecode Sourcemap
171:13584:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2233:105:10;2320:10;;;;;;;;;;;;-1:-1:-1;;;2320:10:10;;;;2233:105;;;;;;;:::i;:::-;;;;;;;;5037:193:14;;;;;;:::i;:::-;;:::i;:::-;;;1432:14:16;;1425:22;1407:41;;1395:2;1380:18;5037:193:14;1267:187:16;3880:255:14;;;:::i;:::-;;;;;;;:::i;4649:169:10:-;;;;;;:::i;:::-;;:::i;577:158:13:-;;;:::i;:::-;;;2850:25:16;;;2838:2;2823:18;577:158:13;2704:177:16;1364:320:14;;;;;;:::i;:::-;;:::i;5300:381:10:-;;;;;;:::i;:::-;;:::i;973:125:14:-;;;;;;:::i;:::-;;:::i;3205:105:10:-;;;282:1:11;4321:36:16;;4309:2;4294:18;3205:105:10;4179:184:16;807:115:14;;;:::i;:::-;;;;;;;:::i;6090:218:10:-;;;;;;:::i;:::-;;:::i;1743:1053:14:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;899:86:6:-;970:7;;;;899:86;;4197:353:14;;;;;;:::i;:::-;;:::i;741:206:13:-;;;;;;:::i;:::-;;:::i;953:124::-;1053:15;;;;;-1:-1:-1;;;;;1053:15:13;1010:7;3647:18:10;;;;;;;;;;;953:124:13;577:158;1741:179;;;;;;:::i;:::-;;:::i;4812:201:14:-;;;:::i;2457:109:10:-;2546:12;;;;;;;;;;;;-1:-1:-1;;;2546:12:10;;;;2457:109;;1151:107:14;1520:15:13;;;;;-1:-1:-1;;;;;1520:15:13;1151:107:14;;-1:-1:-1;;;;;6682:32:16;;;6664:51;;6652:2;6637:18;1151:107:14;6518:203:16;6811:296:10;;;;;;:::i;:::-;;:::i;3886:175::-;;;;;;:::i;:::-;;:::i;2885:326:14:-;;;;;;:::i;:::-;;:::i;3264:563::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2010:218:13:-;;;;;;:::i;:::-;;:::i;4351:151:10:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4467:18:10;;;4440:7;4467:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4351:151;4607:199:14;;;:::i;4069:219:10:-;;;;;;:::i;:::-;;:::i;5037:193:14:-;5109:4;5126:11;:9;:11::i;:::-;5148:52;736:10:0;5176:13:14;5191:8;5148:13;:52::i;:::-;-1:-1:-1;5218:4:14;5037:193;;;;;:::o;3880:255::-;3979:33;;;3992:19;3979:33;;;;;;;;;3929:26;;3979:33;;;;;;;;;;;;;;;;;;;;3967:45;;4027:9;4023:105;4046:19;4042:1;:23;4023:105;;;4101:12;4114:1;4101:15;;;;;;;:::i;:::-;;4087:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;4098:1;4087:13;;;;;;;;:::i;:::-;;;;;;:29;;;;4067:3;;;;:::i;:::-;;;4023:105;;;;3880:255;:::o;4649:169:10:-;4732:4;4749:39;736:10:0;4772:7:10;4781:6;4749:8;:39::i;577:158:13:-;701:15;;;;;-1:-1:-1;;;;;701:15:13;638:7;3647:18:10;;;;;;;;;;;3463:12;;665:52:13;;;;:::i;:::-;658:59;;577:158;:::o;1364:320:14:-;1437:4;1454:11;:9;:11::i;:::-;1477:17;1496:13;1513:29;1529:12;;1513:15;:29::i;:::-;1476:66;;-1:-1:-1;1476:66:14;-1:-1:-1;1567:8:14;1556:7;:19;;;;;;;;:::i;:::-;;1553:99;;1599:41;736:10:0;1628:11:14;1599:14;:41::i;:::-;1592:48;;;;;;1553:99;1662:14;;-1:-1:-1;;;1662:14:14;;;;;;11123:2:16;11105:21;;;11162:1;11142:18;;;11135:29;-1:-1:-1;;;11195:2:16;11180:18;;11173:34;11239:2;11224:18;;10921:327;1662:14:14;;;;;;;;5300:381:10;5440:4;5457:36;5467:6;5475:9;5486:6;5457:9;:36::i;:::-;5535:53;;;;;;;;;;;-1:-1:-1;;;5535:53:10;;;;;;;;-1:-1:-1;;;;;5535:19:10;;-1:-1:-1;5535:19:10;;;:11;:19;;;;;736:10:0;5535:33:10;;;;;;;;;:53;;5573:6;;5535:37;:53::i;:::-;5506:82;-1:-1:-1;5599:50:10;5608:6;736:10:0;5630:18:10;5599:8;:50::i;:::-;5669:4;5662:11;;;5300:381;;;;;;:::o;973:125:14:-;1030:4;1055:35;277:1:15;1082:7:14;1055:13;:35::i;807:115::-;851:16;886:28;277:1:15;886:15:14;:28::i;6090:218:10:-;736:10:0;6178:4:10;6227:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6227:34:10;;;;;;;;;;6178:4;;6195:83;;6218:7;;6227:50;;6266:10;6227:38;:50::i;:::-;6195:8;:83::i;1743:1053:14:-;1821:16;2108:26;;;:11;:26;;;;;:32;;2160:35;;;;;-1:-1:-1;;;;;2160:35:14;;;1848:25;;2213:33;-1:-1:-1;;;2269:38:14;;;;;-1:-1:-1;;;2330:38:14;;;;;1848:25;;1821:16;;;;-1:-1:-1;;;2213:33:14;;;;;;-1:-1:-1;;;2391:33:14;;;;2269:38;2445:29;;;;-1:-1:-1;;;2445:29:14;;;;;;11455:2:16;11437:21;;;11494:1;11474:18;;;11467:29;-1:-1:-1;;;11527:2:16;11512:18;;11505:34;11571:2;11556:18;;11253:327;2445:29:14;2492:12;2511:13;:11;2523:1;2511:13;:::i;:::-;2492:34;;;;;;;;;:::i;:::-;;2485:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2537:31;2569:22;2584:6;2569:14;:22::i;:::-;2537:54;-1:-1:-1;2622:23:14;2605:15;:40;;;;;;;;:::i;:::-;;2602:144;;2684:5;2661:30;;2602:144;;;2729:5;2722:12;;2602:144;2768:12;2781:6;2768:20;;;;;;;;;:::i;:::-;;2756:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:779;;;;1743:1053;;;;;;;;;:::o;4197:353::-;4278:21;4312:11;:9;:11::i;:::-;4335:17;4354:13;4371:29;4387:12;;4371:15;:29::i;:::-;4334:66;;-1:-1:-1;4334:66:14;-1:-1:-1;4425:8:14;4414:7;:19;;;;;;;;:::i;:::-;;4411:107;;4457:49;736:10:0;4487:11:14;4500:5;4457:15;:49::i;:::-;4450:56;;;;;;741:206:13;847:15;;815:7;;-1:-1:-1;;;;;847:15:13;;;;;;838:24;;;;835:63;;-1:-1:-1;885:1:13;;741:206;-1:-1:-1;741:206:13:o;835:63::-;-1:-1:-1;;;;;3647:18:10;;3620:7;3647:18;;;;;;;;;;;915:24:13;3546:127:10;1741:179:13;1831:4;1848:42;1856:10;1868:13;;1848:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1883:6:13;;-1:-1:-1;1848:7:13;;-1:-1:-1;;1848:42:13:i;:::-;-1:-1:-1;1908:4:13;1741:179;;;;;:::o;4812:201:14:-;4858:21;4892:11;:9;:11::i;:::-;4914:12;:10;:12::i;:::-;4944:61;736:10:0;4980:20:14;4974:27;5003:1;4944:15;:61::i;6811:296:10:-;6904:4;6921:26;6950:63;6989:15;6950:63;;;;;;;;;;;;;-1:-1:-1;;;6950:63:10;;;:11;:25;6962:12;736:10:0;;656:98;6962:12:10;-1:-1:-1;;;;;6950:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6950:25:10;;;:34;;;;;;;;;;;:63;:38;:63::i;:::-;6921:92;-1:-1:-1;7024:51:10;736:10:0;7047:7:10;7056:18;7024:8;:51::i;3886:175::-;3972:4;3989:42;736:10:0;4013:9:10;4024:6;3989:9;:42::i;2885:326:14:-;2983:21;3018:17;3037:13;3054:29;3070:12;;3054:15;:29::i;:::-;3017:66;;-1:-1:-1;3017:66:14;-1:-1:-1;3108:8:14;3097:7;:19;;;;;;;;:::i;:::-;;3094:110;;-1:-1:-1;;;;;3146:33:14;;;;;;:23;:33;;;;;;;;:46;;;;;;;;;;;;-1:-1:-1;3094:110:14;3006:205;;2885:326;;;;;:::o;3264:563::-;3347:17;3375:25;3411:9;3431:23;3472:13;3521:29;3537:12;;3521:15;:29::i;:::-;3496:54;;-1:-1:-1;3496:54:14;-1:-1:-1;3575:8:14;3564:7;:19;;;;;;;;:::i;:::-;;3561:259;;3233:18:8;;;;3208:5;3233:18;;;:10;:18;;;;;;;3600:29:14;;3656:12;3669:11;3656:25;;;;;;;;;:::i;:::-;;3644:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3706:21;3734:27;3749:11;3734:14;:27::i;:::-;3728:34;;;;;;;;:::i;:::-;3706:57;;;;;;;;;:::i;:::-;;3696:67;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3461:366;3264:563;;;;;;;:::o;2010:218:13:-;2114:4;2131:20;:18;:20::i;:::-;2162:36;2168:10;;2162:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2180:9:13;;-1:-1:-1;2191:6:13;;-1:-1:-1;2162:5:13;;-1:-1:-1;2162:36:13:i;:::-;-1:-1:-1;2216:4:13;2010:218;;;;;;:::o;4607:199:14:-;4650:21;4684:11;:9;:11::i;:::-;4706:15;:13;:15::i;:::-;4739:59;736:10:0;4775:18:14;4769:25;;4069:219:10;4196:4;4213:45;736:10:0;4240:9:10;;4251:6;;4213:12;:45::i;605:116:14:-;659:40;277:1:15;736:10:0;659:13:14;:40::i;:::-;:46;;701:4;659:46;651:62;;;;-1:-1:-1;;;651:62:14;;;;;;11972:2:16;11954:21;;;12011:1;11991:18;;;11984:29;-1:-1:-1;;;12044:2:16;12029:18;;12022:34;12088:2;12073:18;;11770:327;651:62:14;605:116::o;12471:1007::-;12569:11;12582;12595:44;12608:5;12615:13;12630:8;12595:12;:44::i;:::-;12568:71;;-1:-1:-1;12568:71:14;-1:-1:-1;12665:8:14;12658:5;:15;;;;;;;;:::i;:::-;;12675:11;12695:5;12687:14;;;;;;;;:::i;:::-;12675:27;;;;;;;:::i;:::-;;12650:53;;;;;-1:-1:-1;;;12650:53:14;;;;;;;;:::i;:::-;-1:-1:-1;12714:13:14;12794:26;;;:11;:26;;;;;:32;;12846:35;;;;;12794:32;;-1:-1:-1;;;;;12846:35:14;;;-1:-1:-1;;;12899:33:14;;;;;12956:9;;;12846:35;12956:9;12953:518;;12981:13;12995:39;13020:6;13028:5;12995:24;:39::i;:::-;12981:53;-1:-1:-1;13052:14:14;;;13062:4;13052:14;13049:212;;13086:61;13108:13;13123:8;13133:6;13141:5;13086:21;:61::i;:::-;13049:212;;;13186:59;13206:13;13221:8;13231:6;13239:5;13186:19;:59::i;:::-;13275:32;13290:8;13300:6;13275:14;:32::i;:::-;;12966:353;12953:518;;;13327:6;:10;;-1:-1:-1;;13327:10:14;13324:147;;13353:59;13373:13;13388:8;13398:6;13406:5;13353:19;:59::i;:::-;13427:32;13442:8;13452:6;13427:14;:32::i;:::-;;13324:147;12557:921;;;;;12471:1007;;;:::o;11458:318:10:-;-1:-1:-1;;;;;11594:19:10;;11586:36;;;;-1:-1:-1;;;11586:36:10;;;;;;13735:2:16;13717:21;;;13774:1;13754:18;;;13747:29;-1:-1:-1;;;13807:2:16;13792:18;;13785:34;13851:2;13836:18;;13533:327;11586:36:10;-1:-1:-1;;;;;11641:21:10;;11633:38;;;;-1:-1:-1;;;11633:38:10;;;;;;14067:2:16;14049:21;;;14106:1;14086:18;;;14079:29;-1:-1:-1;;;14139:2:16;14124:18;;14117:34;14183:2;14168:18;;13865:327;11633:38:10;-1:-1:-1;;;;;11684:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11736:32;;2850:25:16;;;11736:32:10;;2823:18:16;11736:32:10;;;;;;;;11458:318;;;:::o;5238:314:14:-;5316:5;5323;5345:7;5341:171;5358:19;5356:1;:21;;;5341:171;;;5401:44;5416:12;5429:1;5416:15;;;;;;;;;:::i;:::-;;5401:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5432:12;;5401:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5401:14:14;;-1:-1:-1;;;5401:44:14:i;:::-;5398:103;;;5473:1;-1:-1:-1;5476:8:14;;-1:-1:-1;5465:20:14;;5398:103;5379:3;;;:::i;:::-;;;5341:171;;;;5530:1;5533:10;5522:22;;;;5238:314;;;;;;:::o;2337:152:8:-;2422:4;2446:35;2462:10;2474:6;2446:15;:35::i;5651:270:14:-;1520:15:13;;;;;-1:-1:-1;;;;;1520:15:13;-1:-1:-1;;;;;5758:30:14;:6;-1:-1:-1;;;;;5758:30:14;;5750:47;;;;-1:-1:-1;;;5750:47:14;;;;;;14579:2:16;14561:21;;;14618:1;14598:18;;;14591:29;-1:-1:-1;;;14651:2:16;14636:18;;14629:34;14695:2;14680:18;;14377:327;5750:47:14;1520:15:13;;;;;-1:-1:-1;;;;;1520:15:13;-1:-1:-1;;;;;5816:33:14;:9;-1:-1:-1;;;;;5816:33:14;;5808:50;;;;-1:-1:-1;;;5808:50:14;;;;;;14911:2:16;14893:21;;;14950:1;14930:18;;;14923:29;-1:-1:-1;;;14983:2:16;14968:18;;14961:34;15027:2;15012:18;;14709:327;5808:50:14;5871:42;5887:6;5895:9;5906:6;5871:15;:42::i;:::-;5651:270;;;:::o;346:178:9:-;432:7;464:12;456:6;;;;448:29;;;;-1:-1:-1;;;448:29:9;;;;;;;;:::i;:::-;-1:-1:-1;484:9:9;496:5;500:1;496;:5;:::i;:::-;484:17;346:178;-1:-1:-1;;;;;346:178:9:o;547:164:2:-;639:4;663:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;663:40:2;;;;;;;;;;;;;;;547:164::o;1273:266::-;1350:16;1503:28;1520:10;1503:16;:28::i;90:144:9:-;148:7;;176:5;180:1;176;:5;:::i;:::-;164:17;;201:1;196;:6;;188:23;;;;-1:-1:-1;;;188:23:9;;;;;;15373:2:16;15355:21;;;15412:1;15392:18;;;15385:29;-1:-1:-1;;;15445:2:16;15430:18;;15423:34;15489:2;15474:18;;15171:327;10884:917:14;10945:15;10988:19;10981:6;:26;;;10973:52;;;;-1:-1:-1;;;10973:52:14;;15705:2:16;10973:52:14;;;15687:21:16;15744:2;15724:18;;;15717:30;-1:-1:-1;;;15763:18:16;;;15756:44;15817:18;;10973:52:14;15503:338:16;10973:52:14;11036:18;11062:6;11055:14;;;;;;;;;;:::i;:::-;11036:33;-1:-1:-1;11112:17:14;11099:11;:30;;;;;;;;:::i;:::-;;:77;;;-1:-1:-1;11159:17:14;11146:11;:30;;;;;;;;:::i;:::-;;11099:77;:125;;;-1:-1:-1;11206:18:14;11193:11;:31;;;;;;;;:::i;:::-;;11099:125;:175;;;-1:-1:-1;11254:20:14;11241:11;:33;;;;;;;;:::i;:::-;;11099:175;11082:712;;;-1:-1:-1;11307:22:14;;10884:917;-1:-1:-1;;10884:917:14:o;11082:712::-;11376:16;11363:11;:29;;;;;;;;:::i;:::-;;:78;;;-1:-1:-1;11422:19:14;11409:11;:32;;;;;;;;:::i;:::-;;11363:78;:130;;;-1:-1:-1;11471:22:14;11458:11;:35;;;;;;;;:::i;:::-;;11363:130;11346:448;;;-1:-1:-1;11526:23:14;;10884:917;-1:-1:-1;;10884:917:14:o;11346:448::-;-1:-1:-1;11763:19:14;;10884:917;-1:-1:-1;;10884:917:14:o;11346:448::-;10962:839;10884:917;;;:::o;11809:632::-;11935:7;;11958:22;11973:6;11958:14;:22::i;:::-;:43;;;;;;;;:::i;:::-;;11955:162;;12025:12;12031:5;12025;:12::i;:::-;:18;;12039:4;12025:18;12017:34;;;;-1:-1:-1;;;12017:34:14;;;;;;16048:2:16;16030:21;;;16087:1;16067:18;;;16060:29;-1:-1:-1;;;16120:2:16;16105:18;;16098:34;16164:2;16149:18;;15846:327;12017:34:14;11955:162;;;12096:1;12090:5;:7;12082:23;;;;-1:-1:-1;;;12082:23:14;;;;;;;:::i;:::-;12128:21;12151:11;12164:51;12176:10;12188:6;277:1:15;12209:5:14;12164:11;:51::i;:::-;12127:88;;-1:-1:-1;12127:88:14;-1:-1:-1;12241:8:14;12234:5;:15;;;;;;;;:::i;:::-;;12251:11;12271:5;12263:14;;;;;;;;:::i;:::-;12251:27;;;;;;;:::i;:::-;;12226:53;;;;;-1:-1:-1;;;12226:53:14;;;;;;;;:::i;:::-;;12290:58;12307:13;12322:10;12334:6;12342:5;12290:16;:58::i;:::-;12359:43;12373:10;12385:13;12400:1;12359:13;:43::i;:::-;-1:-1:-1;12420:13:14;11809:632;-1:-1:-1;;;;11809:632:14:o;2326:257:13:-;2441:15;;-1:-1:-1;;;;;2441:15:13;;;;;;2431:25;;;;2423:42;;;;-1:-1:-1;;;2423:42:13;;;;;;16712:2:16;16694:21;;;16751:1;16731:18;;;16724:29;-1:-1:-1;;;16784:2:16;16769:18;;16762:34;16828:2;16813:18;;16510:327;2423:42:13;2503:15;;2480:47;;2495:6;;2503:15;;;-1:-1:-1;;;;;2503:15:13;2520:6;2480:14;:47::i;:::-;2556:13;2541:37;;;;;;:::i;:::-;;;;;;;;2548:6;-1:-1:-1;;;;;2541:37:13;;2571:6;2541:37;;;;2850:25:16;;2838:2;2823:18;;2704:177;1451:80:6;970:7;;;;1498:25;;;;-1:-1:-1;;;1498:25:6;;;;;;17338:2:16;17320:21;;;17377:1;17357:18;;;17350:29;-1:-1:-1;;;17410:2:16;17395:18;;17388:34;17454:2;17439:18;;17136:327;423:108:13;500:15;;;;;-1:-1:-1;;;;;500:15:13;736:10:0;-1:-1:-1;;;;;486:29:13;;478:45;;;;-1:-1:-1;;;478:45:13;;;;;;17670:2:16;17652:21;;;17709:1;17689:18;;;17682:29;-1:-1:-1;;;17742:2:16;17727:18;;17720:34;17786:2;17771:18;;17468:327;2671:265:13;2787:15;;-1:-1:-1;;;;;2787:15:13;;;;;;2774:28;;;;2766:45;;;;-1:-1:-1;;;2766:45:13;;;;;;18002:2:16;17984:21;;;18041:1;18021:18;;;18014:29;-1:-1:-1;;;18074:2:16;18059:18;;18052:34;18118:2;18103:18;;17800:327;2766:45:13;2841:15;;2826:50;;2841:15;;;-1:-1:-1;;;;;2841:15:13;2858:9;2869:6;2826:14;:50::i;:::-;2913:9;-1:-1:-1;;;;;2896:35:13;2901:10;2896:35;;;;;;:::i;:::-;;;;;;;;;2850:25:16;;;2896:35:13;;;2838:2:16;2823:18;2896:35:13;2704:177:16;1180:84:6;970:7;;;;1238:9;1230:26;;;;-1:-1:-1;;;1230:26:6;;;;;;18334:2:16;18316:21;;;18373:1;18353:18;;;18346:29;-1:-1:-1;;;18406:2:16;18391:18;;18384:34;18450:2;18435:18;;18132:327;5979:434:14;1520:15:13;;;;;-1:-1:-1;;;;;1520:15:13;-1:-1:-1;;;;;6129:30:14;:6;-1:-1:-1;;;;;6129:30:14;;6121:47;;;;-1:-1:-1;;;6121:47:14;;;;;;14579:2:16;14561:21;;;14618:1;14598:18;;;14591:29;-1:-1:-1;;;14651:2:16;14636:18;;14629:34;14695:2;14680:18;;14377:327;6121:47:14;6203:9;6179:23;6230:120;6249:15;6247:1;:17;6230:120;;;1520:15:13;;;;;-1:-1:-1;;;;;1520:15:13;6293:9:14;;6303:1;6293:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6293:36:14;;6285:53;;;;-1:-1:-1;;;6285:53:14;;;;;;14911:2:16;14893:21;;;14950:1;14930:18;;;14923:29;-1:-1:-1;;;14983:2:16;14968:18;;14961:34;15027:2;15012:18;;14709:327;6285:53:14;6266:3;;;:::i;:::-;;;6230:120;;;;6360:45;6379:6;6387:9;;6398:6;;6360:18;:45::i;:::-;6110:303;5979:434;;;;;:::o;2148:181:8:-;2252:4;2258:5;2283:38;2289:5;2296:13;2312:8;2283:5;:38::i;:::-;2276:45;;;;2148:181;;;;;;;:::o;8902:1752:14:-;8983:4;;9012:6;9005:14;;;;;;;;;;:::i;:::-;:32;;;;;;;;:::i;:::-;;9002:1623;;9060:53;277:1:15;9105:5:14;9060:16;:53::i;:::-;9053:60;;;;9002:1623;9149:19;9140:6;9133:14;;;;;;;;;;:::i;:::-;:35;;;;;;;;:::i;:::-;;9130:1495;;9217:5;9246:44;9184:16;9217:5;9246:21;:44::i;:::-;9239:51;;;;;9130:1495;9326:17;9317:6;9310:14;;;;;;;;;;:::i;:::-;:33;;;;;;;;:::i;:::-;;9307:1318;;1520:15:13;;9359:33:14;;1520:15:13;;;-1:-1:-1;;;;;1520:15:13;9386:5:14;9359;:33::i;:::-;9307:1318;;;9428:17;9419:6;9412:14;;;;;;;;;;:::i;:::-;:33;;;;;;;;:::i;:::-;;9409:1216;;1520:15:13;;9461:33:14;;1520:15:13;;;-1:-1:-1;;;;;1520:15:13;9488:5:14;9461;:33::i;9409:1216::-;9530:22;9521:6;9514:14;;;;;;;;;;:::i;:::-;:38;;;;;;;;:::i;:::-;;9511:1114;;9568:46;9606:5;9568:21;:46::i;9511:1114::-;9650:18;9641:6;9634:14;;;;;;;;;;:::i;:::-;:34;;;;;;;;:::i;:::-;;9631:994;;9684:8;:6;:8::i;9631:994::-;9728:20;9719:6;9712:14;;;;;;;;;;:::i;:::-;:36;;;;;;;;:::i;:::-;;9709:916;;9764:10;:8;:10::i;9709:916::-;9810:23;9801:6;9794:14;;;;;;;;;;:::i;:::-;:39;;;;;;;;:::i;:::-;;9791:834;;9849:50;9868:16;9862:23;9892:5;9849:12;:50::i;:::-;-1:-1:-1;9914:53:14;9933:19;9927:26;;9914:53;-1:-1:-1;9982:56:14;10001:22;9995:29;;9982:56;-1:-1:-1;10053:52:14;10072:18;10066:25;;10053:52;-1:-1:-1;10120:54:14;10139:20;10133:27;;10120:54;;9791:834;;;10210:23;10201:6;10194:14;;;;;;;;;;:::i;:::-;:39;;;;;;;;:::i;:::-;;10191:434;;10249:51;10268:17;10262:24;;10249:51;-1:-1:-1;10315:51:14;10334:17;10328:24;;10191:434;10402:21;10393:6;10386:14;;;;;;;;;;:::i;:::-;:37;;;;;;;;:::i;:::-;;10383:242;;10439:57;10458:23;10452:30;;10439:57;-1:-1:-1;10511:57:14;10530:23;10524:30;;8392:427;8550:23;8521:27;8536:11;8521:14;:27::i;:::-;:52;;;;;;;;:::i;:::-;;8518:294;;8627:8;-1:-1:-1;;;;;8594:94:14;8612:13;8594:94;8637:12;8650:11;8637:25;;;;;;;;;:::i;:::-;;8680:5;8594:94;;;;;;;:::i;:::-;;;;;;;;8518:294;;;8757:8;-1:-1:-1;;;;;8724:76:14;8742:13;8724:76;8767:12;8780:11;8767:25;;;;;;;;;:::i;:::-;;8794:5;8724:76;;;;;;;:::i;:::-;;;;;;;;8518:294;8392:427;;;;:::o;7959:421::-;8115:23;8086:27;8101:11;8086:14;:27::i;:::-;:52;;;;;;;;:::i;:::-;;8083:290;;8190:8;-1:-1:-1;;;;;8159:92:14;8175:13;8159:92;8200:12;8213:11;8200:25;;;;;;;;;:::i;8083:290::-;8318:8;-1:-1:-1;;;;;8287:74:14;8303:13;8287:74;8328:12;8341:11;8328:25;;;;;;;;;:::i;6473:183::-;6554:4;6643:1;6625:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;6615:32;;;;;;6607:1;6589:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;6579:32;;;;;;:68;6571:77;;6473:183;;;;:::o;5130:234:8:-;-1:-1:-1;;;;;5245:35:8;;5206:4;5245:35;;;:23;:35;;;;;;;;:43;;;;;;;;;;;5306:50;5269:10;5281:6;5245:43;5306:15;:50::i;:::-;5299:57;5130:234;-1:-1:-1;;;;5130:234:8:o;7597:335:10:-;-1:-1:-1;;;;;7737:20:10;;7729:37;;;;-1:-1:-1;;;7729:37:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;7785:23:10;;7777:40;;;;-1:-1:-1;;;7777:40:10;;;;;;;:::i;:::-;7830:41;7845:6;7853:9;7864:6;7830:14;:41::i;:::-;7906:9;-1:-1:-1;;;;;7889:35:10;7898:6;-1:-1:-1;;;;;7889:35:10;;7917:6;7889:35;;;;2850:25:16;;2838:2;2823:18;;2704:177;3209:354:2;3306:11;3318:22;;;:10;:22;;;;;:39;;;3277:16;;3318:39;3395:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3395:18:2;;3368:45;;3428:9;3424:107;3447:3;3443:1;:7;3424:107;;;3483:22;;;;:10;:22;;;;;;;;:36;;;:33;;:36;;;;;;3472:10;;-1:-1:-1;;;;;3483:36:2;;;;3472:7;;3517:1;;3472:10;;;;;;:::i;:::-;-1:-1:-1;;;;;3472:47:2;;;:10;;;;;;;;;;;:47;3452:3;;;:::i;:::-;;;3424:107;;;-1:-1:-1;3548:7:2;3209:354;-1:-1:-1;;;3209:354:2:o;2741:166:8:-;2801:4;2821:6;;;:17;;;2835:3;2831;:7;2821:17;2818:60;;;-1:-1:-1;2861:5:8;;2741:166;-1:-1:-1;2741:166:8:o;2818:60::-;-1:-1:-1;2895:4:8;;2741:166;-1:-1:-1;2741:166:8:o;1576:288::-;1736:21;1759:11;1805:51;1818:10;1830:6;1838:10;1850:5;1805:12;:51::i;:::-;1782:74;;;;-1:-1:-1;1576:288:8;-1:-1:-1;;;;;1576:288:8:o;7535:412:14:-;7688:23;7659:27;7674:11;7659:14;:27::i;:::-;:52;;;;;;;;:::i;:::-;;7656:284;;7760:8;-1:-1:-1;;;;;7732:89:14;7745:13;7732:89;7770:12;7783:11;7770:25;;;;;;;;;:::i;7656:284::-;7885:8;-1:-1:-1;;;;;7857:71:14;7870:13;7857:71;7895:12;7908:11;7895:25;;;;;;;;;:::i;7940:387:10:-;8077:47;8098:6;8106:9;8117:6;8077:20;:47::i;:::-;8157:37;;;;;;;;;;;-1:-1:-1;;;8157:37:10;;;;;;;;-1:-1:-1;;;;;8157:17:10;;-1:-1:-1;8157:17:10;;;;;;;;;;;;:37;;8179:6;;8157:21;:37::i;:::-;-1:-1:-1;;;;;8137:17:10;;;:9;:17;;;;;;;;;;;:57;;;;8228:20;;;;;;;:32;;8253:6;8228:24;:32::i;:::-;-1:-1:-1;;;;;8205:20:10;;:9;:20;;;;;;;;;;:55;5651:270:14;;;:::o;8333:501:10:-;-1:-1:-1;;;;;8498:20:10;;8490:37;;;;-1:-1:-1;;;8490:37:10;;;;;;;:::i;:::-;8548:44;8566:6;8574:9;;8585:6;;8548:17;:44::i;:::-;8629:9;8605:23;8656:171;8675:15;8673:1;:17;8656:171;;;8743:1;8719:9;;8729:1;8719:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8719:26:10;;8711:43;;;;-1:-1:-1;;;8711:43:10;;;;;;;:::i;:::-;8791:9;;8801:1;8791:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8774:41:10;8783:6;-1:-1:-1;;;;;8774:41:10;;8805:6;;8812:1;8805:9;;;;;;;:::i;:::-;;;;;;;8774:41;;;;2850:25:16;;2838:2;2823:18;;2704:177;8774:41:10;;;;;;;;8692:3;;;:::i;:::-;;;8656:171;;;;8479:355;8333:501;;;;;:::o;6577:795:8:-;6664:4;6705:26;;;:11;:26;;;;;:37;;;6664:4;;6691:59;;6744:5;6691:13;:59::i;:::-;:66;;6752:5;6691:66;6688:119;;-1:-1:-1;6781:1:8;;-1:-1:-1;6784:10:8;6773:22;;6688:119;6820:26;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;6820:42:8;;;;:35;;:42;;;;;;;;:48;;:42;:48;6817:101;;-1:-1:-1;6892:1:8;;-1:-1:-1;6895:10:8;6884:22;;6817:101;6931:23;6940:13;6931:8;:23::i;:::-;:30;;6956:5;6931:30;6928:83;;-1:-1:-1;6985:1:8;;-1:-1:-1;6988:10:8;6977:22;;6928:83;7024:8;:11;;7034:1;7024:11;7021:222;;7051:26;;;;:11;:26;;;;;:38;;:40;;-1:-1:-1;;;7051:40:8;;;;;:38;:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;7021:222;;;7111:8;:11;;7121:1;7111:11;7108:135;;7138:26;;;;:11;:26;;;;;:38;;:40;;-1:-1:-1;;;7138:40:8;;;;;:38;:40;;;:::i;7108:135::-;-1:-1:-1;7217:1:8;;-1:-1:-1;7220:10:8;7209:22;;7108:135;7263:26;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;7263:42:8;;;;:35;;:42;;;;;:47;;-1:-1:-1;;7263:47:8;7306:4;7263:47;;;7331:22;7275:13;7331:7;:22::i;:::-;7323:41;7355:8;;-1:-1:-1;6577:795:8;-1:-1:-1;;;;6577:795:8:o;2135:260:2:-;2225:4;905:22;;;:10;:22;;;;;:39;;;:42;;2245:32;;2242:75;;-1:-1:-1;2300:5:2;2293:12;;2242:75;2327:38;2345:10;2357:7;2327:17;:38::i;2975:170::-;3070:4;3094:43;3117:10;3129:7;3094:22;:43::i;9925:377:10:-;-1:-1:-1;;;;;10009:21:10;;10001:38;;;;-1:-1:-1;;;10001:38:10;;;;;;;:::i;:::-;10059:1;10052:6;:8;10044:25;;;;-1:-1:-1;;;10044:25:10;;;;;;;:::i;:::-;10082:49;10111:1;10115:7;10124:6;10082:20;:49::i;:::-;10153:12;;:24;;10170:6;10153:16;:24::i;:::-;10138:12;:39;-1:-1:-1;;;;;10203:18:10;;:9;:18;;;;;;;;;;;:30;;10226:6;10203:22;:30::i;:::-;-1:-1:-1;;;;;10182:18:10;;:9;:18;;;;;;;;;;:51;9925:377;;:::o;10246:48::-;9925:377;;:::o;10635:385::-;-1:-1:-1;;;;;10719:21:10;;10711:38;;;;-1:-1:-1;;;10711:38:10;;;;;;;:::i;:::-;10769:1;10762:6;:8;10754:25;;;;-1:-1:-1;;;10754:25:10;;;;;;;:::i;:::-;10792:49;10813:7;10830:1;10834:6;10792:20;:49::i;:::-;10869:38;;;;;;;;;;;-1:-1:-1;;;10869:38:10;;;;;;;;-1:-1:-1;;;;;10869:18:10;;-1:-1:-1;10869:18:10;;;;;;;;;;;;:38;;10892:6;;10869:22;:38::i;:::-;-1:-1:-1;;;;;10848:18:10;;:9;:18;;;;;;;;;;:59;10927:12;;:24;;10944:6;10927:16;:24::i;:::-;10912:12;:39;9925:377;;:::o;1109:334:13:-;-1:-1:-1;;;;;3647:18:10;;3620:7;3647:18;;;;;;;;;;;1195:37:13;1187:54;;;;-1:-1:-1;;;1187:54:13;;;;;;19958:2:16;19940:21;;;19997:1;19977:18;;;19970:29;-1:-1:-1;;;20030:2:16;20015:18;;20008:34;20074:2;20059:18;;19756:327;1187:54:13;1271:15;;;;;-1:-1:-1;;;;;1271:15:13;1288:1;3647:18:10;;;;;;;;;;;1255:34:13;1252:149;;;1320:15;;;;;-1:-1:-1;;;;;1320:15:13;3620:7:10;3647:18;;;;;;;;;;;1305:84:13;;1320:15;1337:17;;1305:14;:84::i;:::-;1405:15;:33;;-1:-1:-1;;;;;1405:33:13;;;;;-1:-1:-1;;;;;;1405:33:13;;;;;;;;;1109:334::o;1675:94:6:-;1721:15;:13;:15::i;:::-;1747:7;:14;;-1:-1:-1;;1747:14:6;1757:4;1747:14;;;1675:94::o;1910:::-;1958:12;:10;:12::i;:::-;1981:7;:15;;-1:-1:-1;;1981:15:6;;;1910:94::o;2919:213:8:-;2993:4;3013:10;3019:3;3013:10;;:5;:10::i;:::-;:17;;3025:5;3013:17;3010:60;;-1:-1:-1;3053:5:8;3046:12;;3010:60;-1:-1:-1;3080:18:8;;;;;;;;:10;:18;;;;;:22;;-1:-1:-1;;3080:22:8;;;;;;;;-1:-1:-1;;2919:213:8:o;5372:572::-;5471:4;5601:23;5610:13;5601:8;:23::i;:::-;:30;;5626:5;5601:30;5598:73;;-1:-1:-1;5654:5:8;5647:12;;5598:73;5759:26;;;;:11;:26;;;;;:33;;;-1:-1:-1;;;5759:33:8;;;;:36;;5756:103;;5811:26;;;;:11;:26;;;;;:33;;:36;;-1:-1:-1;;;;5811:36:8;-1:-1:-1;;;5811:36:8;;;5756:103;-1:-1:-1;;;;;;5869:35:8;;5913:1;5869:35;;;:23;:35;;;;;;;;:43;;;;;;;;;;:45;5932:4;5372:572;;;;;:::o;3668:1177::-;3819:21;1140:22:2;;;:10;:22;;;;;:39;;;3819:21:8;;3932:37;3946:10;3958;3932:13;:37::i;:::-;:44;;3971:5;3932:44;3929:97;;4000:1;4003:10;3992:22;;;;;;;3929:97;-1:-1:-1;;;;;4039:35:8;;;;;;:23;:35;;;;;;;;:43;;;;;;;;;;;:46;4036:99;;4109:1;4112:10;4101:22;;;;;;;4036:99;4148:11;4161:1;4148:14;4145:67;;4186:1;4189:10;4178:22;;;;;;;4145:67;4225:18;;;;;;;;:10;:18;;;;;;;;;:21;;4222:74;;4270:1;4273:10;4262:22;;;;;;;4222:74;4322:14;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;4489:18:8;;;;;;;;:10;:18;;;;;;4308:30;;-1:-1:-1;4462:46:8;;4476:11;;4489:18;4462:13;:46::i;:::-;4355:26;;;;:11;:26;;;;;;;;:38;;;4351:157;;4521:38;;;-1:-1:-1;4570:37:8;;;:48;;;-1:-1:-1;;;;;4629:46:8;;-1:-1:-1;;;;4351:157:8;;;-1:-1:-1;;;4351:157:8;;;;;-1:-1:-1;;;;4351:157:8;;-1:-1:-1;;;4351:157:8;;;;;;;;;;;-1:-1:-1;;;;;;4686:40:8;;;-1:-1:-1;;;4686:40:8;;;;;;;;;;4737:35;;;:23;:35;;;;;:43;;;;;;;;;;:57;;;4355:26;-1:-1:-1;;3668:1177:8;;;;;;;;:::o;12376:164:10:-;12510:22;:20;:22::i;8840:794::-;9002:22;:20;:22::i;:::-;9061:9;9096:30;;;9088:46;;;;-1:-1:-1;;;9088:46:10;;;;;;20290:2:16;20272:21;;;20329:1;20309:18;;;20302:29;-1:-1:-1;;;20362:2:16;20347:18;;20340:34;20406:2;20391:18;;20088:327;9088:46:10;-1:-1:-1;;;;;9171:17:10;;9145:23;9171:17;;;;;;;;;;;;9145:23;9250:200;9269:15;9267:1;:17;9250:200;;;9326:33;9349:6;;9356:1;9349:9;;;;;;;:::i;:::-;;;;;;;9326:18;:22;;:33;;;;:::i;:::-;9305:54;;9400:38;9428:6;;9435:1;9428:9;;;;;;;:::i;:::-;;;;;;;9400;:23;9410:9;;9420:1;9410:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9400:23:10;;;;;;;;;;;;-1:-1:-1;9400:23:10;;;:27;:38::i;:::-;9374:9;:23;9384:9;;9394:1;9384:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9374:23:10;;;;;;;;;;;;-1:-1:-1;9374:23:10;:64;9286:3;;;:::i;:::-;;;9250:200;;;;9485:18;9468:15;:35;;9460:52;;;;-1:-1:-1;;;9460:52:10;;;;;;20622:2:16;20604:21;;;20661:1;20641:18;;;20634:29;-1:-1:-1;;;20694:2:16;20679:18;;20672:34;20738:2;20723:18;;20420:327;9460:52:10;9543:49;;;;;;;;;;;-1:-1:-1;;;9543:49:10;;;;;;;;-1:-1:-1;;;;;9543:17:10;;-1:-1:-1;9543:17:10;;;;;;;;;;;;:49;;9565:18;;9543:21;:49::i;:::-;-1:-1:-1;;;;;9523:17:10;;:9;:17;;;;;;;;;;:69;9605:21;605:116:14;1277:291:8;1350:4;1383:26;;;:11;:26;;;;;:38;;;-1:-1:-1;;;1383:38:8;;;;:40;;;;:106;;-1:-1:-1;1453:26:8;;;;:11;:26;;;;;:33;;;-1:-1:-1;;;1453:33:8;;;;:36;1383:106;1366:172;;;-1:-1:-1;1522:4:8;;1277:291;-1:-1:-1;1277:291:8:o;1366:172::-;-1:-1:-1;1555:5:8;;1277:291;-1:-1:-1;1277:291:8:o;5952:617::-;6009:4;6097:26;;;:11;:26;;;;;:38;;;;-1:-1:-1;;;6097:38:8;;;;-1:-1:-1;;;6029:38:8;;;;:106;6026:517;;6161:30;6177:13;6161:15;:30::i;:::-;-1:-1:-1;;6206:26:8;;;;:11;:26;;;;;:33;;:35;;-1:-1:-1;;;;6206:35:8;-1:-1:-1;;;6206:35:8;;;6240:1;;5952:617::o;6026:517::-;6352:26;;;;:11;:26;;;;;:38;;;;-1:-1:-1;;;6352:38:8;;;;-1:-1:-1;;;6284:38:8;;;;:106;6281:262;;6416:30;6432:13;6416:15;:30::i;:::-;-1:-1:-1;;6461:26:8;;;;:11;:26;;;;;:33;;:36;;-1:-1:-1;;;;6461:36:8;-1:-1:-1;;;6461:36:8;;;-1:-1:-1;;6495:2:8;5952:617::o;3615:398:2:-;3698:46;3724:10;3736:7;3698:25;:46::i;:::-;3758:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3758:40:2;;;;;;;;;;;;:46;;:40;:46;3755:83;;3615:398;;:::o;3755:83::-;3848:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3848:40:2;;;;;;;;;;:45;;-1:-1:-1;;3848:45:2;3889:4;3848:45;;;;;;3904:22;;;;;;;3938:39;;;:41;;3880:7;;3904:33;;;;;3938:41;3848:22;3938:41;;;:::i;:::-;;;;;3904:76;;;;;;;;;;;;:84;;;;;-1:-1:-1;;;;;3904:84:2;;;;;-1:-1:-1;;;;;3904:84:2;;;;;;3615:398;;:::o;4335:777::-;4421:4;4438:50;4468:10;4480:7;4438:29;:50::i;:::-;4502:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4502:40:2;;;;;;;;;;;;:47;;;;4499:89;;-1:-1:-1;4572:4:2;4565:11;;4499:89;4598:11;4610:22;;;:10;:22;;;;;:39;;;;;;4663:5;;4660:48;;;4691:5;4684:12;;;;;4660:48;4759:5;4718:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4718:40:2;;;;;;;;;:46;;-1:-1:-1;;4718:46:2;;;4775:307;4794:3;4792:1;:5;4775:307;;;4821:22;;;;:10;:22;;;;;;;;:36;;;:33;;:36;;;;;;-1:-1:-1;;;;;4821:45:2;;;:36;;:45;4818:253;;4923:22;;;;:10;:22;;;;;:33;;;4957:5;;;:::i;:::-;4923:40;;;;;;;;;;;;;;;-1:-1:-1;4923:40:2;;;;4886:22;;;:10;:22;;;;;;:36;;;4923:40;4886:33;;;:36;;;;;:77;;-1:-1:-1;;;;;;4886:77:2;-1:-1:-1;;;;;4923:40:2;;;4886:77;;;;;;;4982:22;;;;;;;:39;;;;:43;4923:40;-1:-1:-1;5044:11:2;;-1:-1:-1;5044:11:2;4818:253;4799:3;;;:::i;:::-;;;4775:307;;;-1:-1:-1;5099:5:2;;4335:777;-1:-1:-1;;;;4335:777:2:o;238:104:9:-;296:7;319:17;323:1;326;319:17;;;;;;;;;;;;;-1:-1:-1;;;319:17:9;;;:3;:17::i;3328:328:8:-;3405:5;;;3470:3;3460:7;3464:3;3470;3460:7;:::i;:::-;3447:21;;;;:11;:21;:::i;:::-;3446:27;;;;:::i;:::-;3430:44;-1:-1:-1;3485:9:8;3501:15;;;;:11;:15;:::i;:::-;3485:32;;3531:3;:6;;3536:1;3531:6;3528:42;;-1:-1:-1;3557:1:8;3528:42;3583:3;:6;;3588:1;3583:6;3580:42;;3609:1;3605:5;;3580:42;3640:3;3644;;-1:-1:-1;3328:328:8;-1:-1:-1;;;3328:328:8:o;1549:95:13:-;1621:15;:13;:15::i;4853:269:8:-;4918:4;4954:26;;;:11;:26;;;;;:35;;;-1:-1:-1;;;;;4954:35:8;;;-1:-1:-1;;;5013:33:8;;;;5064:50;4954:35;5013:33;4954:26;5064:15;:50::i;2497:189::-;1114:7:2;1140:22;;;:10;:22;;;;;:39;;;2611:58:8;;:24;:58::i;:::-;2603:75;;;;-1:-1:-1;;;2603:75:8;;;;;;21646:2:16;21628:21;;;21685:1;21665:18;;;21658:29;-1:-1:-1;;;21718:2:16;21703:18;;21696:34;21762:2;21747:18;;21444:327;13544:206:14;13653:7;13649:94;13666:19;13664:1;:21;;;13649:94;;;13706:25;13721:7;13729:1;13706:14;:25::i;:::-;-1:-1:-1;13687:3:14;;;:::i;:::-;;;13649:94;;1104:165:8;1182:4;1207:17;;1226:1;1207:20;:53;;;-1:-1:-1;;1243:17:8;;-1:-1:-1;1231:29:8;1104:165::o;169:250:16:-;254:1;264:113;278:6;275:1;272:13;264:113;;;354:11;;;348:18;335:11;;;328:39;300:2;293:10;264:113;;;-1:-1:-1;;411:1:16;393:16;;386:27;169:250::o;424:271::-;466:3;504:5;498:12;531:6;526:3;519:19;547:76;616:6;609:4;604:3;600:14;593:4;586:5;582:16;547:76;:::i;:::-;677:2;656:15;-1:-1:-1;;652:29:16;643:39;;;;684:4;639:50;;424:271;-1:-1:-1;;424:271:16:o;700:220::-;849:2;838:9;831:21;812:4;869:45;910:2;899:9;895:18;887:6;869:45;:::i;925:337::-;991:6;999;1052:2;1040:9;1031:7;1027:23;1023:32;1020:52;;;1068:1;1065;1058:12;1020:52;1104:9;1091:23;1081:33;;1164:2;1153:9;1149:18;1136:32;1208:4;1201:5;1197:16;1190:5;1187:27;1177:55;;1228:1;1225;1218:12;1177:55;1251:5;1241:15;;;925:337;;;;;:::o;1459:803::-;1621:4;1650:2;1690;1679:9;1675:18;1720:2;1709:9;1702:21;1743:6;1778;1772:13;1809:6;1801;1794:22;1847:2;1836:9;1832:18;1825:25;;1909:2;1899:6;1896:1;1892:14;1881:9;1877:30;1873:39;1859:53;;1947:2;1939:6;1935:15;1968:1;1978:255;1992:6;1989:1;1986:13;1978:255;;;2085:2;2081:7;2069:9;2061:6;2057:22;2053:36;2048:3;2041:49;2113:40;2146:6;2137;2131:13;2113:40;:::i;:::-;2103:50;-1:-1:-1;2211:12:16;;;;2176:15;;;;2014:1;2007:9;1978:255;;;-1:-1:-1;2250:6:16;;1459:803;-1:-1:-1;;;;;;;1459:803:16:o;2267:173::-;2335:20;;-1:-1:-1;;;;;2384:31:16;;2374:42;;2364:70;;2430:1;2427;2420:12;2364:70;2267:173;;;:::o;2445:254::-;2513:6;2521;2574:2;2562:9;2553:7;2549:23;2545:32;2542:52;;;2590:1;2587;2580:12;2542:52;2613:29;2632:9;2613:29;:::i;:::-;2603:39;2689:2;2674:18;;;;2661:32;;-1:-1:-1;;;2445:254:16:o;2886:348::-;2938:8;2948:6;3002:3;2995:4;2987:6;2983:17;2979:27;2969:55;;3020:1;3017;3010:12;2969:55;-1:-1:-1;3043:20:16;;3086:18;3075:30;;3072:50;;;3118:1;3115;3108:12;3072:50;3155:4;3147:6;3143:17;3131:29;;3207:3;3200:4;3191:6;3183;3179:19;3175:30;3172:39;3169:59;;;3224:1;3221;3214:12;3239:411;3310:6;3318;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;3427:9;3414:23;3460:18;3452:6;3449:30;3446:50;;;3492:1;3489;3482:12;3446:50;3531:59;3582:7;3573:6;3562:9;3558:22;3531:59;:::i;:::-;3609:8;;3505:85;;-1:-1:-1;3239:411:16;-1:-1:-1;;;;3239:411:16:o;3655:328::-;3732:6;3740;3748;3801:2;3789:9;3780:7;3776:23;3772:32;3769:52;;;3817:1;3814;3807:12;3769:52;3840:29;3859:9;3840:29;:::i;:::-;3830:39;;3888:38;3922:2;3911:9;3907:18;3888:38;:::i;:::-;3878:48;;3973:2;3962:9;3958:18;3945:32;3935:42;;3655:328;;;;;:::o;3988:186::-;4047:6;4100:2;4088:9;4079:7;4075:23;4071:32;4068:52;;;4116:1;4113;4106:12;4068:52;4139:29;4158:9;4139:29;:::i;4368:658::-;4539:2;4591:21;;;4661:13;;4564:18;;;4683:22;;;4510:4;;4539:2;4762:15;;;;4736:2;4721:18;;;4510:4;4805:195;4819:6;4816:1;4813:13;4805:195;;;4884:13;;-1:-1:-1;;;;;4880:39:16;4868:52;;4975:15;;;;4940:12;;;;4916:1;4834:9;4805:195;;;-1:-1:-1;5017:3:16;;4368:658;-1:-1:-1;;;;;;4368:658:16:o;5031:180::-;5090:6;5143:2;5131:9;5122:7;5118:23;5114:32;5111:52;;;5159:1;5156;5149:12;5111:52;-1:-1:-1;5182:23:16;;5031:180;-1:-1:-1;5031:180:16:o;5216:813::-;5508:4;5554:1;5550;5545:3;5541:11;5537:19;5595:2;5587:6;5583:15;5572:9;5565:34;5635:3;5630:2;5619:9;5615:18;5608:31;5662:46;5703:3;5692:9;5688:19;5680:6;5662:46;:::i;:::-;5756:4;5748:6;5744:17;5739:2;5728:9;5724:18;5717:45;5810:4;5802:6;5798:17;5793:2;5782:9;5778:18;5771:45;5865:9;5857:6;5853:22;5847:3;5836:9;5832:19;5825:51;5893:33;5919:6;5911;5893:33;:::i;:::-;5957:3;5942:19;;5935:35;;;;-1:-1:-1;6007:15:16;;;;6001:3;5986:19;;;5979:44;-1:-1:-1;5885:41:16;5216:813;-1:-1:-1;;;;;5216:813:16:o;6034:479::-;6114:6;6122;6130;6183:2;6171:9;6162:7;6158:23;6154:32;6151:52;;;6199:1;6196;6189:12;6151:52;6239:9;6226:23;6272:18;6264:6;6261:30;6258:50;;;6304:1;6301;6294:12;6258:50;6343:59;6394:7;6385:6;6374:9;6370:22;6343:59;:::i;:::-;6421:8;;6317:85;;-1:-1:-1;6503:2:16;6488:18;;;;6475:32;;6034:479;-1:-1:-1;;;;6034:479:16:o;6726:485::-;6806:6;6814;6822;6875:2;6863:9;6854:7;6850:23;6846:32;6843:52;;;6891:1;6888;6881:12;6843:52;6914:29;6933:9;6914:29;:::i;:::-;6904:39;;6994:2;6983:9;6979:18;6966:32;7021:18;7013:6;7010:30;7007:50;;;7053:1;7050;7043:12;7007:50;7092:59;7143:7;7134:6;7123:9;7119:22;7092:59;:::i;:::-;6726:485;;7170:8;;-1:-1:-1;7066:85:16;;-1:-1:-1;;;;6726:485:16:o;7216:541::-;7473:4;7465:6;7461:17;7450:9;7443:36;7515:3;7510:2;7499:9;7495:18;7488:31;7424:4;7542:46;7583:3;7572:9;7568:19;7560:6;7542:46;:::i;:::-;7636:4;7628:6;7624:17;7619:2;7608:9;7604:18;7597:45;7690:9;7682:6;7678:22;7673:2;7662:9;7658:18;7651:50;7718:33;7744:6;7736;7718:33;:::i;:::-;7710:41;7216:541;-1:-1:-1;;;;;;;7216:541:16:o;7762:553::-;7851:6;7859;7867;7875;7928:2;7916:9;7907:7;7903:23;7899:32;7896:52;;;7944:1;7941;7934:12;7896:52;7984:9;7971:23;8017:18;8009:6;8006:30;8003:50;;;8049:1;8046;8039:12;8003:50;8088:59;8139:7;8130:6;8119:9;8115:22;8088:59;:::i;:::-;8166:8;;-1:-1:-1;8062:85:16;-1:-1:-1;8220:38:16;;-1:-1:-1;8254:2:16;8239:18;;8220:38;:::i;:::-;7762:553;;;;-1:-1:-1;8210:48:16;;8305:2;8290:18;8277:32;;-1:-1:-1;;7762:553:16:o;8320:260::-;8388:6;8396;8449:2;8437:9;8428:7;8424:23;8420:32;8417:52;;;8465:1;8462;8455:12;8417:52;8488:29;8507:9;8488:29;:::i;:::-;8478:39;;8536:38;8570:2;8559:9;8555:18;8536:38;:::i;:::-;8526:48;;8320:260;;;;;:::o;8585:367::-;8648:8;8658:6;8712:3;8705:4;8697:6;8693:17;8689:27;8679:55;;8730:1;8727;8720:12;8679:55;-1:-1:-1;8753:20:16;;8796:18;8785:30;;8782:50;;;8828:1;8825;8818:12;8782:50;8865:4;8857:6;8853:17;8841:29;;8925:3;8918:4;8908:6;8905:1;8901:14;8893:6;8889:27;8885:38;8882:47;8879:67;;;8942:1;8939;8932:12;8957:773;9079:6;9087;9095;9103;9156:2;9144:9;9135:7;9131:23;9127:32;9124:52;;;9172:1;9169;9162:12;9124:52;9212:9;9199:23;9241:18;9282:2;9274:6;9271:14;9268:34;;;9298:1;9295;9288:12;9268:34;9337:70;9399:7;9390:6;9379:9;9375:22;9337:70;:::i;:::-;9426:8;;-1:-1:-1;9311:96:16;-1:-1:-1;9514:2:16;9499:18;;9486:32;;-1:-1:-1;9530:16:16;;;9527:36;;;9559:1;9556;9549:12;9527:36;;9598:72;9662:7;9651:8;9640:9;9636:24;9598:72;:::i;:::-;8957:773;;;;-1:-1:-1;9689:8:16;-1:-1:-1;;;;8957:773:16:o;9735:127::-;9796:10;9791:3;9787:20;9784:1;9777:31;9827:4;9824:1;9817:15;9851:4;9848:1;9841:15;9867:127;9928:10;9923:3;9919:20;9916:1;9909:31;9959:4;9956:1;9949:15;9983:4;9980:1;9973:15;9999:380;10078:1;10074:12;;;;10121;;;10142:61;;10196:4;10188:6;10184:17;10174:27;;10142:61;10249:2;10241:6;10238:14;10218:18;10215:38;10212:161;;10295:10;10290:3;10286:20;10283:1;10276:31;10330:4;10327:1;10320:15;10358:4;10355:1;10348:15;10384:127;10445:10;10440:3;10436:20;10433:1;10426:31;10476:4;10473:1;10466:15;10500:4;10497:1;10490:15;10516:135;10555:3;10576:17;;;10573:43;;10596:18;;:::i;:::-;-1:-1:-1;10643:1:16;10632:13;;10516:135::o;10656:128::-;10723:9;;;10744:11;;;10741:37;;;10758:18;;:::i;10789:127::-;10850:10;10845:3;10841:20;10838:1;10831:31;10881:4;10878:1;10871:15;10905:4;10902:1;10895:15;11585:180;11622:3;11651:16;;;11669;;;;11647:39;11730:3;11701:14;;-1:-1:-1;;11717:18:16;;11698:38;11695:64;;;11739:18;;:::i;12228:1070::-;12313:12;;12278:3;;12368:1;12388:18;;;;12441;;;;12468:61;;12522:4;12514:6;12510:17;12500:27;;12468:61;12548:2;12596;12588:6;12585:14;12565:18;12562:38;12559:161;;12642:10;12637:3;12633:20;12630:1;12623:31;12677:4;12674:1;12667:15;12705:4;12702:1;12695:15;12559:161;101:19;;;153:4;144:14;;12806:18;12833:132;;;;12979:1;12974:318;;;;12799:493;;12833:132;-1:-1:-1;;12868:24:16;;12854:39;;12938:14;;12931:22;12928:1;12924:30;12913:42;;;-1:-1:-1;12833:132:16;;12974:318;12175:1;12168:14;;;12212:4;12199:18;;13068:1;13082:167;13096:6;13093:1;13090:13;13082:167;;;13176:14;;13161:13;;;13154:37;13219:16;;;;13111:10;;13082:167;;;13269:13;;;-1:-1:-1;;12799:493:16;;;;;;;;12228:1070;;;;:::o;13303:225::-;13449:2;13438:9;13431:21;13412:4;13469:53;13518:2;13507:9;13503:18;13495:6;13469:53;:::i;14197:175::-;14234:3;14278:4;14271:5;14267:16;14307:4;14298:7;14295:17;14292:43;;14315:18;;:::i;:::-;14364:1;14351:15;;14197:175;-1:-1:-1;;14197:175:16:o;15041:125::-;15106:9;;;15127:10;;;15124:36;;;15140:18;;:::i;16178:327::-;16380:2;16362:21;;;16419:1;16399:18;;;16392:29;-1:-1:-1;;;16452:2:16;16437:18;;16430:34;16496:2;16481:18;;16178:327::o;16842:289::-;16973:3;17011:6;17005:13;17027:66;17086:6;17081:3;17074:4;17066:6;17062:17;17027:66;:::i;:::-;17109:16;;;;;16842:289;-1:-1:-1;;16842:289:16:o;18464:322::-;18638:2;18627:9;18620:21;18601:4;18658:53;18707:2;18696:9;18692:18;18684:6;18658:53;:::i;:::-;18650:61;;18776:1;18772;18767:3;18763:11;18759:19;18751:6;18747:32;18742:2;18731:9;18727:18;18720:60;18464:322;;;;;:::o;18791:296::-;18965:2;18954:9;18947:21;18928:4;18985:53;19034:2;19023:9;19019:18;19011:6;18985:53;:::i;:::-;18977:61;;19074:6;19069:2;19058:9;19054:18;19047:34;18791:296;;;;;:::o;19092:327::-;19294:2;19276:21;;;19333:1;19313:18;;;19306:29;-1:-1:-1;;;19366:2:16;19351:18;;19344:34;19410:2;19395:18;;19092:327::o;19424:::-;19626:2;19608:21;;;19665:1;19645:18;;;19638:29;-1:-1:-1;;;19698:2:16;19683:18;;19676:34;19742:2;19727:18;;19424:327::o;20752:136::-;20791:3;20819:5;20809:39;;20828:18;;:::i;:::-;-1:-1:-1;;;20864:18:16;;20752:136::o;20893:151::-;20983:4;20976:12;;;20962;;;20958:31;;21001:14;;20998:40;;;21018:18;;:::i;21049:168::-;21122:9;;;21153;;21170:15;;;21164:22;;21150:37;21140:71;;21191:18;;:::i;21222:217::-;21262:1;21288;21278:132;;21332:10;21327:3;21323:20;21320:1;21313:31;21367:4;21364:1;21357:15;21395:4;21392:1;21385:15;21278:132;-1:-1:-1;21424:9:16;;21222:217::o
Swarm Source
ipfs://8e01b0e934ad6baba515bce91c9bd2dacfb659abd22c33d587c862a8cfd6e102
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.