Polygon Sponsored slots available. Book your slot here!
Contract Overview
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x3dbd2a88627566306ae9f5f5fb466b498535af21
Contract Name:
VolatilityTokenPolygon
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-07-14 */ // SPDX-License-Identifier: BUSL - 1.1 pragma solidity =0.8.4; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overloaded; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _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. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC20Pausable is ERC20, Pausable { /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/access/AccessControl.sol /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require( hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant" ); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require( hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke" ); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require( account == _msgSender(), "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } contract AccessControlMixin is AccessControl { string private _revertMsg; function _setupContractId(string memory contractId) internal { _revertMsg = string( abi.encodePacked(contractId, ": INSUFFICIENT_PERMISSIONS") ); } modifier only(bytes32 role) { require(hasRole(role, _msgSender()), _revertMsg); _; } } interface IChildToken { function deposit(address user, bytes calldata depositData) external; } contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string public constant ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contractsa that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712(string memory name) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } contract NativeMetaTransaction is EIP712Base { bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress] + 1; emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } /** * Custom Context contract of Openzeppelin */ abstract contract ContextMixin { function msgSender() internal view returns (address sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = msg.sender; } return sender; } } /** * @title Token Contract for Polygon * @author volmex.finance [[email protected]] * * This contract is used to deploy volatility and inverse volatility tokens on Polygon * with access to Deposit to child chain manager */ contract VolatilityTokenPolygon is ERC20Pausable, IChildToken, AccessControlMixin, NativeMetaTransaction, ContextMixin { // Calculated using keccak256("DEPOSITOR_ROLE") bytes32 public constant DEPOSITOR_ROLE = 0x8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9; // Calculated using keccak256("VOLMEX_PROTOCOL_ROLE") bytes32 public constant VOLMEX_PROTOCOL_ROLE = 0x33ba6006595f7ad5c59211bde33456cab351f47602fc04f644c8690bc73c4e16; constructor( string memory name_, string memory symbol_, address childChainManager ) ERC20(name_, symbol_) { _setupContractId("VolatilityTokenPolygon"); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(VOLMEX_PROTOCOL_ROLE, _msgSender()); _setupRole(DEPOSITOR_ROLE, childChainManager); _initializeEIP712(name_); } // This is to support Native meta transactions // never use msg.sender directly, use _msgSender() instead function _msgSender() internal view override returns (address sender) { return ContextMixin.msgSender(); } /** * @notice called when token is deposited on root chain * @dev Should be callable only by ChildChainManager * Should handle deposit by minting the required amount for user * Make sure minting is done only by this function * @param user user address for whom deposit is being done * @param depositData abi encoded amount */ function deposit(address user, bytes calldata depositData) external override only(DEPOSITOR_ROLE) { uint256 amount = abi.decode(depositData, (uint256)); _mint(user, amount); } /** * @notice called when user wants to withdraw tokens back to root chain * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain * @param amount amount of tokens to withdraw */ function withdraw(uint256 amount) external { _burn(_msgSender(), amount); } /** * @notice Example function to handle minting tokens on matic chain * @dev Minting can be done as per requirement, * This implementation allows only admin to mint tokens but it can be changed as per requirement * @param user user for whom tokens are being minted * @param amount amount of token to mint */ function mint(address user, uint256 amount) public only(VOLMEX_PROTOCOL_ROLE) { _mint(user, amount); } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(address user, uint256 amount) public only(VOLMEX_PROTOCOL_ROLE) { _burn(user, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `VOLMEX_PROTOCOL_ROLE`. */ function pause() public virtual only(VOLMEX_PROTOCOL_ROLE) { _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `VOLMEX_PROTOCOL_ROLE`. */ function unpause() public virtual only(VOLMEX_PROTOCOL_ROLE) { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"childChainManager","type":"address"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLMEX_PROTOCOL_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526008805460ff191690553480156200001b57600080fd5b50604051620026da380380620026da8339810160408190526200003e916200052a565b82518390839062000057906003906020850190620003f5565b5080516200006d906004906020840190620003f5565b50506005805460ff191690555060408051808201909152601681527f566f6c6174696c697479546f6b656e506f6c79676f6e000000000000000000006020820152620000b9906200013e565b620000cf6000620000c96200017b565b62000197565b620000fe7f33ba6006595f7ad5c59211bde33456cab351f47602fc04f644c8690bc73c4e16620000c96200017b565b6200012a7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a98262000197565b6200013583620001a3565b5050506200067c565b80604051602001620001519190620005b3565b6040516020818303038152906040526007908051906020019062000177929190620003f5565b5050565b6000620001926200020760201b62000e981760201c565b905090565b62000177828262000266565b60085460ff1615620001ec5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620001f781620002e1565b506008805460ff19166001179055565b6000333014156200026057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002639050565b50335b90565b60008281526006602090815260409091206200028d91839062000ef562000383821b17901c565b1562000177576200029d6200017b565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040518060800160405280604f81526020016200268b604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600955565b60006200039a836001600160a01b038416620003a3565b90505b92915050565b6000818152600183016020526040812054620003ec575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200039d565b5060006200039d565b828054620004039062000629565b90600052602060002090601f01602090048101928262000427576000855562000472565b82601f106200044257805160ff191683800117855562000472565b8280016001018555821562000472579182015b828111156200047257825182559160200191906001019062000455565b506200048092915062000484565b5090565b5b8082111562000480576000815560010162000485565b600082601f830112620004ac578081fd5b81516001600160401b0380821115620004c957620004c962000666565b604051601f8301601f19908116603f01168101908282118183101715620004f457620004f462000666565b816040528381528660208588010111156200050d578485fd5b62000520846020830160208901620005f6565b9695505050505050565b6000806000606084860312156200053f578283fd5b83516001600160401b038082111562000556578485fd5b62000564878388016200049b565b945060208601519150808211156200057a578384fd5b5062000589868287016200049b565b604086015190935090506001600160a01b0381168114620005a8578182fd5b809150509250925092565b60008251620005c7818460208701620005f6565b7f3a20494e53554646494349454e545f5045524d495353494f4e53000000000000920191825250601a01919050565b60005b8381101562000613578181015183820152602001620005f9565b8381111562000623576000848401525b50505050565b600181811c908216806200063e57607f821691505b602082108114156200066057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611fff806200068c6000396000f3fe6080604052600436106101ee5760003560e01c806340c10f191161010d5780639dc29fac116100a0578063a9059cbb1161006f578063a9059cbb146105a9578063ca15c873146105c9578063cf2c52cb146105e9578063d547741f14610609578063dd62ed3e1461062957600080fd5b80639dc29fac14610520578063a217fddf14610540578063a3b0b5a314610555578063a457c2d71461058957600080fd5b80638ec889f9116100dc5780638ec889f9146104915780639010d07c146104b357806391d14854146104eb57806395d89b411461050b57600080fd5b806340c10f191461040e5780635c975abb1461042e57806370a08231146104465780638456cb591461047c57600080fd5b80632d0335ab116101855780633408e470116101545780633408e470146103a657806336568abe146103b957806339509351146103d95780633f4ba83a146103f957600080fd5b80632d0335ab146103125780632e1a7d4d146103485780632f2ff15d1461036a578063313ce5671461038a57600080fd5b806318160ddd116101c157806318160ddd1461028e57806320379ee5146102ad57806323b872dd146102c2578063248a9ca3146102e257600080fd5b806306fdde03146101f3578063095ea7b31461021e5780630c53c51c1461024e5780630f7e597014610261575b600080fd5b3480156101ff57600080fd5b5061020861066f565b6040516102159190611de7565b60405180910390f35b34801561022a57600080fd5b5061023e610239366004611caf565b610701565b6040519015158152602001610215565b61020861025c366004611bd0565b61071f565b34801561026d57600080fd5b50610208604051806040016040528060018152602001603160f81b81525081565b34801561029a57600080fd5b506002545b604051908152602001610215565b3480156102b957600080fd5b5060095461029f565b3480156102ce57600080fd5b5061023e6102dd366004611b17565b61090e565b3480156102ee57600080fd5b5061029f6102fd366004611cd8565b60009081526006602052604090206002015490565b34801561031e57600080fd5b5061029f61032d366004611acb565b6001600160a01b03166000908152600a602052604090205490565b34801561035457600080fd5b50610368610363366004611cd8565b6109e6565b005b34801561037657600080fd5b50610368610385366004611cf0565b6109fa565b34801561039657600080fd5b5060405160128152602001610215565b3480156103b257600080fd5b504661029f565b3480156103c557600080fd5b506103686103d4366004611cf0565b610a8a565b3480156103e557600080fd5b5061023e6103f4366004611caf565b610b14565b34801561040557600080fd5b50610368610b63565b34801561041a57600080fd5b50610368610429366004611caf565b610ba7565b34801561043a57600080fd5b5060055460ff1661023e565b34801561045257600080fd5b5061029f610461366004611acb565b6001600160a01b031660009081526020819052604090205490565b34801561048857600080fd5b50610368610bf2565b34801561049d57600080fd5b5061029f600080516020611faa83398151915281565b3480156104bf57600080fd5b506104d36104ce366004611d12565b610c36565b6040516001600160a01b039091168152602001610215565b3480156104f757600080fd5b5061023e610506366004611cf0565b610c55565b34801561051757600080fd5b50610208610c6d565b34801561052c57600080fd5b5061036861053b366004611caf565b610c7c565b34801561054c57600080fd5b5061029f600081565b34801561056157600080fd5b5061029f7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b34801561059557600080fd5b5061023e6105a4366004611caf565b610cc2565b3480156105b557600080fd5b5061023e6105c4366004611caf565b610d7b565b3480156105d557600080fd5b5061029f6105e4366004611cd8565b610d8f565b3480156105f557600080fd5b50610368610604366004611b52565b610da6565b34801561061557600080fd5b50610368610624366004611cf0565b610e15565b34801561063557600080fd5b5061029f610644366004611ae5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461067e90611eff565b80601f01602080910402602001604051908101604052809291908181526020018280546106aa90611eff565b80156106f75780601f106106cc576101008083540402835291602001916106f7565b820191906000526020600020905b8154815290600101906020018083116106da57829003601f168201915b5050505050905090565b600061071561070e610f0a565b8484610f19565b5060015b92915050565b60408051606081810183526001600160a01b0388166000818152600a60209081529085902054845283015291810186905261075d878287878761103e565b6107b85760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084015b60405180910390fd5b6001600160a01b0387166000908152600a60205260409020546107dc906001611ea0565b6001600160a01b0388166000908152600a60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061082c90899033908a90611db2565b60405180910390a1600080306001600160a01b0316888a604051602001610854929190611d7b565b60408051601f198184030181529082905261086e91611d5f565b6000604051808303816000865af19150503d80600081146108ab576040519150601f19603f3d011682016040523d82523d6000602084013e6108b0565b606091505b5091509150816109025760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016107af565b98975050505050505050565b600061091b84848461112e565b6001600160a01b03841660009081526001602052604081208161093c610f0a565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156109c05760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016107af565b6109db856109cc610f0a565b6109d68685611eb8565b610f19565b506001949350505050565b6109f76109f1610f0a565b82611311565b50565b600082815260066020526040902060020154610a1890610506610f0a565b610a7c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b60648201526084016107af565b610a86828261146c565b5050565b610a92610f0a565b6001600160a01b0316816001600160a01b031614610b0a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107af565b610a8682826114d5565b6000610715610b21610f0a565b848460016000610b2f610f0a565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546109d69190611ea0565b600080516020611faa833981519152610b7e81610506610f0a565b600790610b9e5760405162461bcd60e51b81526004016107af9190611dfa565b506109f761153e565b600080516020611faa833981519152610bc281610506610f0a565b600790610be25760405162461bcd60e51b81526004016107af9190611dfa565b50610bed83836115d7565b505050565b600080516020611faa833981519152610c0d81610506610f0a565b600790610c2d5760405162461bcd60e51b81526004016107af9190611dfa565b506109f76116c2565b6000828152600660205260408120610c4e908361173e565b9392505050565b6000828152600660205260408120610c4e908361174a565b60606004805461067e90611eff565b600080516020611faa833981519152610c9781610506610f0a565b600790610cb75760405162461bcd60e51b81526004016107af9190611dfa565b50610bed8383611311565b60008060016000610cd1610f0a565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610d5b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107af565b610d71610d66610f0a565b856109d68685611eb8565b5060019392505050565b6000610715610d88610f0a565b848461112e565b60008181526006602052604081206107199061176c565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9610dd381610506610f0a565b600790610df35760405162461bcd60e51b81526004016107af9190611dfa565b506000610e0283850185611cd8565b9050610e0e85826115d7565b5050505050565b600082815260066020526040902060020154610e3390610506610f0a565b610b0a5760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b60648201526084016107af565b600033301415610eef57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610ef29050565b50335b90565b6000610c4e836001600160a01b038416611776565b6000610f14610e98565b905090565b6001600160a01b038316610f7b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107af565b6001600160a01b038216610fdc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107af565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006001600160a01b0386166110a45760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016107af565b60016110b76110b2876117c5565b611842565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611105573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6001600160a01b0383166111925760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107af565b6001600160a01b0382166111f45760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107af565b6111ff838383611872565b6001600160a01b038316600090815260208190526040902054818110156112775760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107af565b6112818282611eb8565b6001600160a01b0380861660009081526020819052604080822093909355908516815290812080548492906112b7908490611ea0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161130391815260200190565b60405180910390a350505050565b6001600160a01b0382166113715760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107af565b61137d82600083611872565b6001600160a01b038216600090815260208190526040902054818110156113f15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016107af565b6113fb8282611eb8565b6001600160a01b03841660009081526020819052604081209190915560028054849290611429908490611eb8565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611031565b60008281526006602052604090206114849082610ef5565b15610a8657611491610f0a565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526006602052604090206114ed90826118d8565b15610a86576114fa610f0a565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60055460ff166115875760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107af565b6005805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115ba610f0a565b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821661162d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107af565b61163960008383611872565b806002600082825461164b9190611ea0565b90915550506001600160a01b03821660009081526020819052604081208054839290611678908490611ea0565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60055460ff16156117085760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107af565b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115ba610f0a565b6000610c4e83836118ed565b6001600160a01b03811660009081526001830160205260408120541515610c4e565b6000610719825490565b60008181526001830160205260408120546117bd57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610719565b506000610719565b6000604051806080016040528060438152602001611f676043913980516020918201208351848301516040808701518051908601209051611825950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061184d60095490565b60405161190160f01b6020820152602281019190915260428101839052606201611825565b60055460ff1615610bed5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016107af565b6000610c4e836001600160a01b038416611981565b8154600090821061194b5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107af565b82600001828154811061196e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120548015611a945760006119a5600183611eb8565b85549091506000906119b990600190611eb8565b905060008660000182815481106119e057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611a1157634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611a28836001611ea0565b60008281526001890160205260409020558654879080611a5857634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610719565b6000915050610719565b80356001600160a01b0381168114611ab557600080fd5b919050565b803560ff81168114611ab557600080fd5b600060208284031215611adc578081fd5b610c4e82611a9e565b60008060408385031215611af7578081fd5b611b0083611a9e565b9150611b0e60208401611a9e565b90509250929050565b600080600060608486031215611b2b578081fd5b611b3484611a9e565b9250611b4260208501611a9e565b9150604084013590509250925092565b600080600060408486031215611b66578283fd5b611b6f84611a9e565b9250602084013567ffffffffffffffff80821115611b8b578384fd5b818601915086601f830112611b9e578384fd5b813581811115611bac578485fd5b876020828501011115611bbd578485fd5b6020830194508093505050509250925092565b600080600080600060a08688031215611be7578081fd5b611bf086611a9e565b9450602086013567ffffffffffffffff80821115611c0c578283fd5b818801915088601f830112611c1f578283fd5b813581811115611c3157611c31611f50565b604051601f8201601f19908116603f01168101908382118183101715611c5957611c59611f50565b816040528281528b6020848701011115611c71578586fd5b8260208601602083013791820160200185905250955050506040860135925060608601359150611ca360808701611aba565b90509295509295909350565b60008060408385031215611cc1578182fd5b611cca83611a9e565b946020939093013593505050565b600060208284031215611ce9578081fd5b5035919050565b60008060408385031215611d02578182fd5b82359150611b0e60208401611a9e565b60008060408385031215611d24578182fd5b50508035926020909101359150565b60008151808452611d4b816020860160208601611ecf565b601f01601f19169290920160200192915050565b60008251611d71818460208701611ecf565b9190910192915050565b60008351611d8d818460208801611ecf565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6001600160a01b03848116825283166020820152606060408201819052600090611dde90830184611d33565b95945050505050565b602081526000610c4e6020830184611d33565b6000602080835281845483600182811c915080831680611e1b57607f831692505b858310811415611e3957634e487b7160e01b87526022600452602487fd5b878601838152602001818015611e565760018114611e6757611e91565b60ff19861682528782019650611e91565b60008b815260209020895b86811015611e8b57815484820152908501908901611e72565b83019750505b50949998505050505050505050565b60008219821115611eb357611eb3611f3a565b500190565b600082821015611eca57611eca611f3a565b500390565b60005b83811015611eea578181015183820152602001611ed2565b83811115611ef9576000848401525b50505050565b600181811c90821680611f1357607f821691505b60208210811415611f3457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652933ba6006595f7ad5c59211bde33456cab351f47602fc04f644c8690bc73c4e16a2646970667358221220f83e88a28fc6348ec6526c6229a8d24e8899712e36c247c95869f99a95fa137864736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa000000000000000000000000000000000000000000000000000000000000001445544820566f6c6174696c69747920496e64657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000044554485600000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
46947:3503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11817:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14098:210;;;;;;;;;;-1:-1:-1;14098:210:0;;;;;:::i;:::-;;:::i;:::-;;;6503:14:1;;6496:22;6478:41;;6466:2;6451:18;14098:210:0;6433:92:1;43772:1198:0;;;;;;:::i;:::-;;:::i;41056:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41056:43:0;;;;;12910:108;;;;;;;;;;-1:-1:-1;12998:12:0;;12910:108;;;6676:25:1;;;6664:2;6649:18;12910:108:0;6631:76:1;42052:101:0;;;;;;;;;;-1:-1:-1;42130:15:0;;42052:101;;14790:493;;;;;;;;;;-1:-1:-1;14790:493:0;;;;;:::i;:::-;;:::i;36856:114::-;;;;;;;;;;-1:-1:-1;36856:114:0;;;;;:::i;:::-;36913:7;36940:12;;;:6;:12;;;;;:22;;;;36856:114;45396:107;;;;;;;;;;-1:-1:-1;45396:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;45483:12:0;45449:13;45483:12;;;:6;:12;;;;;;;45396:107;48980:89;;;;;;;;;;-1:-1:-1;48980:89:0;;;;;:::i;:::-;;:::i;:::-;;37232:264;;;;;;;;;;-1:-1:-1;37232:264:0;;;;;:::i;:::-;;:::i;12761:84::-;;;;;;;;;;-1:-1:-1;12761:84:0;;12835:2;17433:36:1;;17421:2;17406:18;12761:84:0;17388:87:1;42161:161:0;;;;;;;;;;-1:-1:-1;42275:9:0;42161:161;;38515:246;;;;;;;;;;-1:-1:-1;38515:246:0;;;;;:::i;:::-;;:::i;15692:297::-;;;;;;;;;;-1:-1:-1;15692:297:0;;;;;:::i;:::-;;:::i;50357:90::-;;;;;;;;;;;;;:::i;49427:139::-;;;;;;;;;;-1:-1:-1;49427:139:0;;;;;:::i;:::-;;:::i;22086:86::-;;;;;;;;;;-1:-1:-1;22157:7:0;;;;22086:86;;13081:177;;;;;;;;;;-1:-1:-1;13081:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;13232:18:0;13200:7;13232:18;;;;;;;;;;;;13081:177;50044:86;;;;;;;;;;;;;:::i;47336:122::-;;;;;;;;;;-1:-1:-1;47336:122:0;-1:-1:-1;;;;;;;;;;;47336:122:0;;36497:170;;;;;;;;;;-1:-1:-1;36497:170:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5858:32:1;;;5840:51;;5828:2;5813:18;36497:170:0;5795:102:1;35458:139:0;;;;;;;;;;-1:-1:-1;35458:139:0;;;;;:::i;:::-;;:::i;12027:95::-;;;;;;;;;;;;;:::i;49682:139::-;;;;;;;;;;-1:-1:-1;49682:139:0;;;;;:::i;:::-;;:::i;34101:49::-;;;;;;;;;;-1:-1:-1;34101:49:0;34146:4;34101:49;;47152:116;;;;;;;;;;-1:-1:-1;47152:116:0;47202:66;47152:116;;16492:446;;;;;;;;;;-1:-1:-1;16492:446:0;;;;;:::i;:::-;;:::i;13471:216::-;;;;;;;;;;-1:-1:-1;13471:216:0;;;;;:::i;:::-;;:::i;35771:127::-;;;;;;;;;;-1:-1:-1;35771:127:0;;;;;:::i;:::-;;:::i;48495:230::-;;;;;;;;;;-1:-1:-1;48495:230:0;;;;;:::i;:::-;;:::i;37741:267::-;;;;;;;;;;-1:-1:-1;37741:267:0;;;;;:::i;:::-;;:::i;13750:201::-;;;;;;;;;;-1:-1:-1;13750:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;13916:18:0;;;13884:7;13916:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13750:201;11817:91;11862:13;11895:5;11888:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11817:91;:::o;14098:210::-;14217:4;14239:39;14248:12;:10;:12::i;:::-;14262:7;14271:6;14239:8;:39::i;:::-;-1:-1:-1;14296:4:0;14098:210;;;;;:::o;43772:1198::-;44043:168;;;43973:12;44043:168;;;;;-1:-1:-1;;;;;44085:19:0;;43998:29;44085:19;;;:6;:19;;;;;;;;;44043:168;;;;;;;;;;;44246:45;44092:11;44043:168;44274:4;44280;44286;44246:6;:45::i;:::-;44224:128;;;;-1:-1:-1;;;44224:128:0;;14103:2:1;44224:128:0;;;14085:21:1;14142:2;14122:18;;;14115:30;14181:34;14161:18;;;14154:62;-1:-1:-1;;;14232:18:1;;;14225:31;14273:19;;44224:128:0;;;;;;;;;-1:-1:-1;;;;;44441:19:0;;;;;;:6;:19;;;;;;:23;;44463:1;44441:23;:::i;:::-;-1:-1:-1;;;;;44419:19:0;;;;;;:6;:19;;;;;;;:45;;;;44482:126;;;;;44426:11;;44554:10;;44580:17;;44482:126;:::i;:::-;;;;;;;;44719:12;44733:23;44781:4;-1:-1:-1;;;;;44773:18:0;44827:17;44846:11;44810:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;44810:48:0;;;;;;;;;;44773:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44718:155;;;;44892:7;44884:48;;;;-1:-1:-1;;;44884:48:0;;11762:2:1;44884:48:0;;;11744:21:1;11801:2;11781:18;;;11774:30;11840;11820:18;;;11813:58;11888:18;;44884:48:0;11734:178:1;44884:48:0;44952:10;43772:1198;-1:-1:-1;;;;;;;;43772:1198:0:o;14790:493::-;14930:4;14947:36;14957:6;14965:9;14976:6;14947:9;:36::i;:::-;-1:-1:-1;;;;;15023:19:0;;14996:24;15023:19;;;:11;:19;;;;;14996:24;15043:12;:10;:12::i;:::-;-1:-1:-1;;;;;15023:33:0;-1:-1:-1;;;;;15023:33:0;;;;;;;;;;;;;14996:60;;15109:6;15089:16;:26;;15067:116;;;;-1:-1:-1;;;15067:116:0;;13694:2:1;15067:116:0;;;13676:21:1;13733:2;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;-1:-1:-1;;;13823:18:1;;;13816:38;13871:19;;15067:116:0;13666:230:1;15067:116:0;15194:57;15203:6;15211:12;:10;:12::i;:::-;15225:25;15244:6;15225:16;:25;:::i;:::-;15194:8;:57::i;:::-;-1:-1:-1;15271:4:0;;14790:493;-1:-1:-1;;;;14790:493:0:o;48980:89::-;49034:27;49040:12;:10;:12::i;:::-;49054:6;49034:5;:27::i;:::-;48980:89;:::o;37232:264::-;37338:12;;;;:6;:12;;;;;:22;;;37330:45;;37362:12;:10;:12::i;37330:45::-;37308:142;;;;-1:-1:-1;;;37308:142:0;;10191:2:1;37308:142:0;;;10173:21:1;10230:2;10210:18;;;10203:30;10269:34;10249:18;;;10242:62;-1:-1:-1;;;10320:18:1;;;10313:45;10375:19;;37308:142:0;10163:237:1;37308:142:0;37463:25;37474:4;37480:7;37463:10;:25::i;:::-;37232:264;;:::o;38515:246::-;38627:12;:10;:12::i;:::-;-1:-1:-1;;;;;38616:23:0;:7;-1:-1:-1;;;;;38616:23:0;;38594:120;;;;-1:-1:-1;;;38594:120:0;;16124:2:1;38594:120:0;;;16106:21:1;16163:2;16143:18;;;16136:30;16202:34;16182:18;;;16175:62;-1:-1:-1;;;16253:18:1;;;16246:45;16308:19;;38594:120:0;16096:237:1;38594:120:0;38727:26;38739:4;38745:7;38727:11;:26::i;15692:297::-;15807:4;15829:130;15852:12;:10;:12::i;:::-;15879:7;15938:10;15901:11;:25;15913:12;:10;:12::i;:::-;-1:-1:-1;;;;;15901:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15901:25:0;;;:34;;;;;;;;;;:47;;;;:::i;50357:90::-;-1:-1:-1;;;;;;;;;;;40516:27:0;47392:66;40530:12;:10;:12::i;40516:27::-;40545:10;40508:48;;;;;-1:-1:-1;;;40508:48:0;;;;;;;;:::i;:::-;;50429:10:::1;:8;:10::i;49427:139::-:0;-1:-1:-1;;;;;;;;;;;40516:27:0;47392:66;40530:12;:10;:12::i;40516:27::-;40545:10;40508:48;;;;;-1:-1:-1;;;40508:48:0;;;;;;;;:::i;:::-;;49539:19:::1;49545:4;49551:6;49539:5;:19::i;:::-;49427:139:::0;;;:::o;50044:86::-;-1:-1:-1;;;;;;;;;;;40516:27:0;47392:66;40530:12;:10;:12::i;40516:27::-;40545:10;40508:48;;;;;-1:-1:-1;;;40508:48:0;;;;;;;;:::i;:::-;;50114:8:::1;:6;:8::i;36497:170::-:0;36597:7;36629:12;;;:6;:12;;;;;:30;;36653:5;36629:23;:30::i;:::-;36622:37;36497:170;-1:-1:-1;;;36497:170:0:o;35458:139::-;35527:4;35551:12;;;:6;:12;;;;;:38;;35581:7;35551:29;:38::i;12027:95::-;12074:13;12107:7;12100:14;;;;;:::i;49682:139::-;-1:-1:-1;;;;;;;;;;;40516:27:0;47392:66;40530:12;:10;:12::i;40516:27::-;40545:10;40508:48;;;;;-1:-1:-1;;;40508:48:0;;;;;;;;:::i;:::-;;49794:19:::1;49800:4;49806:6;49794:5;:19::i;16492:446::-:0;16612:4;16634:24;16661:11;:25;16673:12;:10;:12::i;:::-;-1:-1:-1;;;;;16661:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;16661:25:0;;;:34;;;;;;;;;;;-1:-1:-1;16728:35:0;;;;16706:122;;;;-1:-1:-1;;;16706:122:0;;15718:2:1;16706:122:0;;;15700:21:1;15757:2;15737:18;;;15730:30;15796:34;15776:18;;;15769:62;-1:-1:-1;;;15847:18:1;;;15840:35;15892:19;;16706:122:0;15690:227:1;16706:122:0;16839:67;16848:12;:10;:12::i;:::-;16862:7;16871:34;16890:15;16871:16;:34;:::i;16839:67::-;-1:-1:-1;16926:4:0;;16492:446;-1:-1:-1;;;16492:446:0:o;13471:216::-;13593:4;13615:42;13625:12;:10;:12::i;:::-;13639:9;13650:6;13615:9;:42::i;35771:127::-;35834:7;35861:12;;;:6;:12;;;;;:29;;:27;:29::i;48495:230::-;47202:66;40516:27;47202:66;40530:12;:10;:12::i;40516:27::-;40545:10;40508:48;;;;;-1:-1:-1;;;40508:48:0;;;;;;;;:::i;:::-;-1:-1:-1;48636:14:0::1;48653:34;::::0;;::::1;48664:11:::0;48653:34:::1;:::i;:::-;48636:51;;48698:19;48704:4;48710:6;48698:5;:19::i;:::-;40567:1;48495:230:::0;;;;:::o;37741:267::-;37848:12;;;;:6;:12;;;;;:22;;;37840:45;;37872:12;:10;:12::i;37840:45::-;37818:143;;;;-1:-1:-1;;;37818:143:0;;12526:2:1;37818:143:0;;;12508:21:1;12565:2;12545:18;;;12538:30;12604:34;12584:18;;;12577:62;-1:-1:-1;;;12655:18:1;;;12648:46;12711:19;;37818:143:0;12498:238:1;46096:601:0;46140:14;46171:10;46193:4;46171:27;46167:499;;;46215:18;46236:8;;46215:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;46275:8:0;46486:17;46480:24;-1:-1:-1;;;;;46454:134:0;;-1:-1:-1;46314:289:0;;-1:-1:-1;46314:289:0;;-1:-1:-1;46644:10:0;46167:499;46096:601;:::o;29161:175::-;29249:4;29278:50;29283:3;-1:-1:-1;;;;;29303:23:0;;29278:4;:50::i;47994:120::-;48048:14;48082:24;:22;:24::i;:::-;48075:31;;47994:120;:::o;19988:380::-;-1:-1:-1;;;;;20124:19:0;;20116:68;;;;-1:-1:-1;;;20116:68:0;;15313:2:1;20116:68:0;;;15295:21:1;15352:2;15332:18;;;15325:30;15391:34;15371:18;;;15364:62;-1:-1:-1;;;15442:18:1;;;15435:34;15486:19;;20116:68:0;15285:226:1;20116:68:0;-1:-1:-1;;;;;20203:21:0;;20195:68;;;;-1:-1:-1;;;20195:68:0;;11359:2:1;20195:68:0;;;11341:21:1;11398:2;11378:18;;;11371:30;11437:34;11417:18;;;11410:62;-1:-1:-1;;;11488:18:1;;;11481:32;11530:19;;20195:68:0;11331:224:1;20195:68:0;-1:-1:-1;;;;;20276:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20328:32;;6676:25:1;;;20328:32:0;;6649:18:1;20328:32:0;;;;;;;;19988:380;;;:::o;45511:486::-;45689:4;-1:-1:-1;;;;;45714:20:0;;45706:70;;;;-1:-1:-1;;;45706:70:0;;12943:2:1;45706:70:0;;;12925:21:1;12982:2;12962:18;;;12955:30;13021:34;13001:18;;;12994:62;-1:-1:-1;;;13072:18:1;;;13065:35;13117:19;;45706:70:0;12915:227:1;45706:70:0;45830:159;45858:47;45877:27;45897:6;45877:19;:27::i;:::-;45858:18;:47::i;:::-;45830:159;;;;;;;;;;;;7361:25:1;;;;7434:4;7422:17;;7402:18;;;7395:45;7456:18;;;7449:34;;;7499:18;;;7492:34;;;7333:19;;45830:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45807:182:0;:6;-1:-1:-1;;;;;45807:182:0;;45787:202;;45511:486;;;;;;;:::o;17428:675::-;-1:-1:-1;;;;;17568:20:0;;17560:70;;;;-1:-1:-1;;;17560:70:0;;14907:2:1;17560:70:0;;;14889:21:1;14946:2;14926:18;;;14919:30;14985:34;14965:18;;;14958:62;-1:-1:-1;;;15036:18:1;;;15029:35;15081:19;;17560:70:0;14879:227:1;17560:70:0;-1:-1:-1;;;;;17649:23:0;;17641:71;;;;-1:-1:-1;;;17641:71:0;;9787:2:1;17641:71:0;;;9769:21:1;9826:2;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;-1:-1:-1;;;9916:18:1;;;9909:33;9959:19;;17641:71:0;9759:225:1;17641:71:0;17725:47;17746:6;17754:9;17765:6;17725:20;:47::i;:::-;-1:-1:-1;;;;;17809:17:0;;17785:21;17809:17;;;;;;;;;;;17859:23;;;;17837:111;;;;-1:-1:-1;;;17837:111:0;;12119:2:1;17837:111:0;;;12101:21:1;12158:2;12138:18;;;12131:30;12197:34;12177:18;;;12170:62;-1:-1:-1;;;12248:18:1;;;12241:36;12294:19;;17837:111:0;12091:228:1;17837:111:0;17979:22;17995:6;17979:13;:22;:::i;:::-;-1:-1:-1;;;;;17959:17:0;;;:9;:17;;;;;;;;;;;:42;;;;18012:20;;;;;;;;:30;;18036:6;;17959:9;18012:30;;18036:6;;18012:30;:::i;:::-;;;;;;;;18077:9;-1:-1:-1;;;;;18060:35:0;18069:6;-1:-1:-1;;;;;18060:35:0;;18088:6;18060:35;;;;6676:25:1;;6664:2;6649:18;;6631:76;18060:35:0;;;;;;;;17428:675;;;;:::o;19056:494::-;-1:-1:-1;;;;;19140:21:0;;19132:67;;;;-1:-1:-1;;;19132:67:0;;14505:2:1;19132:67:0;;;14487:21:1;14544:2;14524:18;;;14517:30;14583:34;14563:18;;;14556:62;-1:-1:-1;;;14634:18:1;;;14627:31;14675:19;;19132:67:0;14477:223:1;19132:67:0;19212:49;19233:7;19250:1;19254:6;19212:20;:49::i;:::-;-1:-1:-1;;;;;19299:18:0;;19274:22;19299:18;;;;;;;;;;;19336:24;;;;19328:71;;;;-1:-1:-1;;;19328:71:0;;10956:2:1;19328:71:0;;;10938:21:1;10995:2;10975:18;;;10968:30;11034:34;11014:18;;;11007:62;-1:-1:-1;;;11085:18:1;;;11078:32;11127:19;;19328:71:0;10928:224:1;19328:71:0;19431:23;19448:6;19431:14;:23;:::i;:::-;-1:-1:-1;;;;;19410:18:0;;:9;:18;;;;;;;;;;:44;;;;19465:12;:22;;19481:6;;19410:9;19465:22;;19481:6;;19465:22;:::i;:::-;;;;-1:-1:-1;;19505:37:0;;6676:25:1;;;19531:1:0;;-1:-1:-1;;;;;19505:37:0;;;;;6664:2:1;6649:18;19505:37:0;6631:76:1;39795:188:0;39869:12;;;;:6;:12;;;;;:33;;39894:7;39869:24;:33::i;:::-;39865:111;;;39951:12;:10;:12::i;:::-;-1:-1:-1;;;;;39924:40:0;39942:7;-1:-1:-1;;;;;39924:40:0;39936:4;39924:40;;;;;;;;;;39795:188;;:::o;39991:192::-;40066:12;;;;:6;:12;;;;;:36;;40094:7;40066:27;:36::i;:::-;40062:114;;;40151:12;:10;:12::i;:::-;-1:-1:-1;;;;;40124:40:0;40142:7;-1:-1:-1;;;;;40124:40:0;40136:4;40124:40;;;;;;;;;;39991:192;;:::o;23145:120::-;22157:7;;;;22681:41;;;;-1:-1:-1;;;22681:41:0;;10607:2:1;22681:41:0;;;10589:21:1;10646:2;10626:18;;;10619:30;-1:-1:-1;;;10665:18:1;;;10658:50;10725:18;;22681:41:0;10579:170:1;22681:41:0;23204:7:::1;:15:::0;;-1:-1:-1;;23204:15:0::1;::::0;;23235:22:::1;23244:12;:10;:12::i;:::-;23235:22;::::0;-1:-1:-1;;;;;5858:32:1;;;5840:51;;5828:2;5813:18;23235:22:0::1;;;;;;;23145:120::o:0;18385:338::-;-1:-1:-1;;;;;18469:21:0;;18461:65;;;;-1:-1:-1;;;18461:65:0;;16540:2:1;18461:65:0;;;16522:21:1;16579:2;16559:18;;;16552:30;16618:33;16598:18;;;16591:61;16669:18;;18461:65:0;16512:181:1;18461:65:0;18539:49;18568:1;18572:7;18581:6;18539:20;:49::i;:::-;18617:6;18601:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18634:18:0;;:9;:18;;;;;;;;;;:28;;18656:6;;18634:9;:28;;18656:6;;18634:28;:::i;:::-;;;;-1:-1:-1;;18678:37:0;;6676:25:1;;;-1:-1:-1;;;;;18678:37:0;;;18695:1;;18678:37;;6664:2:1;6649:18;18678:37:0;;;;;;;18385:338;;:::o;22886:118::-;22157:7;;;;22411:9;22403:38;;;;-1:-1:-1;;;22403:38:0;;13349:2:1;22403:38:0;;;13331:21:1;13388:2;13368:18;;;13361:30;-1:-1:-1;;;13407:18:1;;;13400:46;13463:18;;22403:38:0;13321:166:1;22403:38:0;22946:7:::1;:14:::0;;-1:-1:-1;;22946:14:0::1;22956:4;22946:14;::::0;;22976:20:::1;22983:12;:10;:12::i;30535:190::-:0;30636:7;30692:22;30696:3;30708:5;30692:3;:22::i;29779:199::-;-1:-1:-1;;;;;29945:23:0;;29886:4;28053:19;;;:12;;;:19;;;;;;:24;;29915:55;27924:161;30064:117;30127:7;30154:19;30162:3;28254:18;;28171:109;25691:414;25754:4;28053:19;;;:12;;;:19;;;;;;25771:327;;-1:-1:-1;25814:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;25997:18;;25975:19;;;:12;;;:19;;;;;;:40;;;;26030:11;;25771:327;-1:-1:-1;26081:5:0;26074:12;;44978:410;45088:7;43096:108;;;;;;;;;;;;;;;;;43072:143;;;;;;;45242:12;;45277:11;;;;45321:24;;;;;45311:35;;;;;;45161:204;;;;;6943:25:1;;;6999:2;6984:18;;6977:34;;;;-1:-1:-1;;;;;7047:32:1;7042:2;7027:18;;7020:60;7111:2;7096:18;;7089:34;6930:3;6915:19;;6897:232;45161:204:0;;;;;;;;;;;;;45133:247;;;;;;45113:267;;44978:410;;;:::o;42691:258::-;42790:7;42892:20;42130:15;;;42052:101;42892:20;42863:63;;-1:-1:-1;;;42863:63:0;;;5555:27:1;5598:11;;;5591:27;;;;5634:12;;;5627:28;;;5671:12;;42863:63:0;5545:144:1;23753:272:0;22157:7;;;;23961:9;23953:64;;;;-1:-1:-1;;;23953:64:0;;16900:2:1;23953:64:0;;;16882:21:1;16939:2;16919:18;;;16912:30;16978:34;16958:18;;;16951:62;-1:-1:-1;;;17029:18:1;;;17022:40;17079:19;;23953:64:0;16872:232:1;29512:181:0;29603:4;29632:53;29640:3;-1:-1:-1;;;;;29660:23:0;;29632:7;:53::i;28634:273::-;28775:18;;28728:7;;28775:26;-1:-1:-1;28753:110:0;;;;-1:-1:-1;;;28753:110:0;;9384:2:1;28753:110:0;;;9366:21:1;9423:2;9403:18;;;9396:30;9462:34;9442:18;;;9435:62;-1:-1:-1;;;9513:18:1;;;9506:32;9555:19;;28753:110:0;9356:224:1;28753:110:0;28881:3;:11;;28893:5;28881:18;;;;;;-1:-1:-1;;;28881:18:0;;;;;;;;;;;;;;;;;28874:25;;28634:273;;;;:::o;26281:1557::-;26347:4;26486:19;;;:12;;;:19;;;;;;26522:15;;26518:1313;;26897:21;26921:14;26934:1;26921:10;:14;:::i;:::-;26970:18;;26897:38;;-1:-1:-1;26950:17:0;;26970:22;;26991:1;;26970:22;:::i;:::-;26950:42;;27237:17;27257:3;:11;;27269:9;27257:22;;;;;;-1:-1:-1;;;27257:22:0;;;;;;;;;;;;;;;;;27237:42;;27403:9;27374:3;:11;;27386:13;27374:26;;;;;;-1:-1:-1;;;27374:26:0;;;;;;;;;;;;;;;;;;:38;27506:17;:13;27522:1;27506:17;:::i;:::-;27480:23;;;;:12;;;:23;;;;;:43;27632:17;;27480:3;;27632:17;;;-1:-1:-1;;;27632:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;27727:3;:12;;:19;27740:5;27727:19;;;;;;;;;;;27720:26;;;27770:4;27763:11;;;;;;;;26518:1313;27814:5;27807:12;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:156::-;258:20;;318:4;307:16;;297:27;;287:2;;338:1;335;328:12;353:196;412:6;465:2;453:9;444:7;440:23;436:32;433:2;;;486:6;478;471:22;433:2;514:29;533:9;514:29;:::i;554:270::-;622:6;630;683:2;671:9;662:7;658:23;654:32;651:2;;;704:6;696;689:22;651:2;732:29;751:9;732:29;:::i;:::-;722:39;;780:38;814:2;803:9;799:18;780:38;:::i;:::-;770:48;;641:183;;;;;:::o;829:338::-;906:6;914;922;975:2;963:9;954:7;950:23;946:32;943:2;;;996:6;988;981:22;943:2;1024:29;1043:9;1024:29;:::i;:::-;1014:39;;1072:38;1106:2;1095:9;1091:18;1072:38;:::i;:::-;1062:48;;1157:2;1146:9;1142:18;1129:32;1119:42;;933:234;;;;;:::o;1172:715::-;1251:6;1259;1267;1320:2;1308:9;1299:7;1295:23;1291:32;1288:2;;;1341:6;1333;1326:22;1288:2;1369:29;1388:9;1369:29;:::i;:::-;1359:39;;1449:2;1438:9;1434:18;1421:32;1472:18;1513:2;1505:6;1502:14;1499:2;;;1534:6;1526;1519:22;1499:2;1577:6;1566:9;1562:22;1552:32;;1622:7;1615:4;1611:2;1607:13;1603:27;1593:2;;1649:6;1641;1634:22;1593:2;1694;1681:16;1720:2;1712:6;1709:14;1706:2;;;1741:6;1733;1726:22;1706:2;1791:7;1786:2;1777:6;1773:2;1769:15;1765:24;1762:37;1759:2;;;1817:6;1809;1802:22;1759:2;1853;1849;1845:11;1835:21;;1875:6;1865:16;;;;;1278:609;;;;;:::o;1892:1248::-;1994:6;2002;2010;2018;2026;2079:3;2067:9;2058:7;2054:23;2050:33;2047:2;;;2101:6;2093;2086:22;2047:2;2129:29;2148:9;2129:29;:::i;:::-;2119:39;;2209:2;2198:9;2194:18;2181:32;2232:18;2273:2;2265:6;2262:14;2259:2;;;2294:6;2286;2279:22;2259:2;2337:6;2326:9;2322:22;2312:32;;2382:7;2375:4;2371:2;2367:13;2363:27;2353:2;;2409:6;2401;2394:22;2353:2;2450;2437:16;2472:2;2468;2465:10;2462:2;;;2478:18;;:::i;:::-;2553:2;2547:9;2521:2;2607:13;;-1:-1:-1;;2603:22:1;;;2627:2;2599:31;2595:40;2583:53;;;2651:18;;;2671:22;;;2648:46;2645:2;;;2697:18;;:::i;:::-;2737:10;2733:2;2726:22;2772:2;2764:6;2757:18;2812:7;2807:2;2802;2798;2794:11;2790:20;2787:33;2784:2;;;2838:6;2830;2823:22;2784:2;2899;2894;2890;2886:11;2881:2;2873:6;2869:15;2856:46;2922:15;;;2939:2;2918:24;2911:40;;;-1:-1:-1;2926:6:1;-1:-1:-1;;;3023:2:1;3008:18;;2995:32;;-1:-1:-1;3074:2:1;3059:18;;3046:32;;-1:-1:-1;3097:37:1;3129:3;3114:19;;3097:37;:::i;:::-;3087:47;;2037:1103;;;;;;;;:::o;3145:264::-;3213:6;3221;3274:2;3262:9;3253:7;3249:23;3245:32;3242:2;;;3295:6;3287;3280:22;3242:2;3323:29;3342:9;3323:29;:::i;:::-;3313:39;3399:2;3384:18;;;;3371:32;;-1:-1:-1;;;3232:177:1:o;3414:190::-;3473:6;3526:2;3514:9;3505:7;3501:23;3497:32;3494:2;;;3547:6;3539;3532:22;3494:2;-1:-1:-1;3575:23:1;;3484:120;-1:-1:-1;3484:120:1:o;3609:264::-;3677:6;3685;3738:2;3726:9;3717:7;3713:23;3709:32;3706:2;;;3759:6;3751;3744:22;3706:2;3800:9;3787:23;3777:33;;3829:38;3863:2;3852:9;3848:18;3829:38;:::i;3878:258::-;3946:6;3954;4007:2;3995:9;3986:7;3982:23;3978:32;3975:2;;;4028:6;4020;4013:22;3975:2;-1:-1:-1;;4056:23:1;;;4126:2;4111:18;;;4098:32;;-1:-1:-1;3965:171:1:o;4336:257::-;4377:3;4415:5;4409:12;4442:6;4437:3;4430:19;4458:63;4514:6;4507:4;4502:3;4498:14;4491:4;4484:5;4480:16;4458:63;:::i;:::-;4575:2;4554:15;-1:-1:-1;;4550:29:1;4541:39;;;;4582:4;4537:50;;4385:208;-1:-1:-1;;4385:208:1:o;4598:274::-;4727:3;4765:6;4759:13;4781:53;4827:6;4822:3;4815:4;4807:6;4803:17;4781:53;:::i;:::-;4850:16;;;;;4735:137;-1:-1:-1;;4735:137:1:o;4877:415::-;5034:3;5072:6;5066:13;5088:53;5134:6;5129:3;5122:4;5114:6;5110:17;5088:53;:::i;:::-;5210:2;5206:15;;;;-1:-1:-1;;5202:53:1;5163:16;;;;5188:68;;;5283:2;5272:14;;5042:250;-1:-1:-1;;5042:250:1:o;5902:431::-;-1:-1:-1;;;;;6159:15:1;;;6141:34;;6211:15;;6206:2;6191:18;;6184:43;6263:2;6258;6243:18;;6236:30;;;6084:4;;6283:44;;6308:18;;6300:6;6283:44;:::i;:::-;6275:52;6093:240;-1:-1:-1;;;;;6093:240:1:o;7537:217::-;7684:2;7673:9;7666:21;7647:4;7704:44;7744:2;7733:9;7729:18;7721:6;7704:44;:::i;7983:1194::-;8092:4;8121:2;8150;8139:9;8132:21;8173:4;8209:6;8203:13;8239:4;8262:1;8290:9;8286:2;8282:18;8272:28;;8350:2;8339:9;8335:18;8372;8362:2;;8416:4;8408:6;8404:17;8394:27;;8362:2;8469;8461:6;8458:14;8438:18;8435:38;8432:2;;;-1:-1:-1;;;8496:34:1;;8553:4;8550:1;8543:15;8584:4;8503;8571:18;8432:2;8654:18;;;17698:19;;;17750:4;17741:14;8697:18;8724:100;;;;8838:1;8833:318;;;;8690:461;;8724:100;-1:-1:-1;;8757:24:1;;8745:37;;8802:12;;;;-1:-1:-1;8724:100:1;;8833:318;17527:4;17546:17;;;17596:4;17580:21;;8928:4;8945:165;8959:6;8956:1;8953:13;8945:165;;;9037:14;;9024:11;;;9017:35;9080:16;;;;8974:10;;8945:165;;;9130:11;;;-1:-1:-1;;8690:461:1;-1:-1:-1;9168:3:1;;8101:1076;-1:-1:-1;;;;;;;;;8101:1076:1:o;17766:128::-;17806:3;17837:1;17833:6;17830:1;17827:13;17824:2;;;17843:18;;:::i;:::-;-1:-1:-1;17879:9:1;;17814:80::o;17899:125::-;17939:4;17967:1;17964;17961:8;17958:2;;;17972:18;;:::i;:::-;-1:-1:-1;18009:9:1;;17948:76::o;18029:258::-;18101:1;18111:113;18125:6;18122:1;18119:13;18111:113;;;18201:11;;;18195:18;18182:11;;;18175:39;18147:2;18140:10;18111:113;;;18242:6;18239:1;18236:13;18233:2;;;18277:1;18268:6;18263:3;18259:16;18252:27;18233:2;;18082:205;;;:::o;18292:380::-;18371:1;18367:12;;;;18414;;;18435:2;;18489:4;18481:6;18477:17;18467:27;;18435:2;18542;18534:6;18531:14;18511:18;18508:38;18505:2;;;18588:10;18583:3;18579:20;18576:1;18569:31;18623:4;18620:1;18613:15;18651:4;18648:1;18641:15;18505:2;;18347:325;;;:::o;18677:127::-;18738:10;18733:3;18729:20;18726:1;18719:31;18769:4;18766:1;18759:15;18793:4;18790:1;18783:15;18809:127;18870:10;18865:3;18861:20;18858:1;18851:31;18901:4;18898:1;18891:15;18925:4;18922:1;18915:15
Swarm Source
ipfs://f83e88a28fc6348ec6526c6229a8d24e8899712e36c247c95869f99a95fa1378
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.