Contract 0x9f6044588b187aeef6e513e6d6e287d8b0618048

 

Contract Overview

Balance:
2,225 MATIC

MATIC Value:
$3,422.05 (@ $1.54/MATIC)

Token:
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x79f6375340b02926c02840b772f19eb5f86544581d08126db23e81196f411219Mint204767432021-10-22 5:25:032 hrs 4 mins ago0xee134e055a20d482246755a7603ec4cd2c99758d IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005932254
0x53cefe458d3786345d7a61661326f169b31890c570805cacc08f7c9f2e6859c3Mint204752152021-10-22 4:24:313 hrs 4 mins ago0xb8439a25c06b261132d9622d28b6cb992f8b7000 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005940486
0x1e449a1d630bda88f2be1485a99c7c01ef6f2e58ee7402ea651e811c1b4890e0Mint204738812021-10-22 3:31:433 hrs 57 mins ago0x502e60e242fd8ebe3fdebd2850d78c42703ab7bd IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005788158
0x749789a6b83516353579ef6d649e76b4734753b46d13172775f25d45d2594200Mint204724652021-10-22 2:34:314 hrs 54 mins ago0x8c5edf0a9800091ec831276f793ed94268e10e73 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005973414
0x4d96f32ac167536acc2cf8780072fbf449bf416ec49879634ef0d9516a151b17Mint204710722021-10-22 1:34:555 hrs 54 mins ago0x6af739bf846fda60c7035868215da96dfc74d5d8 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005932254
0x46925b2dfebb5be68c84ea3d4ef299e1b2cada27441786e1057ec3bf05457553Mint204650112021-10-21 21:28:4710 hrs ago0x770ede7dcf172af5511345d6378850190dc62fce IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.05948718
0x67de921afddf1b8d35b18ce0a3baae4ea952b6d80abc3f0c462df2d86afad9beMint202624242021-10-16 1:12:336 days 6 hrs ago0xc091ba2beacb2bd3de5f064bf5ca130d204acb0e IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005872554
0x4d3d1769d7b7a48f821fb58555040172d5d30d162aef9ca015be767eefd50f54Mint202624232021-10-16 1:12:316 days 6 hrs ago0xdd50f5d019300b890686e30b11f6357349258407 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005853846
0x1fa83995795cecd222f4a6cda4f75d83bd39f9a3c22083db0cbdc809169cf232Mint202624232021-10-16 1:12:316 days 6 hrs ago0xa7e930ce0a3fdc535af29bca9fe6d0e0a1651def IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005913546
0xcf4f6a9f7f88469015687593992f331eb084149760d291984b1a1556903e4777Mint202624232021-10-16 1:12:316 days 6 hrs ago0xf3146690224c15835a14792326772209c6ed0dd0 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005880786
0x7b16a8dea5b0af8796a5b28b096540b0c0046d07a309dd492d8fe4da2bcdcb95Mint202624222021-10-16 1:12:296 days 6 hrs ago0x364b774ecedd05a9cc6f40472a8add8a1f08483a IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005905482
0xb99be973b1b5a84f1af7b94f586dcf9e865ad34b36e0dd09b492347d1c08cd18Mint202607272021-10-16 0:03:306 days 7 hrs ago0x7c363ace9c600dfa5952d003129d304510d93bda IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.00603927
0x0710933b54c3442503e11471e110f921cab7ffe5a22adbd25eecaa6ad4a24e9eMint202607262021-10-16 0:03:286 days 7 hrs ago0x07ed1973358aa6010b60438965ecd5075a32715c IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005981646
0xddebed3efebc0fc6a08e6cc1ce104a55ca8fe364407c2e8691ca9de87b8a96bdMint202607252021-10-16 0:03:266 days 7 hrs ago0xc17a3fb3a2a922297c6975c6eb5518b090e9b1e3 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005872554
0xc2ce24b44205c1f7f97932b0f2e5463d6ebf7defdb6ffe7207d9be1b10f55341Mint202607242021-10-16 0:03:246 days 7 hrs ago0xfc36c27a5a6b4c8591b134189aebaba385d1e84f IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005897082
0x8612ce1c8c6080f170380301c55808cfce904b1141c192297d9c9da7d625f4c0Mint202607242021-10-16 0:03:246 days 7 hrs ago0xd096a6f9dfe16f20a3fbb24f55c8c699603520b5 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.006032799
0x0e3e8debaa91e6d871e162d77cb6ff5a3ca985bb638db0325233f023dc22e269Mint202607232021-10-16 0:03:226 days 7 hrs ago0xdbcb01015530fc11e398630592bc8efaa73ff999 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005872554
0x0fb682f6371128379705e0117f958cc2b7d4058de9044025bc625be64ba5f2aaMint202607222021-10-16 0:03:206 days 7 hrs ago0x0487c26301679176bee03f2301be48d3ce1e4350 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.00594855
0x9823a3a90a980808be3512efa18c89a70ea1c79666af4b6f03ac77857b0f9f66Mint202607222021-10-16 0:03:206 days 7 hrs ago0x19be8899b40a48eecb97fc59425dd6e5d086ba6e IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.00593001
0xb45b3df48e1a89f9103091aaeaa408c7ba5ff2b54ea854ef6c2e7767b949a21eMint202607222021-10-16 0:03:206 days 7 hrs ago0x37a7bc83e32860d99f4e48a574550ffca8394ce5 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.00593841
0x4b7b1bcbc6dfe10458feb7b4398b157dcf25a905744d665a47845ce56bd9775bMint202607212021-10-16 0:03:186 days 7 hrs ago0x4afc1d1a72a4e15fa1aaf85ee108704b71ae75e6 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005991015
0x4b7381115e9f1d9141c4b51dbb305b2b2f171a2a82a2c4d3c82aa7646cd4bca6Mint202607202021-10-16 0:03:166 days 7 hrs ago0xbd606a3d0b60ea352c1967e44a414e69658934fd IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.006006342
0x000b59c627a2f2590b64d587e561a02f0f4a7941f3b34151a377168a4881de98Mint202607162021-10-16 0:03:086 days 7 hrs ago0xa77a4ca7bdea4ab12349d20fc0ab569ed7a2aeca IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005932254
0x11bfdca8f6400aa48407e4df3a94a3625b7299f35b03a3671a59fbd6251d3712Mint202603082021-10-15 23:49:086 days 7 hrs ago0x33a22c1592fd8fc8f35d6d29ec258856c0a73d85 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005905482
0x5b1040feb99b52500ed3185975bd2ac893897174b23e966a6e3be2535718ff54Mint202287672021-10-15 1:32:017 days 5 hrs ago0xcf73319e84f4480c376c60767b4e34997acb5997 IN  0x9f6044588b187aeef6e513e6d6e287d8b061804825 MATIC0.005981646
[ Download CSV Export 
Latest 7 internal transactions
Parent Txn Hash Block From To Value
0x5a18c9092a4969faf0f494e328d0757990219c078990cce761e5ea51b7f36f78201219742021-10-12 3:19:1110 days 4 hrs ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480xaec4af222c239ad2466d30d6eb3de1c9b439bb399,525 MATIC
0xb7cd1925039da140a421e001c21b989f71e793ebee353d3d76cc5961e7ddf8da193771332021-09-22 7:27:2530 days 1 min ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480x351e5e89e8d8e397266566c55e9dc93d2053b34725 MATIC
0x01cf7b068c08e0ef42b5d0e5e8ea7910ab713a2ac8f79937c7a21e6c98f989d8192273642021-09-18 4:19:4034 days 3 hrs ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480xaec4af222c239ad2466d30d6eb3de1c9b439bb39100 MATIC
0xafe35148e2c5d6470219b82634c691ef6841fdc24601795560edd18f4e69c615192250672021-09-18 2:32:4034 days 4 hrs ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480xd9e5952373a16af8519ae24efe764d3abbfbda6d1 MATIC
0x64409978796c5f88569dbea2d41b9ddc9fd5471cbc9c1612269a8426651a682e191936692021-09-17 5:23:0735 days 2 hrs ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480xed1819fa53cf62276702f2a9b40edb3ed43bd3415 MATIC
0x700a713b625145128a78f03cb1593ce90ddc88df01f79dc8159b2ba837f7a498191904352021-09-17 3:03:2835 days 4 hrs ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480xaec4af222c239ad2466d30d6eb3de1c9b439bb3925 MATIC
0xbb5b049dd3cce719d856202e322d868e77e2209796f03a8c553c0491026ce9ad191899962021-09-17 2:39:3335 days 4 hrs ago 0x9f6044588b187aeef6e513e6d6e287d8b06180480xaec4af222c239ad2466d30d6eb3de1c9b439bb390.1 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EverLight

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-09-17
*/

// File: interfaces/LibEverLight.sol


pragma solidity ^0.8.0;

library LibEverLight {

  struct Configurations {
    uint256 _baseFee;                           // base fee for create character
    uint32 _incrPerNum;                         // the block number for increase fee
    uint256 _incrFee;                           // increase fee after increase block number
    uint32 _decrBlockNum;                       // the block number for decrease fee
    uint256 _decrFee;                           // decrease fee after decrease block number
    uint256 _latestCreateBlock;                 // the latest block number for create characters
    uint32 _totalDecrTimes;                     // total decrease times for nonone apply 
    uint32 _totalCreateNum;                     // total number of create characters
    uint256 _currentTokenId;                    // current token id for nft creation
    uint32 _totalSuitNum;                       // total suit number 
    uint32 _maxPosition;                        // max parts number for charater
    uint32 _luckyStonePrice;                    // price of lucky stone
    address _goverContract;                     // address of governance contract
    address _tokenContract;                     // address of token contract
    address[] _mapContracts;                    // addresses of map contracts 
  }
  
  struct SuitInfo {
    string _name;                               // suit name
    uint32 _suitId;                             // suit id, 0 for non suit
  }
 
  struct PartsInfo {
    mapping(uint8 => mapping(uint8 => uint32)) _partsPowerList;     // position -> (rare -> power)
    mapping(uint8 => mapping(uint8 => SuitInfo[])) _partsTypeList;  // position -> (rare -> SuitInfo[])
    mapping(uint8 => uint32) _partsCount;       // position -> count
    mapping(uint8 => string) _rareColor;        // rare -> color
    mapping(uint32 => address) _suitFlag;       // check suit is exists
    mapping(uint256 => bool) _nameFlag;         // parts name is exists
  }
  
  struct TokenInfo {
    uint256 _tokenId;                           // token id
    //address _owner;                             // owner of token
    uint8 _position;                            // parts position
    uint8 _rare;                                // rare level 
    string _name;                               // parts name
    uint32 _suitId;                             // suit id, 0 for non suit
    uint32 _power;                              // parts power
    uint8 _level;                               // parts level
    bool _createFlag;                           // has created new parts
    uint256 _wearToken;                         // character token id which wear this token
  }

  struct Account {
    bool _creationFlag;                         // if the address has created character
    uint32 _luckyNum;                           // lucky number of current address
  }

  struct Character {
    uint256 _tokenId;                           // token id
    //address _owner;                           // owner of character
    uint32 _powerFactor;                        // power factor of character
    mapping(uint8 => uint256) _tokenList;       // position -> tokenID
    uint32 _totalPower;                         // total power of parts list
    mapping(uint256 => string) _extraList;      // 
  }



}

// File: interfaces/IEverLight.sol


pragma solidity ^0.8.0;


interface IEverLight {
  // event list
  event NewTokenType(address indexed creator, uint8 position, uint8 rare, string indexed name, uint256 suitId);

  // read function list
  function queryColorByRare(uint8 rare) external view returns (string memory color);

 /* function queryBaseInfo() external view returns (uint256 baseFee, uint32 incrPerNum, uint256 incrFee, 
                                      uint32 decrBlockNum, uint256 decrFee, uint256 lastestCreateBlock, uint32 totalSuitNum);*/

  function queryAccount(address owner) external view returns (LibEverLight.Account memory account);

  // returns the type for tokenId(1 charactor, 2 parts, 3 lucklyStone)
  function queryTokenType(uint256 tokenId) external view returns (uint8 tokenType);
  
  function queryCharacter(uint256 characterId) external view returns (uint256 tokenId, uint32 powerFactor, uint256[] memory tokenList, uint32 totalPower);

  function queryToken(uint256 tokenId) external view returns (LibEverLight.TokenInfo memory tokenInfo);

  function queryCharacterCount() external view returns (uint32 num);

  function queryLuckyStonePrice() external view returns (uint32 price);

  function queryMapInfo() external view returns (address[] memory addresses);

  function querySuitOwner(uint32 suitId) external view returns (address owner);

  function isNameExist(string memory name) external view returns (bool result);

  function queryCharacterExtra(uint256 characterId, uint256 extraKey) external view returns (string memory);

  // write function list
  function setCharacterExtra(uint256 characterId, uint256 extraKey, string memory extraValue) external;

  function mint() external payable;

  function wear(uint256 characterId, uint256[] memory tokenList) external;

  function takeOff(uint256 characterId, uint8[] memory positions) external;

  function upgradeToken(uint256 firstTokenId, uint256 secondTokenId) external;

  function upgradeWearToken(uint256 characterId, uint256 tokenId) external;

  function exchangeToken(uint32 mapId, uint256[] memory mapTokenList) external;

  function buyLuckyStone(uint8 count) external;

  function useLuckyStone(uint256[] memory tokenId) external;

  function newTokenType(uint256 tokenId, string memory name, uint32 suitId) external;
}

// File: utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: interfaces/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// File: interfaces/IERC721Proxy.sol


pragma solidity ^0.8.0;

interface IERC721Proxy {

  function mintBy(address owner, uint256 tokenId) external;
  function burnBy(uint256 tokenId) external;
  function ownerOf(uint256 tokenId) external view returns (address owner);
}
// File: interfaces/IERC20.sol


pragma solidity ^0.8.0;

/**
 * @title IERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20Basic {
    function totalSupply() external view returns (uint);
    function balanceOf(address who) external view returns (uint);
    function transfer(address to, uint value) external;
    event Transfer(address indexed from, address indexed to, uint value);
}

/**
 * @title IERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 is IERC20Basic {
    function allowance(address owner, address spender) external view returns (uint);
    function transferFrom(address from, address to, uint value) external;
    function approve(address spender, uint value) external;
    event Approval(address indexed owner, address indexed spender, uint value);
}
// File: utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: utils/Base64.sol


pragma solidity ^0.8.0;

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}
// File: 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 _txOrigin() internal view virtual returns (address) {
        return tx.origin;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _timestamp() internal view virtual returns (uint) {
        return block.timestamp;
    }

    function _blockNum() internal view virtual returns (uint) {
        return block.number;
    }

    function _gasLeft() internal view virtual returns (uint) {
        return gasleft();
    }

    function _value() internal view virtual returns (uint) {
        return msg.value;
    }

    function _gasPrice() internal view virtual returns (uint) {
        return tx.gasprice;
    }
}
// File: Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: EverLight.sol


pragma solidity ^0.8.0;










contract EverLight is Ownable, IEverLight {
    
  using Address for address;
  using Strings for uint256;

  IERC721Proxy public _erc721Proxy;                          // address of 721 token      
  
  LibEverLight.Configurations _config;                       // all configurations
  LibEverLight.PartsInfo _partsInfo;                         // all parts informations
  mapping(uint256 => LibEverLight.TokenInfo) _tokenList;     // all tokens  
  mapping(address => LibEverLight.Account) _accountList;     // all packages owned by address
  mapping(uint256 => LibEverLight.Character) _characterList; // all character owned by address

  constructor() Ownable() {
    // init the configrations
    _config._baseFee = 25 * 10 ** 18; // 25 matic
    _config._incrPerNum = 2500;        // eth: 256, matic: 1792
    _config._incrFee = 25 * 10 ** 18; 
    _config._decrBlockNum = 25000;       // eth: 4096, matic: 28672
    _config._decrFee = 25 * 10 ** 18;
    // _config._latestCreateBlock = 0;
    // _config._totalDecrTimes = 0;
    // _config._totalCreateNum = 0;
    // _config._currentTokenId = 0;
    // _config._totalSuitNum = 0;
    _config._maxPosition = 11;
    _config._luckyStonePrice = 2000;
  }

  function queryTokenType(uint256 tokenId) external view override returns (uint8 tokenType) {
    if(_tokenList[tokenId]._tokenId == tokenId){
      if(_tokenList[tokenId]._position == 99){
        return 3;
      }
      return 2;
    }
    if(_characterList[tokenId]._tokenId == tokenId){
      return 1;
    }
  }

  function queryColorByRare(uint8 rare) external view override returns (string memory color) {
    return _partsInfo._rareColor[rare];
  }

  function queryAccount(address owner) external view override returns (LibEverLight.Account memory account) {
    account = _accountList[owner];
  }

  function queryCharacter(uint256 characterId) external view override returns (uint256 tokenId, uint32 powerFactor, uint256[] memory tokenList, uint32 totalPower) {
    (tokenId, powerFactor, totalPower) = (_characterList[characterId]._tokenId, _characterList[characterId]._powerFactor, _characterList[characterId]._totalPower);
    
    tokenList = new uint256[](_config._maxPosition);
    for (uint8 i=0; i<_config._maxPosition; ++i) {
      tokenList[i] = _characterList[characterId]._tokenList[i];
    }
  }

  /*function queryBaseInfo() external view override returns (uint256 baseFee, uint32 incrPerNum, uint256 incrFee, 
                                      uint32 decrBlockNum, uint256 decrFee, uint256 lastestCreateBlock, uint32 totalSuitNum) {
    (baseFee, incrPerNum, incrFee, decrBlockNum, decrFee, lastestCreateBlock, totalSuitNum) = (_config._baseFee, _config._incrPerNum, _config._incrFee, _config._decrBlockNum, _config._decrFee, _config._latestCreateBlock, _config._totalSuitNum);
  }*/

  function queryToken(uint256 tokenId) external view override returns (LibEverLight.TokenInfo memory tokenInfo) {
    tokenInfo = _tokenList[tokenId];
  }

  function queryCharacterCount() external view override returns (uint32) {
    return _config._totalCreateNum;
  }

  function queryLuckyStonePrice() external view override returns (uint32) {
    return _config._luckyStonePrice;
  }

  function queryMapInfo() external view override returns (address[] memory addresses) {
    addresses = _config._mapContracts;
  }

  function querySuitOwner(uint32 suitId) external view override returns (address) {
    return _partsInfo._suitFlag[suitId];
  }

  function isNameExist(string memory name) external view override returns (bool) {
    return _partsInfo._nameFlag[uint256(keccak256(abi.encodePacked(name)))];
  }

  function queryCharacterExtra(uint256 characterId, uint256 extraKey) external view override returns (string memory) {
    require(_erc721Proxy.ownerOf(characterId) == tx.origin, "!owner");
    return _characterList[characterId]._extraList[extraKey];
  }

  function setCharacterExtra(uint256 characterId, uint256 extraKey, string memory extraValue) external override {
    require(_erc721Proxy.ownerOf(characterId) == tx.origin, "!owner");
    _characterList[characterId]._extraList[extraKey] = extraValue;
  }

  function mint() external override payable {
    // one address can only apply once
    require(!_accountList[tx.origin]._creationFlag, "Only once");

    // calc the apply fee
    uint32 decrTimes;
    uint256 applyFee = _config._baseFee + _config._totalCreateNum / _config._incrPerNum * _config._incrFee;
    if (_config._latestCreateBlock != 0) {
      decrTimes = uint32( block.number - _config._latestCreateBlock ) / _config._decrBlockNum;
    }
    
    uint decrFee = (_config._totalDecrTimes + decrTimes) * _config._decrFee;
    applyFee = (applyFee - _config._baseFee) > decrFee ? (applyFee - decrFee) : _config._baseFee;
    require(msg.value >= applyFee, "Not enough value");

    // create character
    uint256 characterId = _createCharacter();

    // create package information
    _accountList[tx.origin]._creationFlag = true;
    // _accountList[tx.origin]._luckyNum = 0;

    // return the left fee
    if (msg.value > applyFee) {
      payable(tx.origin).transfer(msg.value - applyFee);
    }

    // update stat information
    _config._totalCreateNum += 1;
    _config._latestCreateBlock = block.number;
    _config._totalDecrTimes += decrTimes;

    // mint nft
    _erc721Proxy.mintBy(tx.origin, characterId);
  }

  function wear(uint256 characterId, uint256[] memory tokenList) external override {
    //require(_characterOwnOf(characterId) == tx.origin, "character not owner");
    require(_erc721Proxy.ownerOf(characterId) == tx.origin);
    require(tokenList.length > 0, "Empty token");
    
    // create new character
    uint256 newCharacterId = ++_config._currentTokenId;
    _copyCharacter(characterId, newCharacterId);

    // deal with all parts
    for (uint i = 0; i < tokenList.length; ++i) {
      if (tokenList[i] == 0) {
        continue;
      }

      //require(_tokenOwnOf(tokenList[i]) == tx.origin, "parts not owner");
      require(_erc721Proxy.ownerOf(tokenList[i]) == tx.origin, "parts !owner");
      require(_tokenList[tokenList[i]]._wearToken == 0, "weared");

      // wear parts
      uint8 position = _tokenList[tokenList[i]]._position;
      uint256 partsId = _characterList[newCharacterId]._tokenList[position];

      _characterList[newCharacterId]._tokenList[position] = tokenList[i];
      _tokenList[tokenList[i]]._wearToken = newCharacterId;
      _erc721Proxy.burnBy(tokenList[i]);

      // mint weared parts
      if (partsId != 0) {
        _tokenList[partsId]._wearToken = 0;
        _erc721Proxy.mintBy(tx.origin, partsId);
      }
    }

    // burn old token and remint character 
    _erc721Proxy.burnBy(characterId);
    delete _characterList[characterId];

    _characterList[newCharacterId]._totalPower = _calcTotalPower(newCharacterId);
    _erc721Proxy.mintBy(tx.origin, newCharacterId);
  }

  function takeOff(uint256 characterId, uint8[] memory positions) external override {
    //require(_characterOwnOf(characterId) == tx.origin, "Not owner");
    require(_erc721Proxy.ownerOf(characterId) == tx.origin, "!owner");
    require(positions.length > 0, "Empty position");
    
    // create new character
    uint256 newCharacterId = ++_config._currentTokenId;
    _copyCharacter(characterId, newCharacterId);

    // deal with all parts
    for (uint i=0; i<positions.length; ++i) {
      require(positions[i]<_config._maxPosition, "Invalid position");

      uint256 partsId = _characterList[newCharacterId]._tokenList[positions[i]];
      if (partsId == 0) {
        continue;
      }

      _characterList[newCharacterId]._tokenList[positions[i]] = 0;
      _tokenList[partsId]._wearToken = 0;
      _erc721Proxy.mintBy(tx.origin, partsId);
    }

    // burn old token and remint character 
    _erc721Proxy.burnBy(characterId);
    delete _characterList[characterId];

    _characterList[newCharacterId]._totalPower = _calcTotalPower(newCharacterId);
    _erc721Proxy.mintBy(tx.origin, newCharacterId);
  }

  function upgradeToken(uint256 firstTokenId, uint256 secondTokenId) external override {
  
    require(_erc721Proxy.ownerOf(firstTokenId) == tx.origin, "first !owner");
    require(_erc721Proxy.ownerOf(secondTokenId) == tx.origin, "second !owner");

    // check pats can upgrade
    require(keccak256(bytes(_tokenList[firstTokenId]._name)) == keccak256(bytes(_tokenList[secondTokenId]._name)), "!name");
    require(_tokenList[firstTokenId]._level == _tokenList[secondTokenId]._level, "!level");
    require(_tokenList[firstTokenId]._position == _tokenList[secondTokenId]._position, "!position");
    require(_tokenList[firstTokenId]._rare == _tokenList[secondTokenId]._rare, "!rare");
    require(_tokenList[firstTokenId]._level < 9, "Max level");
    
    require(_tokenList[firstTokenId]._wearToken == 0, "f weared");
    require(_tokenList[secondTokenId]._wearToken == 0, "s weared");

    // basepower = (basepower * 1.25 ** level) * +1.1
    uint32 basePower = _partsInfo._partsPowerList[_tokenList[firstTokenId]._position][_tokenList[firstTokenId]._rare];
    basePower = uint32(basePower * (125 ** (_tokenList[firstTokenId]._level - 1)) / (100 ** (_tokenList[firstTokenId]._level - 1)));
    uint32 randPower = uint32(basePower < 10 ? _getRandom(uint256(256).toString()) % 1 : _getRandom(uint256(256).toString()) % (basePower / 10));

    // create new parts
    uint256 newTokenId = ++_config._currentTokenId;
    _tokenList[newTokenId] = LibEverLight.TokenInfo(newTokenId, /*tx.origin,*/ _tokenList[firstTokenId]._position, _tokenList[firstTokenId]._rare,
                                                    _tokenList[firstTokenId]._name, _tokenList[firstTokenId]._suitId, basePower + randPower,
                                                    _tokenList[firstTokenId]._level + 1, false, 0);

    // remove old token
    _erc721Proxy.burnBy(firstTokenId);
    delete _tokenList[firstTokenId];
    _erc721Proxy.burnBy(secondTokenId);
    delete _tokenList[secondTokenId];
    
    // mint new token
    _erc721Proxy.mintBy(tx.origin, newTokenId);
  }

  function upgradeWearToken(uint256 characterId, uint256 tokenId) external override {
    //require(_characterOwnOf(characterId) == tx.origin, "Not owner");
    require(_erc721Proxy.ownerOf(characterId) == tx.origin, "!owner");
    //require(_tokenOwnOf(tokenId) == tx.origin, "Not owner");
    require(_erc721Proxy.ownerOf(tokenId) == tx.origin, "parts !owner");

    uint8 position = _tokenList[tokenId]._position;
    uint256 partsId = _characterList[characterId]._tokenList[position];

    // check pats can upgrade
    require(keccak256(bytes(_tokenList[tokenId]._name)) == keccak256(bytes(_tokenList[partsId]._name)), "!token");
    require(_tokenList[tokenId]._level == _tokenList[partsId]._level, "!level");
    require(_tokenList[tokenId]._rare == _tokenList[partsId]._rare, "!rare");
    require(_tokenList[tokenId]._level < 9, "Max level");
    require(_tokenList[tokenId]._wearToken == 0, "Weared");

    // create new character
    uint256 newCharacterId = ++_config._currentTokenId;
    _copyCharacter(characterId, newCharacterId);

    // basepower = (basepower * 1.25 ** level) * +1.1
    uint32 basePower = _partsInfo._partsPowerList[position][_tokenList[partsId]._rare];
    basePower = uint32(basePower * (125 ** (_tokenList[partsId]._level - 1)) / (100 ** (_tokenList[partsId]._level - 1)));
    uint32 randPower = uint32(basePower < 10 ? _getRandom(uint256(256).toString()) % 1 : _getRandom(uint256(256).toString()) % (basePower / 10));

    // create new parts
    uint256 newTokenId = ++_config._currentTokenId;
    _tokenList[newTokenId] = LibEverLight.TokenInfo(newTokenId, /*tx.origin,*/ _tokenList[partsId]._position, _tokenList[partsId]._rare,
                                                    _tokenList[partsId]._name, _tokenList[partsId]._suitId, basePower + randPower,
                                                    _tokenList[partsId]._level + 1, false, newCharacterId);

    _characterList[newCharacterId]._tokenList[position] = newTokenId;
    _characterList[newCharacterId]._totalPower = _calcTotalPower(newCharacterId);

    // remove old parts
    _erc721Proxy.burnBy(tokenId);
    delete _tokenList[tokenId];
    delete _tokenList[partsId];

    // burn old token and remint character 
    _erc721Proxy.burnBy(characterId);
    delete _characterList[characterId];
    _erc721Proxy.mintBy(tx.origin, newCharacterId);
  }

  function exchangeToken(uint32 mapId, uint256[] memory mapTokenList) external override {
    require(mapId < _config._mapContracts.length, "Invalid map");

    for (uint i=0; i<mapTokenList.length; ++i) {
      // burn map token
      _transferERC721(_config._mapContracts[mapId], tx.origin, address(this), mapTokenList[i]);

      // generate new token
      uint256 newTokenId = _genRandomToken(uint8(_getRandom(mapTokenList[i].toString()) % _config._maxPosition));

      _erc721Proxy.mintBy(tx.origin, newTokenId);
    }
  }

  function buyLuckyStone(uint8 count) external override {
    require(_config._tokenContract != address(0), "Not open");

    // transfer token to address 0
    uint256 totalToken = _config._luckyStonePrice * count;
    _transferERC20(_config._tokenContract, tx.origin, address(this), totalToken);

    // mint luck stone 
    for (uint8 i=0; i<count; ++i) {
      uint256 newTokenId = ++_config._currentTokenId;
      (_tokenList[newTokenId]._tokenId, _tokenList[newTokenId]._position, _tokenList[newTokenId]._name) = (newTokenId, 99, "Lucky Stone");

      _erc721Proxy.mintBy(tx.origin, newTokenId);
    }
  }

  function useLuckyStone(uint256[] memory tokenId) external override {
    for (uint i=0; i<tokenId.length; ++i) {
      //require(_tokenOwnOf(tokenId[i]) == tx.origin, "Not owner");
      require(_erc721Proxy.ownerOf(tokenId[i]) == tx.origin, "stone !owner");
      require(_tokenList[tokenId[i]]._position == 99, "Not lucky stone");

      ++_accountList[tx.origin]._luckyNum;

      // burn luck stone token
      _erc721Proxy.burnBy(tokenId[i]);
      delete _tokenList[tokenId[i]];
    }
  }

  function newTokenType(uint256 tokenId, string memory name, uint32 suitId) external override {
    //require(_tokenOwnOf(tokenId) == tx.origin, "Not owner");
    require(_erc721Proxy.ownerOf(tokenId) == tx.origin, "!owner");
    require(_tokenList[tokenId]._level == 9, "level != 9");
    require(!_tokenList[tokenId]._createFlag, "createFlag=true");
    require(bytes(name).length <= 16, "Error name");

    // create new parts type
    uint8 position = _tokenList[tokenId]._position;
    uint8 rare = _tokenList[tokenId]._rare + 1;
    uint256 nameFlag = uint256(keccak256(abi.encodePacked(name)));
    
    require(_partsInfo._partsPowerList[position][rare] > 0, "Not open");
    require(!_partsInfo._nameFlag[nameFlag], "Error name");
    
    if (suitId == 0) {
      suitId = ++_config._totalSuitNum;
      _partsInfo._suitFlag[suitId] = tx.origin;
    } else {
      require(_partsInfo._suitFlag[suitId] == tx.origin, "Not own the suit");
    }

    _partsInfo._partsTypeList[position][rare].push(LibEverLight.SuitInfo(name, suitId));
    _partsInfo._partsCount[position] = _partsInfo._partsCount[position] + 1;
    _partsInfo._nameFlag[nameFlag] = true;
    emit NewTokenType(tx.origin, position, rare, name, suitId);

    // create 3 new token for creator
    for (uint i=0; i<3; ++i) {
      uint256 newTokenId = ++_config._currentTokenId;
      uint32 randPower = uint32(_partsInfo._partsPowerList[position][rare] < 10 ?
                                _getRandom(uint256(256).toString()) % 1 :
                                _getRandom(uint256(256).toString()) % (_partsInfo._partsPowerList[position][rare] / 10));

        // create token information
        _tokenList[newTokenId] = LibEverLight.TokenInfo(newTokenId, /*tx.origin, */position, rare, name, suitId, 
                                                    _partsInfo._partsPowerList[position][rare] + randPower, 1, false, 0);

        _erc721Proxy.mintBy(tx.origin, newTokenId);
    }

    // update token and charactor information
    uint256 newPartsTokenId = ++_config._currentTokenId;
    _tokenList[newPartsTokenId] = LibEverLight.TokenInfo(newPartsTokenId,/* tx.origin,*/ position, rare - 1, _tokenList[tokenId]._name, 
                                                         _tokenList[tokenId]._suitId, _tokenList[tokenId]._power, 9, true, _tokenList[tokenId]._wearToken);

    if (_tokenList[newPartsTokenId]._wearToken != 0) {
      _characterList[_tokenList[newPartsTokenId]._wearToken]._tokenList[position] = newPartsTokenId;
    } else {
      _erc721Proxy.burnBy(tokenId);
      _erc721Proxy.mintBy(tx.origin, newPartsTokenId);
    }

    delete _tokenList[tokenId];
  }

  // internal functions
  /*function _characterOwnOf(uint256 tokenId) internal view returns (address) {
    return _characterList[tokenId]._owner;
  }*/

  /*function _tokenOwnOf(uint256 tokenId) internal view returns (address) {
    return _tokenList[tokenId]._owner;
  }*/

  function _getRandom(string memory purpose) internal view returns (uint256) {
    return uint256(keccak256(abi.encodePacked(block.timestamp, tx.gasprice, tx.origin, purpose)));
  }

  function _genRandomToken(uint8 position) internal returns (uint256 tokenId) {
    // create random number and plus lucky number on msg.sender
    uint256 luckNum = _getRandom(uint256(position).toString()) % _partsInfo._partsCount[position] + _accountList[tx.origin]._luckyNum;
    if (luckNum >= _partsInfo._partsCount[position]) {
      luckNum = _partsInfo._partsCount[position] - 1;
    }

    // find the parts on position by lucky number
    tokenId = ++_config._currentTokenId;
    for(uint8 rare=0; rare<256; ++rare) {
      if (luckNum >= _partsInfo._partsTypeList[position][rare].length) {
        luckNum -= _partsInfo._partsTypeList[position][rare].length;
        continue;
      }

      // calc rand power by base power and +10%
      uint32 randPower = uint32(_partsInfo._partsPowerList[position][rare] <= 10 ?
                                _getRandom(uint256(256).toString()) % 1 :
                                _getRandom(uint256(256).toString()) % (_partsInfo._partsPowerList[position][rare] / 10));

      // create token information
      _tokenList[tokenId] = LibEverLight.TokenInfo(tokenId, /*tx.origin,*/ position, rare, _partsInfo._partsTypeList[position][rare][luckNum]._name,
                                                   _partsInfo._partsTypeList[position][rare][luckNum]._suitId, 
                                                   _partsInfo._partsPowerList[position][rare] + randPower, 1, false, 0);
      break;
    }

    // clear lucky value on msg.sender, only used once
    _accountList[tx.origin]._luckyNum = 0;
  }

  function _createCharacter() internal returns (uint256 tokenId) {
    // create character
    tokenId = ++_config._currentTokenId;
    _characterList[tokenId]._tokenId = tokenId;
    //_characterList[tokenId]._owner = tx.origin;
    _characterList[tokenId]._powerFactor = uint32(_getRandom(uint256(256).toString()) % 30);

    // create all random parts for character
    for (uint8 i=0; i<_config._maxPosition; ++i) {
      uint256 partsId = _genRandomToken(i);

      _characterList[tokenId]._tokenList[i] = partsId;
      _tokenList[partsId]._wearToken = tokenId;
    }

    // calc total power of character
    _characterList[tokenId]._totalPower = _calcTotalPower(tokenId);
  }

  function _calcTotalPower(uint256 tokenId) internal view returns (uint32 totalPower) {
    uint256 lastSuitId;
    bool suitFlag = true;

    // sum parts power
    for (uint8 i=0; i<_config._maxPosition; ++i) {
      uint256 index = _characterList[tokenId]._tokenList[i];
      if (index == 0) {
        suitFlag = false;
        continue;
      }

      totalPower += _tokenList[index]._power;
      
      if (suitFlag == false || _tokenList[index]._suitId == 0) {
        suitFlag = false;
        continue;
      } 

      if (lastSuitId == 0) {
        lastSuitId = _tokenList[index]._suitId;
        continue;
      }

      if (_tokenList[index]._suitId != lastSuitId) {
        suitFlag = false;
      }
    }

    // calc suit power
    if (suitFlag) {
      totalPower += totalPower * 12 / 100;
    }
    totalPower += totalPower * _characterList[tokenId]._powerFactor / 100;
  }

  function _copyCharacter(uint256 oldId, uint256 newId) internal {
    (_characterList[newId]._tokenId, /*_characterList[newId]._owner,*/ _characterList[newId]._powerFactor) = (newId,/* tx.origin,*/ _characterList[oldId]._powerFactor);

    // copy old character's all parts info
    for (uint8 index=0; index<_config._maxPosition; ++index) {
      _characterList[newId]._tokenList[index] = _characterList[oldId]._tokenList[index];
      // 
      _tokenList[_characterList[newId]._tokenList[index]]._wearToken = newId;
    }
  }

  function _transferERC20(address contractAddress, address from, address to, uint256 amount) internal {
    //uint256 balanceBefore = IERC20(contractAddress).balanceOf(from);
    IERC20(contractAddress).transferFrom(from, to, amount);

    bool success;
    assembly {
      switch returndatasize()
        case 0 {                       // This is a non-standard ERC-20
            success := not(0)          // set success to true
        }
        case 32 {                      // This is a compliant ERC-20
            returndatacopy(0, 0, 32)
            success := mload(0)        // Set `success = returndata` of external call
        }
        default {                      // This is an excessively non-compliant ERC-20, revert.
            revert(0, 0)
        }
    }
    require(success, "Transfer failed");
  }

  function _transferERC721(address contractAddress, address from, address to, uint256 tokenId) internal {
    address ownerBefore = IERC721(contractAddress).ownerOf(tokenId);
    require(ownerBefore == from, "Not own token");
    
    IERC721(contractAddress).transferFrom(from, to, tokenId);

    address ownerAfter = IERC721(contractAddress).ownerOf(tokenId);
    require(ownerAfter == to, "Transfer failed");
  }

  // governace functions
  function withdraw() external onlyOwner {
    payable(msg.sender).transfer(address(this).balance);
  }

  function setMintFee(uint256 baseFee, uint32 incrPerNum, uint256 incrFee, uint32 decrBlockNum, uint256 decrFee) external onlyOwner {
    (_config._baseFee, _config._incrPerNum, _config._incrFee, _config._decrBlockNum, _config._decrFee) = (baseFee, incrPerNum, incrFee, decrBlockNum, decrFee);
  }

  function addPartsType(uint8 position, uint8 rare, string memory color, uint256 power, string[] memory names, uint32[] memory suits) external onlyOwner {
    _partsInfo._partsPowerList[position][rare] = uint32(power);
    _partsInfo._rareColor[rare] = color;

    for (uint i=0; i<names.length; ++i) {
      _partsInfo._partsTypeList[position][rare].push(LibEverLight.SuitInfo(names[i], suits[i]));
      _partsInfo._nameFlag[uint256(keccak256(abi.encodePacked(names[i])))] = true;

      if (suits[i] > 0 ) {
        if (_partsInfo._suitFlag[suits[i]] == address(0)) {
          _config._totalSuitNum = _config._totalSuitNum < suits[i] ? suits[i] : _config._totalSuitNum;
          _partsInfo._suitFlag[suits[i]] = tx.origin;
        } else {
          require(_partsInfo._suitFlag[suits[i]] == tx.origin, "Not own the suit");
        }
      }
    }
    
    _partsInfo._partsCount[position] = uint32(_partsInfo._partsCount[position] + names.length);
  }

  function setLuckStonePrice(uint32 price) external onlyOwner {
    _config._luckyStonePrice = price;
  }
 
  function setMaxPosition(uint32 maxPosition) external onlyOwner {
    _config._maxPosition = maxPosition;
  }

  function setGovernaceAddress(address governaceAddress) external onlyOwner {
    _config._goverContract = governaceAddress;
  }

  function setTokenAddress(address tokenAddress) external onlyOwner {
    _config._tokenContract = tokenAddress;
  }
  
  function addMapAddress(address mapAddress) external onlyOwner {
    _config._mapContracts.push(mapAddress);
  }

  function setERC721Proxy(address proxyAddress) external onlyOwner {
    _erc721Proxy = IERC721Proxy(proxyAddress);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint8","name":"position","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rare","type":"uint8"},{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"suitId","type":"uint256"}],"name":"NewTokenType","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"_erc721Proxy","outputs":[{"internalType":"contract IERC721Proxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mapAddress","type":"address"}],"name":"addMapAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"position","type":"uint8"},{"internalType":"uint8","name":"rare","type":"uint8"},{"internalType":"string","name":"color","type":"string"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"uint32[]","name":"suits","type":"uint32[]"}],"name":"addPartsType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"buyLuckyStone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"mapId","type":"uint32"},{"internalType":"uint256[]","name":"mapTokenList","type":"uint256[]"}],"name":"exchangeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"isNameExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint32","name":"suitId","type":"uint32"}],"name":"newTokenType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"queryAccount","outputs":[{"components":[{"internalType":"bool","name":"_creationFlag","type":"bool"},{"internalType":"uint32","name":"_luckyNum","type":"uint32"}],"internalType":"struct LibEverLight.Account","name":"account","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"}],"name":"queryCharacter","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint32","name":"powerFactor","type":"uint32"},{"internalType":"uint256[]","name":"tokenList","type":"uint256[]"},{"internalType":"uint32","name":"totalPower","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryCharacterCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint256","name":"extraKey","type":"uint256"}],"name":"queryCharacterExtra","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"rare","type":"uint8"}],"name":"queryColorByRare","outputs":[{"internalType":"string","name":"color","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryLuckyStonePrice","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryMapInfo","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"suitId","type":"uint32"}],"name":"querySuitOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"queryToken","outputs":[{"components":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_position","type":"uint8"},{"internalType":"uint8","name":"_rare","type":"uint8"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint32","name":"_suitId","type":"uint32"},{"internalType":"uint32","name":"_power","type":"uint32"},{"internalType":"uint8","name":"_level","type":"uint8"},{"internalType":"bool","name":"_createFlag","type":"bool"},{"internalType":"uint256","name":"_wearToken","type":"uint256"}],"internalType":"struct LibEverLight.TokenInfo","name":"tokenInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"queryTokenType","outputs":[{"internalType":"uint8","name":"tokenType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint256","name":"extraKey","type":"uint256"},{"internalType":"string","name":"extraValue","type":"string"}],"name":"setCharacterExtra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"setERC721Proxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governaceAddress","type":"address"}],"name":"setGovernaceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"price","type":"uint32"}],"name":"setLuckStonePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"maxPosition","type":"uint32"}],"name":"setMaxPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseFee","type":"uint256"},{"internalType":"uint32","name":"incrPerNum","type":"uint32"},{"internalType":"uint256","name":"incrFee","type":"uint256"},{"internalType":"uint32","name":"decrBlockNum","type":"uint32"},{"internalType":"uint256","name":"decrFee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint8[]","name":"positions","type":"uint8[]"}],"name":"takeOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"firstTokenId","type":"uint256"},{"internalType":"uint256","name":"secondTokenId","type":"uint256"}],"name":"upgradeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"upgradeWearToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"useLuckyStone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"},{"internalType":"uint256[]","name":"tokenList","type":"uint256[]"}],"name":"wear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50620000266200002062000093565b62000097565b68015af1d78b58c400006002819055600380546109c463ffffffff19918216179091556004829055600580546161a89216919091179055600655600a805463ffffffff60201b1916640b000000001763ffffffff60401b19166907d00000000000000000179055620000e7565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b615fe380620000f76000396000f3fe6080604052600436106101f95760003560e01c80637229545e1161010d578063be4df0f7116100a0578063dae3b65c1161006f578063dae3b65c146105ac578063dfe7f7e7146105cc578063f2fde38b146105fc578063f56981bf1461061c578063fdde4d5e1461063c576101f9565b8063be4df0f71461051f578063c3c9569e1461053f578063c3fcf9d31461055f578063cfa0ec3c1461058c576101f9565b8063a2f1b0af116100dc578063a2f1b0af146104a8578063a5236728146104d5578063a581b9de146104f5578063b90f644c1461050a576101f9565b80637229545e1461041957806383015eb3146104395780638da5cb5b14610466578063a2768db514610488576101f9565b806334bae0f911610190578063563faae91161015f578063563faae91461037757806356a672e01461039757806365f63c1b146103b757806366a99610146103e4578063715018a614610404576101f9565b806334bae0f9146102f55780633cbb9f09146103155780633ccfd60b1461033557806354d85c4e1461034a576101f9565b806326a4e8d2116101cc57806326a4e8d21461027357806326f5ef03146102935780632ed59247146102b357806332907fb7146102d3576101f9565b80630572034d146101fe5780631249c58b14610220578063185c0181146102285780631f57acb214610253575b600080fd5b34801561020a57600080fd5b5061021e610219366004614fde565b61065c565b005b61021e610913565b34801561023457600080fd5b5061023d610b7d565b60405161024a919061554b565b60405180910390f35b34801561025f57600080fd5b5061021e61026e36600461509e565b610be2565b34801561027f57600080fd5b5061021e61028e366004614f9f565b610fb4565b34801561029f57600080fd5b5061021e6102ae36600461529e565b611015565b3480156102bf57600080fd5b5061021e6102ce36600461524f565b61119e565b3480156102df57600080fd5b506102e8611204565b60405161024a9190615b8e565b34801561030157600080fd5b5061021e610310366004614f9f565b611217565b34801561032157600080fd5b5061021e610330366004615269565b6112a8565b34801561034157600080fd5b5061021e611434565b34801561035657600080fd5b5061036a610365366004614f9f565b6114a2565b60405161024a9190615a51565b34801561038357600080fd5b5061021e610392366004614f9f565b6114e9565b3480156103a357600080fd5b5061021e6103b2366004615140565b61154a565b3480156103c357600080fd5b506103d76103d2366004615042565b611f45565b60405161024a9190615a70565b3480156103f057600080fd5b5061021e6103ff366004615202565b612076565b34801561041057600080fd5b5061021e6120e9565b34801561042557600080fd5b5061021e610434366004615194565b612134565b34801561044557600080fd5b50610459610454366004615042565b61297b565b60405161024a9190615b9f565b34801561047257600080fd5b5061047b6129dd565b60405161024a91906154fa565b34801561049457600080fd5b5061021e6104a3366004614f9f565b6129ec565b3480156104b457600080fd5b506104c86104c3366004615194565b612a58565b60405161024a91906155a3565b3480156104e157600080fd5b506104c86104f036600461529e565b612bb0565b34801561050157600080fd5b5061047b612c56565b34801561051657600080fd5b506102e8612c65565b34801561052b57600080fd5b5061047b61053a36600461524f565b612c78565b34801561054b57600080fd5b5061021e61055a3660046152b8565b612c99565b34801561056b57600080fd5b5061057f61057a366004615010565b613109565b60405161024a9190615598565b34801561059857600080fd5b5061021e6105a7366004615194565b613152565b3480156105b857600080fd5b5061021e6105c73660046151b5565b6139f9565b3480156105d857600080fd5b506105ec6105e7366004615042565b613acf565b60405161024a9493929190615b28565b34801561060857600080fd5b5061021e610617366004614f9f565b613bde565b34801561062857600080fd5b5061021e61063736600461524f565b613c4c565b34801561064857600080fd5b5061021e61065736600461505a565b613cb6565b60005b815181101561090f57600154825132916001600160a01b031690636352211e9085908590811061069f57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016106c39190615b1f565b60206040518083038186803b1580156106db57600080fd5b505afa1580156106ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107139190614fc2565b6001600160a01b0316146107425760405162461bcd60e51b815260040161073990615607565b60405180910390fd5b6013600083838151811061076657634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000206001015460ff166063146107a65760405162461bcd60e51b81526004016107399061564f565b32600090815260146020526040902080546001906107ce90610100900463ffffffff16615efe565b91906101000a81548163ffffffff021916908363ffffffff160217905550600160009054906101000a90046001600160a01b03166001600160a01b031663101b8d5d83838151811061083057634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016108549190615b1f565b600060405180830381600087803b15801561086e57600080fd5b505af1158015610882573d6000803e3d6000fd5b50505050601360008383815181106108aa57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600090812081815560018101805461ffff19169055906108e46002830182614d0c565b506003810180546001600160501b0319169055600060049091015561090881615ee3565b905061065f565b5050565b3260009081526014602052604090205460ff16156109435760405162461bcd60e51b8152600401610739906158c9565b6004546003546008546000928392909161096d9163ffffffff90811691600160201b900416615ca1565b63ffffffff1661097d9190615ddb565b60025461098a9190615c28565b600754909150156109bb5760055460075463ffffffff909116906109ae9043615e1d565b6109b89190615ca1565b91505b600654600854600091906109d690859063ffffffff16615c40565b63ffffffff166109e69190615ddb565b60025490915081906109f89084615e1d565b11610a0557600254610a0f565b610a0f8183615e1d565b915081341015610a315760405162461bcd60e51b815260040161073990615828565b6000610a3b614126565b326000908152601460205260409020805460ff19166001179055905034831015610a9757326108fc610a6d8534615e1d565b6040518115909202916000818181858888f19350505050158015610a95573d6000803e3d6000fd5b505b6008805460019190600490610aba908490600160201b900463ffffffff16615c40565b82546101009290920a63ffffffff81810219909316918316021790915543600755600880548793509091600091610af391859116615c40565b825463ffffffff9182166101009390930a928302919092021990911617905550600154604051637f4a838f60e01b81526001600160a01b0390911690637f4a838f90610b459032908590600401615532565b600060405180830381600087803b158015610b5f57600080fd5b505af1158015610b73573d6000803e3d6000fd5b5050505050505050565b60606002600a01805480602002602001604051908101604052809291908181526020018280548015610bd857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bba575b5050505050905090565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e90610c12908690600401615b1f565b60206040518083038186803b158015610c2a57600080fd5b505afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614fc2565b6001600160a01b031614610c885760405162461bcd60e51b815260040161073990615a31565b6000815111610ca95760405162461bcd60e51b81526004016107399061597d565b6000600260070160008154610cbd90615ee3565b91829055509050610cce8382614233565b60005b8251811015610e8557600a548351600160201b90910463ffffffff1690849083908110610d0e57634e487b7160e01b600052603260045260246000fd5b602002602001015160ff1610610d365760405162461bcd60e51b8152600401610739906155b6565b6000601560008481526020019081526020016000206002016000858481518110610d7057634e487b7160e01b600052603260045260246000fd5b602002602001015160ff1660ff1681526020019081526020016000205490508060001415610d9e5750610e75565b6000601560008581526020019081526020016000206002016000868581518110610dd857634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160ff16825281810192909252604090810160009081209390935583835260139091528082206004908101929092556001549051637f4a838f60e01b81526001600160a01b0390911691637f4a838f91610e41913291869101615532565b600060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b50505050505b610e7e81615ee3565b9050610cd1565b5060015460405163101b8d5d60e01b81526001600160a01b039091169063101b8d5d90610eb6908690600401615b1f565b600060405180830381600087803b158015610ed057600080fd5b505af1158015610ee4573d6000803e3d6000fd5b505050600084815260156020526040812090815560018101805463ffffffff1990811690915560039091018054909116905550610f20816142de565b60008281526015602052604090819020600301805463ffffffff191663ffffffff93909316929092179091556001549051637f4a838f60e01b81526001600160a01b0390911690637f4a838f90610f7d9032908590600401615532565b600060405180830381600087803b158015610f9757600080fd5b505af1158015610fab573d6000803e3d6000fd5b50505050505050565b610fbc61444f565b6001600160a01b0316610fcd6129dd565b6001600160a01b031614610ff35760405162461bcd60e51b815260040161073990615894565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031661103d5760405162461bcd60e51b81526004016107399061562d565b600a5460009061105e9060ff841690600160401b900463ffffffff16615dfa565b600b5463ffffffff919091169150611081906001600160a01b0316323084614453565b60005b8260ff168160ff1610156111995760006002600701600081546110a690615ee3565b9182905550604080518082018252600b81526a4c75636b792053746f6e6560a81b602080830191825260008581526013909152928320825194955085946063949192600184019183916110fe91600287019190614d48565b50815460ff9687166101009290920a91820296909102191694909417909355929092555050600154604051637f4a838f60e01b81526001600160a01b0390911690637f4a838f906111559032908590600401615532565b600060405180830381600087803b15801561116f57600080fd5b505af1158015611183573d6000803e3d6000fd5b50505050508061119290615f22565b9050611084565b505050565b6111a661444f565b6001600160a01b03166111b76129dd565b6001600160a01b0316146111dd5760405162461bcd60e51b815260040161073990615894565b600a805463ffffffff909216600160201b0267ffffffff0000000019909216919091179055565b600854600160201b900463ffffffff1690565b61121f61444f565b6001600160a01b03166112306129dd565b6001600160a01b0316146112565760405162461bcd60e51b815260040161073990615894565b600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b600c5463ffffffff8316106112cf5760405162461bcd60e51b815260040161073990615728565b60005b8151811015611199576113556002600a018463ffffffff168154811061130857634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316323085858151811061134857634e487b7160e01b600052603260045260246000fd5b6020026020010151614508565b60006113bd600260080160049054906101000a900463ffffffff1663ffffffff166113ae6113a986868151811061139c57634e487b7160e01b600052603260045260246000fd5b60200260200101516146d6565b6147f0565b6113b89190615f42565b614827565b600154604051637f4a838f60e01b81529192506001600160a01b031690637f4a838f906113f09032908590600401615532565b600060405180830381600087803b15801561140a57600080fd5b505af115801561141e573d6000803e3d6000fd5b50505050508061142d90615ee3565b90506112d2565b61143c61444f565b6001600160a01b031661144d6129dd565b6001600160a01b0316146114735760405162461bcd60e51b815260040161073990615894565b60405133904780156108fc02916000818181858888f1935050505015801561149f573d6000803e3d6000fd5b50565b6114aa614dcc565b506001600160a01b031660009081526014602090815260409182902082518084019093525460ff811615158352610100900463ffffffff169082015290565b6114f161444f565b6001600160a01b03166115026129dd565b6001600160a01b0316146115285760405162461bcd60e51b815260040161073990615894565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e9061157a908790600401615b1f565b60206040518083038186803b15801561159257600080fd5b505afa1580156115a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ca9190614fc2565b6001600160a01b0316146115f05760405162461bcd60e51b815260040161073990615a31565b600083815260136020526040902060030154600160401b900460ff1660091461162b5760405162461bcd60e51b8152600401610739906159c8565b600083815260136020526040902060030154600160481b900460ff16156116645760405162461bcd60e51b81526004016107399061579a565b6010825111156116865760405162461bcd60e51b815260040161073990615959565b600083815260136020526040812060019081015460ff80821693926116b392610100900490911690615c68565b90506000846040516020016116c89190615498565b60408051601f19818403018152918152815160209283012060ff8087166000908152600d85528381209187168152935291205490915063ffffffff166117205760405162461bcd60e51b81526004016107399061562d565b60008181526012602052604090205460ff161561174f5760405162461bcd60e51b815260040161073990615959565b63ffffffff84166117b357600a80546000906117709063ffffffff16615efe565b825463ffffffff8083166101009490940a84810291021990911617909255600090815260116020526040902080546001600160a01b0319163217905593506117f0565b63ffffffff84166000908152601160205260409020546001600160a01b031632146117f05760405162461bcd60e51b815260040161073990615770565b60ff8084166000908152600e602090815260408083209386168352928152828220835180850190945288845263ffffffff881684830152805460018101825590835291819020835180516002909402909101926118509284920190614d48565b506020918201516001918201805463ffffffff191663ffffffff92831617905560ff86166000908152600f90935260409092205461188f921690615c40565b60ff84166000908152600f60209081526040808320805463ffffffff191663ffffffff959095169490941790935583825260129052819020805460ff19166001179055516118de908690615498565b6040518091039020326001600160a01b03167f918f6a834925aa97e877a46764ca0c97c84cfe64c8b209f30d3f4096150875c985858860405161192393929190615bad565b60405180910390a360005b6003811015611bcd57600060026007016000815461194b90615ee3565b918290555060ff8087166000908152600d6020908152604080832093891683529290529081205491925090600a63ffffffff909116106119da5760ff8087166000908152600d60209081526040808320938916835292905220546119b790600a9063ffffffff16615ca1565b63ffffffff166119cb6113a96101006146d6565b6119d59190615f42565b6119f4565b60016119ea6113a96101006146d6565b6119f49190615f42565b604080516101208101825284815260ff808a166020808401829052918a16838501819052606084018e905263ffffffff808e1660808601526000928352600d8452858320918352925292909220549293509160a0830191611a5791859116615c40565b63ffffffff168152600160208083018290526000604080850182905260609485018290528782526013835290819020855181558583015193810180549287015160ff1990931660ff9586161761ff0019166101009590931694909402919091179092559183015180519192611ad492600285019290910190614d48565b50608082015160038201805460a085015160c086015160e08701511515600160481b0260ff60481b1960ff909216600160401b0260ff60401b1963ffffffff948516600160201b0267ffffffff00000000199590981663ffffffff1990961695909517939093169590951792909216171691909117905561010090910151600491820155600154604051637f4a838f60e01b81526001600160a01b0390911691637f4a838f91611b88913291879101615532565b600060405180830381600087803b158015611ba257600080fd5b505af1158015611bb6573d6000803e3d6000fd5b50505050505080611bc690615ee3565b905061192e565b506000600260070160008154611be290615ee3565b9182905550604080516101208101825282815260ff871660208201529192508101611c0e600186615e59565b60ff168152602001601360008a81526020019081526020016000206002018054611c3790615ea8565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6390615ea8565b8015611cb05780601f10611c8557610100808354040283529160200191611cb0565b820191906000526020600020905b815481529060010190602001808311611c9357829003601f168201915b50505091835250506000898152601360208181526040808420600381015463ffffffff80821685890152600160201b9091041682870152600960608088019190915260016080880181905260049092015460a09097019690965287855292825292839020855181558582015192810180549487015160ff9081166101000261ff00199190951660ff19909616959095179490941692909217909255918301518051611d619260028501920190614d48565b50608082015160038201805460a085015160c086015160e08701511515600160481b0260ff60481b1960ff909216600160401b0260ff60401b1963ffffffff948516600160201b0267ffffffff00000000199590981663ffffffff19909616959095179390931695909517929092161716919091179055610100909101516004918201556000828152601360205260409020015415611e2e5760008181526013602090815260408083206004015483526015825280832060ff881684526002019091529020819055611ef5565b60015460405163101b8d5d60e01b81526001600160a01b039091169063101b8d5d90611e5e908a90600401615b1f565b600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b5050600154604051637f4a838f60e01b81526001600160a01b039091169250637f4a838f9150611ec29032908590600401615532565b600060405180830381600087803b158015611edc57600080fd5b505af1158015611ef0573d6000803e3d6000fd5b505050505b600087815260136020526040812081815560018101805461ffff1916905590611f216002830182614d0c565b506003810180546001600160501b0319169055600060049091015550505050505050565b611f4d614de3565b60008281526013602090815260409182902082516101208101845281548152600182015460ff80821694830194909452610100900490921692820192909252600282018054919291606084019190611fa490615ea8565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd090615ea8565b801561201d5780601f10611ff25761010080835404028352916020019161201d565b820191906000526020600020905b81548152906001019060200180831161200057829003601f168201915b5050509183525050600382015463ffffffff8082166020840152600160201b820416604083015260ff600160401b820481166060840152600160481b909104161515608082015260049091015460a09091015292915050565b61207e61444f565b6001600160a01b031661208f6129dd565b6001600160a01b0316146120b55760405162461bcd60e51b815260040161073990615894565b6006556005805463ffffffff92831663ffffffff199182161790915560049290925560038054919093169116179055600255565b6120f161444f565b6001600160a01b03166121026129dd565b6001600160a01b0316146121285760405162461bcd60e51b815260040161073990615894565b6121326000614cbc565b565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e90612164908690600401615b1f565b60206040518083038186803b15801561217c57600080fd5b505afa158015612190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b49190614fc2565b6001600160a01b0316146121da5760405162461bcd60e51b8152600401610739906157c3565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e9061220a908590600401615b1f565b60206040518083038186803b15801561222257600080fd5b505afa158015612236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225a9190614fc2565b6001600160a01b0316146122805760405162461bcd60e51b8152600401610739906155e0565b60008181526013602052604090819020905161229f91600201906153fd565b60408051918290038220600085815260136020529190912090916122c691600201906153fd565b6040518091039020146122eb5760405162461bcd60e51b81526004016107399061569a565b6000818152601360205260408082206003908101548584529190922090910154600160401b9182900460ff90811692909104161461233b5760405162461bcd60e51b815260040161073990615a11565b600081815260136020526040808220600190810154858452919092209091015460ff90811691161461237f5760405162461bcd60e51b8152600401610739906159a5565b60008181526013602052604080822060019081015485845291909220909101546101009182900460ff9081169290910416146123cd5760405162461bcd60e51b815260040161073990615809565b6000828152601360205260409020600301546009600160401b90910460ff16106124095760405162461bcd60e51b81526004016107399061574d565b600082815260136020526040902060040154156124385760405162461bcd60e51b815260040161073990615678565b600081815260136020526040902060040154156124675760405162461bcd60e51b815260040161073990615852565b600082815260136020818152604080842060018082015460ff8082168852600d86528488206101009092048116885290855292862054958890529390925260039091015463ffffffff909316926124c79291600160401b90910416615e59565b6124d2906064615d0a565b6000848152601360205260409020600301546124fa90600190600160401b900460ff16615e59565b61250590607d615d0a565b6125159063ffffffff8416615ddb565b61251f9190615c8d565b90506000600a8263ffffffff161061255f5761253c600a83615ca1565b63ffffffff166125506113a96101006146d6565b61255a9190615f42565b612579565b600161256f6113a96101006146d6565b6125799190615f42565b9050600060026007016000815461258f90615ee3565b91829055506040805161012081018252828152600088815260136020818152848320600181015460ff808216848801526101009091041695850195909552918a905290526002909101805492935090916060830191906125ee90615ea8565b80601f016020809104026020016040519081016040528092919081815260200182805461261a90615ea8565b80156126675780601f1061263c57610100808354040283529160200191612667565b820191906000526020600020905b81548152906001019060200180831161264a57829003601f168201915b50505091835250506000878152601360209081526040918290206003015463ffffffff16908301520161269a8486615c40565b63ffffffff1681526000878152601360209081526040909120600301549101906126cf90600160401b900460ff166001615c68565b60ff9081168252600060208084018290526040938401829052858252601381529083902084518155848201516001820180549587015185166101000261ff00199290951660ff1990961695909517169290921790925560608301518051919261274092600285019290910190614d48565b50608082015160038201805460a085015160c086015160e08701511515600160481b0260ff60481b1960ff909216600160401b0260ff60401b1963ffffffff948516600160201b0267ffffffff00000000199590981663ffffffff199096169590951793909316959095179290921617169190911790556101009091015160049182015560015460405163101b8d5d60e01b81526001600160a01b039091169163101b8d5d916127f291899101615b1f565b600060405180830381600087803b15801561280c57600080fd5b505af1158015612820573d6000803e3d6000fd5b505050600086815260136020526040812081815560018101805461ffff1916905591506128506002830182614d0c565b506003810180546001600160501b0319169055600060049182015560015460405163101b8d5d60e01b81526001600160a01b039091169163101b8d5d9161289991889101615b1f565b600060405180830381600087803b1580156128b357600080fd5b505af11580156128c7573d6000803e3d6000fd5b505050600085815260136020526040812081815560018101805461ffff1916905591506128f76002830182614d0c565b506003810180546001600160501b03191690556000600491820155600154604051637f4a838f60e01b81526001600160a01b0390911691637f4a838f91612942913291869101615532565b600060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050505050505050565b6000818152601360205260408120548214156129be5760008281526013602052604090206001015460ff16606314156129b6575060036129d8565b5060026129d8565b6000828152601560205260409020548214156129d8575060015b919050565b6000546001600160a01b031690565b6129f461444f565b6001600160a01b0316612a056129dd565b6001600160a01b031614612a2b5760405162461bcd60e51b815260040161073990615894565b600a80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b6001546040516331a9108f60e11b815260609132916001600160a01b0390911690636352211e90612a8d908790600401615b1f565b60206040518083038186803b158015612aa557600080fd5b505afa158015612ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612add9190614fc2565b6001600160a01b031614612b035760405162461bcd60e51b815260040161073990615a31565b600083815260156020908152604080832085845260040190915290208054612b2a90615ea8565b80601f0160208091040260200160405190810160405280929190818152602001828054612b5690615ea8565b8015612ba35780601f10612b7857610100808354040283529160200191612ba3565b820191906000526020600020905b815481529060010190602001808311612b8657829003601f168201915b5050505050905092915050565b60ff81166000908152601060205260409020805460609190612bd190615ea8565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfd90615ea8565b8015612c4a5780601f10612c1f57610100808354040283529160200191612c4a565b820191906000526020600020905b815481529060010190602001808311612c2d57829003601f168201915b50505050509050919050565b6001546001600160a01b031681565b600a54600160401b900463ffffffff1690565b63ffffffff166000908152601160205260409020546001600160a01b031690565b612ca161444f565b6001600160a01b0316612cb26129dd565b6001600160a01b031614612cd85760405162461bcd60e51b815260040161073990615894565b60ff8681166000908152600d602090815260408083209389168352928152828220805463ffffffff191663ffffffff8816179055601081529190208551612d2192870190614d48565b5060005b82518110156130b05760ff8088166000908152600e60209081526040808320938a168352929052819020815180830190925284519091908190869085908110612d7e57634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001848481518110612dab57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015163ffffffff16909152825460018101845560009384529281902082518051939460020290910192612deb9284920190614d48565b50602091909101516001918201805463ffffffff191663ffffffff9092169190911790558351601290600090869085908110612e3757634e487b7160e01b600052603260045260246000fd5b6020026020010151604051602001612e4f9190615498565b6040516020818303038152906040528051906020012060001c815260200190815260200160002060006101000a81548160ff0219169083151502179055506000828281518110612eaf57634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff1611156130a05760006001600160a01b0316600d6004016000848481518110612ef557634e487b7160e01b600052603260045260246000fd5b60209081029190910181015163ffffffff168252810191909152604001600020546001600160a01b0316141561302857818181518110612f4557634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600a5463ffffffff918216911610612f7057600a5463ffffffff16612f99565b818181518110612f9057634e487b7160e01b600052603260045260246000fd5b60200260200101515b600a805463ffffffff191663ffffffff9290921691909117905581513290601190600090859085908110612fdd57634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff1663ffffffff16815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506130a0565b326001600160a01b0316600d600401600084848151811061305957634e487b7160e01b600052603260045260246000fd5b60209081029190910181015163ffffffff168252810191909152604001600020546001600160a01b0316146130a05760405162461bcd60e51b815260040161073990615770565b6130a981615ee3565b9050612d25565b50815160ff87166000908152600f60205260409020546130d6919063ffffffff16615c28565b60ff969096166000908152600f60205260409020805463ffffffff191663ffffffff909716969096179095555050505050565b6000600d6005016000836040516020016131239190615498565b60408051808303601f190181529181528151602092830120835290820192909252016000205460ff1692915050565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e90613182908690600401615b1f565b60206040518083038186803b15801561319a57600080fd5b505afa1580156131ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d29190614fc2565b6001600160a01b0316146131f85760405162461bcd60e51b815260040161073990615a31565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e90613228908590600401615b1f565b60206040518083038186803b15801561324057600080fd5b505afa158015613254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132789190614fc2565b6001600160a01b03161461329e5760405162461bcd60e51b815260040161073990615933565b6000818152601360208181526040808420600101548685526015835281852060ff90911680865260029182018452828620548087529490935293819020905191936132eb929101906153fd565b604080519182900382206000868152601360205291909120909161331291600201906153fd565b6040518091039020146133375760405162461bcd60e51b8152600401610739906157e9565b6000818152601360205260408082206003908101548684529190922090910154600160401b9182900460ff9081169290910416146133875760405162461bcd60e51b815260040161073990615a11565b60008181526013602052604080822060019081015486845291909220909101546101009182900460ff9081169290910416146133d55760405162461bcd60e51b815260040161073990615809565b6000838152601360205260409020600301546009600160401b90910460ff16106134115760405162461bcd60e51b81526004016107399061574d565b600083815260136020526040902060040154156134405760405162461bcd60e51b815260040161073990615874565b600060026007016000815461345490615ee3565b918290555090506134658582614233565b60ff8084166000908152600d60209081526040808320868452601380845282852060018082015461010090048816875292855292852054948890529092526003015463ffffffff909216926134c192600160401b900416615e59565b6134cc906064615d0a565b6000848152601360205260409020600301546134f490600190600160401b900460ff16615e59565b6134ff90607d615d0a565b61350f9063ffffffff8416615ddb565b6135199190615c8d565b90506000600a8263ffffffff161061355957613536600a83615ca1565b63ffffffff1661354a6113a96101006146d6565b6135549190615f42565b613573565b60016135696113a96101006146d6565b6135739190615f42565b9050600060026007016000815461358990615ee3565b91829055506040805161012081018252828152600088815260136020818152848320600181015460ff808216848801526101009091041695850195909552918a905290526002909101805492935090916060830191906135e890615ea8565b80601f016020809104026020016040519081016040528092919081815260200182805461361490615ea8565b80156136615780601f1061363657610100808354040283529160200191613661565b820191906000526020600020905b81548152906001019060200180831161364457829003601f168201915b50505091835250506000878152601360209081526040918290206003015463ffffffff1690830152016136948486615c40565b63ffffffff1681526000878152601360209081526040909120600301549101906136c990600160401b900460ff166001615c68565b60ff9081168252600060208084018290526040938401899052858252601381529083902084518155848201516001820180549587015185166101000261ff00199290951660ff1990961695909517169290921790925560608301518051919261373a92600285019290910190614d48565b50608082015160038201805460a085015160c086015160e087015163ffffffff1990931663ffffffff9586161767ffffffff000000001916600160201b95909216949094021760ff60401b1916600160401b60ff948516021760ff60481b1916600160481b91151591909102179055610100909201516004909101556000858152601560209081526040808320938a16835260029093019052208190556137e0846142de565b60008581526015602052604090819020600301805463ffffffff191663ffffffff9390931692909217909155600154905163101b8d5d60e01b81526001600160a01b039091169063101b8d5d9061383b908a90600401615b1f565b600060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050600088815260136020526040812081815560018101805461ffff1916905591506138996002830182614d0c565b506003810180546001600160501b03191690556000600490910181905585815260136020526040812081815560018101805461ffff19169055906138e06002830182614d0c565b506003810180546001600160501b0319169055600060049182015560015460405163101b8d5d60e01b81526001600160a01b039091169163101b8d5d91613929918c9101615b1f565b600060405180830381600087803b15801561394357600080fd5b505af1158015613957573d6000803e3d6000fd5b5050506000898152601560205260408082209182556001808301805463ffffffff199081169091556003909301805490931690925590549051637f4a838f60e01b81526001600160a01b039091169150637f4a838f906139bd9032908890600401615532565b600060405180830381600087803b1580156139d757600080fd5b505af11580156139eb573d6000803e3d6000fd5b505050505050505050505050565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e90613a29908790600401615b1f565b60206040518083038186803b158015613a4157600080fd5b505afa158015613a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a799190614fc2565b6001600160a01b031614613a9f5760405162461bcd60e51b815260040161073990615a31565b600083815260156020908152604080832085845260040182529091208251613ac992840190614d48565b50505050565b600081815260156020526040902080546001820154600390920154600a54919263ffffffff90811692606092821691600160201b909104166001600160401b03811115613b2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b55578160200160208202803683370190505b50915060005b600a54600160201b900463ffffffff1660ff82161015613bd657600086815260156020908152604080832060ff85168085526002909101909252909120548451909185918110613bbb57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152613bcf81615f22565b9050613b5b565b509193509193565b613be661444f565b6001600160a01b0316613bf76129dd565b6001600160a01b031614613c1d5760405162461bcd60e51b815260040161073990615894565b6001600160a01b038116613c435760405162461bcd60e51b8152600401610739906156b9565b61149f81614cbc565b613c5461444f565b6001600160a01b0316613c656129dd565b6001600160a01b031614613c8b5760405162461bcd60e51b815260040161073990615894565b600a805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b6001546040516331a9108f60e11b815232916001600160a01b031690636352211e90613ce6908690600401615b1f565b60206040518083038186803b158015613cfe57600080fd5b505afa158015613d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d369190614fc2565b6001600160a01b031614613d4957600080fd5b6000815111613d6a5760405162461bcd60e51b8152600401610739906159ec565b6000600260070160008154613d7e90615ee3565b91829055509050613d8f8382614233565b60005b8251811015610e8557828181518110613dbb57634e487b7160e01b600052603260045260246000fd5b602002602001015160001415613dd057614116565b600154835132916001600160a01b031690636352211e90869085908110613e0757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401613e2b9190615b1f565b60206040518083038186803b158015613e4357600080fd5b505afa158015613e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e7b9190614fc2565b6001600160a01b031614613ea15760405162461bcd60e51b815260040161073990615933565b60136000848381518110613ec557634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060040154600014613efe5760405162461bcd60e51b8152600401610739906158ec565b600060136000858481518110613f2457634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528181019290925260409081016000908120600101548682526015845282822060ff90911680835260029091019093522054855191925090859084908110613f8957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600086815260158352604080822060ff871683526002019093529182205585518591601391889087908110613fda57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060040181905550600160009054906101000a90046001600160a01b03166001600160a01b031663101b8d5d86858151811061403b57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161405f9190615b1f565b600060405180830381600087803b15801561407957600080fd5b505af115801561408d573d6000803e3d6000fd5b5050505080600014614113576000818152601360205260408082206004908101929092556001549051637f4a838f60e01b81526001600160a01b0390911691637f4a838f916140e0913291869101615532565b600060405180830381600087803b1580156140fa57600080fd5b505af115801561410e573d6000803e3d6000fd5b505050505b50505b61411f81615ee3565b9050613d92565b600060026007016000815461413a90615ee3565b918290555060008181526015602052604090208190559050601e6141626113a96101006146d6565b61416c9190615f42565b6000828152601560205260408120600101805463ffffffff191663ffffffff93909316929092179091555b600a54600160201b900463ffffffff1660ff821610156141fd5760006141bc82614827565b600084815260156020908152604080832060ff8716845260020182528083208490559282526013905220600401839055506141f681615f22565b9050614197565b50614207816142de565b6000828152601560205260409020600301805463ffffffff191663ffffffff9290921691909117905590565b600082815260156020526040808220600190810154848452918320908101805463ffffffff191663ffffffff909316929092179091558290555b600a54600160201b900463ffffffff1660ff8216101561119957600083815260156020818152604080842060ff861680865260029182018452828620548887529484528286209086520182528084208390559183526013905290206004018290556142d781615f22565b905061426d565b6000806001815b600a54600160201b900463ffffffff1660ff821610156143e357600085815260156020908152604080832060ff851684526002019091529020548061432e5760009250506143d3565b60008181526013602052604090206003015461435790600160201b900463ffffffff1686615c40565b945082158061437b575060008181526013602052604090206003015463ffffffff16155b1561438a5760009250506143d3565b836143ae5760009081526013602052604090206003015463ffffffff1692506143d3565b60008181526013602052604090206003015463ffffffff1684146143d157600092505b505b6143dc81615f22565b90506142e5565b50801561440e5760646143f784600c615dfa565b6144019190615ca1565b61440b9084615c40565b92505b6000848152601560205260409020600101546064906144339063ffffffff1685615dfa565b61443d9190615ca1565b6144479084615c40565b949350505050565b3390565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd906144839086908690869060040161550e565b600060405180830381600087803b15801561449d57600080fd5b505af11580156144b1573d6000803e3d6000fd5b5050505060003d600081146144cd57602081146144d757600080fd5b60001991506144e3565b60206000803e60005191505b50806145015760405162461bcd60e51b8152600401610739906156ff565b5050505050565b6040516331a9108f60e11b81526000906001600160a01b03861690636352211e90614537908590600401615b1f565b60206040518083038186803b15801561454f57600080fd5b505afa158015614563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145879190614fc2565b9050836001600160a01b0316816001600160a01b0316146145ba5760405162461bcd60e51b81526004016107399061590c565b6040516323b872dd60e01b81526001600160a01b038616906323b872dd906145ea9087908790879060040161550e565b600060405180830381600087803b15801561460457600080fd5b505af1158015614618573d6000803e3d6000fd5b50506040516331a9108f60e11b8152600092506001600160a01b0388169150636352211e9061464b908690600401615b1f565b60206040518083038186803b15801561466357600080fd5b505afa158015614677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469b9190614fc2565b9050836001600160a01b0316816001600160a01b0316146146ce5760405162461bcd60e51b8152600401610739906156ff565b505050505050565b6060816146fb57506040805180820190915260018152600360fc1b60208201526129d8565b8160005b8115614725578061470f81615ee3565b915061471e9050600a83615c8d565b91506146ff565b6000816001600160401b0381111561474d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614777576020820181803683370190505b5090505b84156144475761478c600183615e1d565b9150614799600a86615f42565b6147a4906030615c28565b60f81b8183815181106147c757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506147e9600a86615c8d565b945061477b565b6000423a328460405160200161480994939291906154b4565b60408051601f19818403018152919052805160209091012092915050565b3260009081526014602090815260408083205460ff8516808552600f90935290832054839261010090920463ffffffff9081169291169061486b906113a9906146d6565b6148759190615f42565b61487f9190615c28565b60ff84166000908152600f602052604090205490915063ffffffff1681106148cf5760ff83166000908152600f60205260409020546148c69060019063ffffffff16615e34565b63ffffffff1690505b600980546000906148df90615ee3565b9182905550915060005b6101008160ff161015614c9a5760ff8085166000908152600e6020908152604080832093851683529290522054821061494d5760ff8085166000908152600e60209081526040808320938516835292905220546149469083615e1d565b9150614c8a565b60ff8085166000908152600d60209081526040808320938516835292905290812054600a63ffffffff90911611156149d45760ff8086166000908152600d60209081526040808320938616835292905220546149b190600a9063ffffffff16615ca1565b63ffffffff166149c56113a96101006146d6565b6149cf9190615f42565b6149ee565b60016149e46113a96101006146d6565b6149ee9190615f42565b604080516101208101825286815260ff80891660208084018290529187168385018190526000918252600e8352848220908252909152919091208054929350909160608301919086908110614a5357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000018054614a6f90615ea8565b80601f0160208091040260200160405190810160405280929190818152602001828054614a9b90615ea8565b8015614ae85780601f10614abd57610100808354040283529160200191614ae8565b820191906000526020600020905b815481529060010190602001808311614acb57829003601f168201915b505050918352505060ff8088166000908152600e602090815260408083209388168352928152919020805491909201919086908110614b3757634e487b7160e01b600052603260045260246000fd5b600091825260208083206001600290930201919091015463ffffffff908116845260ff808b168452600d83526040808520918916855290835290922054920191614b8391859116615c40565b63ffffffff168152600160208083018290526000604080850182905260609485018290528982526013835290819020855181558583015193810180549287015160ff1990931660ff9586161761ff0019166101009590931694909402919091179092559183015180519192614c0092600285019290910190614d48565b50608082015160038201805460a085015160c086015160e08701511515600160481b0260ff60481b1960ff909216600160401b0260ff60401b1963ffffffff948516600160201b0267ffffffff00000000199590981663ffffffff199096169590951793909316959095179290921617169190911790556101009091015160049091015550614c9a565b614c9381615f22565b90506148e9565b5050326000908152601460205260409020805464ffffffff0019169055919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b508054614d1890615ea8565b6000825580601f10614d2a575061149f565b601f01602090049060005260206000209081019061149f9190614e2e565b828054614d5490615ea8565b90600052602060002090601f016020900481019282614d765760008555614dbc565b82601f10614d8f57805160ff1916838001178555614dbc565b82800160010185558215614dbc579182015b82811115614dbc578251825591602001919060010190614da1565b50614dc8929150614e2e565b5090565b604080518082019091526000808252602082015290565b60408051610120810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5b80821115614dc85760008155600101614e2f565b600082601f830112614e53578081fd5b81356020614e68614e6383615bf9565b615bd0565b8281528181019085830183850287018401881015614e84578586fd5b855b85811015614ea257813584529284019290840190600101614e86565b5090979650505050505050565b600082601f830112614ebf578081fd5b81356020614ecf614e6383615bf9565b8281528181019085830183850287018401881015614eeb578586fd5b855b85811015614ea257614efe82614f7a565b84529284019290840190600101614eed565b600082601f830112614f20578081fd5b81356001600160401b03811115614f3957614f39615f82565b614f4c601f8201601f1916602001615bd0565b818152846020838601011115614f60578283fd5b816020850160208301379081016020019190915292915050565b803563ffffffff811681146129d857600080fd5b803560ff811681146129d857600080fd5b600060208284031215614fb0578081fd5b8135614fbb81615f98565b9392505050565b600060208284031215614fd3578081fd5b8151614fbb81615f98565b600060208284031215614fef578081fd5b81356001600160401b03811115615004578182fd5b61444784828501614e43565b600060208284031215615021578081fd5b81356001600160401b03811115615036578182fd5b61444784828501614f10565b600060208284031215615053578081fd5b5035919050565b6000806040838503121561506c578081fd5b8235915060208301356001600160401b03811115615088578182fd5b61509485828601614e43565b9150509250929050565b600080604083850312156150b0578182fd5b823591506020808401356001600160401b038111156150cd578283fd5b8401601f810186136150dd578283fd5b80356150eb614e6382615bf9565b81815283810190838501858402850186018a1015615107578687fd5b8694505b838510156151305761511c81614f8e565b83526001949094019391850191850161510b565b5080955050505050509250929050565b600080600060608486031215615154578081fd5b8335925060208401356001600160401b03811115615170578182fd5b61517c86828701614f10565b92505061518b60408501614f7a565b90509250925092565b600080604083850312156151a6578182fd5b50508035926020909101359150565b6000806000606084860312156151c9578081fd5b833592506020840135915060408401356001600160401b038111156151ec578182fd5b6151f886828701614f10565b9150509250925092565b600080600080600060a08688031215615219578283fd5b8535945061522960208701614f7a565b93506040860135925061523e60608701614f7a565b949793965091946080013592915050565b600060208284031215615260578081fd5b614fbb82614f7a565b6000806040838503121561527b578182fd5b61528483614f7a565b915060208301356001600160401b03811115615088578182fd5b6000602082840312156152af578081fd5b614fbb82614f8e565b60008060008060008060c087890312156152d0578384fd5b6152d987614f8e565b95506152e760208801614f8e565b945060408701356001600160401b0380821115615302578586fd5b61530e8a838b01614f10565b955060608901359450608089013591508082111561532a578283fd5b818901915089601f83011261533d578283fd5b813561534b614e6382615bf9565b818152602080820191908501865b84811015615386576153718f602084358a0101614f10565b84526020938401939190910190600101615359565b5090965050505060a08901359150808211156153a0578283fd5b506153ad89828a01614eaf565b9150509295509295509295565b15159052565b600081518084526153d8816020860160208601615e7c565b601f01601f19169290920160200192915050565b63ffffffff169052565b60ff169052565b815460009081906002810460018083168061541957607f831692505b602080841082141561543957634e487b7160e01b87526022600452602487fd5b81801561544d576001811461545e5761548a565b60ff1986168952848901965061548a565b6154678a615c1c565b885b868110156154825781548b820152908501908301615469565b505084890196505b509498975050505050505050565b600082516154aa818460208701615e7c565b9190910192915050565b60008582528460208301526bffffffffffffffffffffffff198460601b16604083015282516154ea816054850160208701615e7c565b9190910160540195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561558c5783516001600160a01b031683529284019291840191600101615567565b50909695505050505050565b901515815260200190565b600060208252614fbb60208301846153c0565b60208082526010908201526f24b73b30b634b2103837b9b4ba34b7b760811b604082015260600190565b6020808252600d908201526c39b2b1b7b7321010b7bbb732b960991b604082015260600190565b6020808252600c908201526b39ba37b7329010b7bbb732b960a11b604082015260600190565b6020808252600890820152672737ba1037b832b760c11b604082015260600190565b6020808252600f908201526e4e6f74206c75636b792073746f6e6560881b604082015260600190565b60208082526008908201526719881dd9585c995960c21b604082015260600190565b602080825260059082015264216e616d6560d81b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6020808252600b908201526a0496e76616c6964206d61760ac1b604082015260600190565b60208082526009908201526813585e081b195d995b60ba1b604082015260600190565b60208082526010908201526f139bdd081bdddb881d1a19481cdd5a5d60821b604082015260600190565b6020808252600f908201526e637265617465466c61673d7472756560881b604082015260600190565b6020808252600c908201526b3334b939ba1010b7bbb732b960a11b604082015260600190565b60208082526006908201526510ba37b5b2b760d11b604082015260600190565b602080825260059082015264217261726560d81b604082015260600190565b60208082526010908201526f4e6f7420656e6f7567682076616c756560801b604082015260600190565b6020808252600890820152671cc81dd9585c995960c21b604082015260600190565b60208082526006908201526515d9585c995960d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600990820152684f6e6c79206f6e636560b81b604082015260600190565b6020808252600690820152651dd9585c995960d21b604082015260600190565b6020808252600d908201526c2737ba1037bbb7103a37b5b2b760991b604082015260600190565b6020808252600c908201526b3830b93a399010b7bbb732b960a11b604082015260600190565b6020808252600a90820152694572726f72206e616d6560b01b604082015260600190565b6020808252600e908201526d22b6b83a3c903837b9b4ba34b7b760911b604082015260600190565b60208082526009908201526810b837b9b4ba34b7b760b91b604082015260600190565b6020808252600a90820152696c6576656c20213d203960b01b604082015260600190565b6020808252600b908201526a22b6b83a3c903a37b5b2b760a91b604082015260600190565b602080825260069082015265085b195d995b60d21b604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b81511515815260209182015163ffffffff169181019190915260400190565b600060208252825160208301526020830151615a8f60408401826153f6565b506040830151615aa260608401826153f6565b506060830151610120806080850152615abf6101408501836153c0565b91506080850151615ad360a08601826153ec565b5060a0850151615ae660c08601826153ec565b5060c0850151615af960e08601826153f6565b5060e0850151610100615b0e818701836153ba565b959095015193019290925250919050565b90815260200190565b600060808201868352602063ffffffff808816828601526080604086015282875180855260a0870191508389019450855b81811015615b7557855183529484019491840191600101615b59565b5050951660609490940193909352509195945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60ff938416815291909216602082015263ffffffff909116604082015260600190565b6040518181016001600160401b0381118282101715615bf157615bf1615f82565b604052919050565b60006001600160401b03821115615c1257615c12615f82565b5060209081020190565b60009081526020902090565b60008219821115615c3b57615c3b615f56565b500190565b600063ffffffff808316818516808303821115615c5f57615c5f615f56565b01949350505050565b600060ff821660ff84168060ff03821115615c8557615c85615f56565b019392505050565b600082615c9c57615c9c615f6c565b500490565b600063ffffffff80841680615cb857615cb8615f6c565b92169190910492915050565b80825b6001808611615cd65750615d01565b818704821115615ce857615ce8615f56565b80861615615cf557918102915b9490941c938002615cc7565b94509492505050565b6000614fbb60001960ff851684600082615d2657506001614fbb565b81615d3357506000614fbb565b8160018114615d495760028114615d5357615d80565b6001915050614fbb565b60ff841115615d6457615d64615f56565b6001841b915084821115615d7a57615d7a615f56565b50614fbb565b5060208310610133831016604e8410600b8410161715615db3575081810a83811115615dae57615dae615f56565b614fbb565b615dc08484846001615cc4565b808604821115615dd257615dd2615f56565b02949350505050565b6000816000190483118215151615615df557615df5615f56565b500290565b600063ffffffff80831681851681830481118215151615615dd257615dd2615f56565b600082821015615e2f57615e2f615f56565b500390565b600063ffffffff83811690831681811015615e5157615e51615f56565b039392505050565b600060ff821660ff841680821015615e7357615e73615f56565b90039392505050565b60005b83811015615e97578181015183820152602001615e7f565b83811115613ac95750506000910152565b600281046001821680615ebc57607f821691505b60208210811415615edd57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615ef757615ef7615f56565b5060010190565b600063ffffffff80831681811415615f1857615f18615f56565b6001019392505050565b600060ff821660ff811415615f3957615f39615f56565b60010192915050565b600082615f5157615f51615f6c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461149f57600080fdfea2646970667358221220b3797e4545008355936141fa1117b7d0f235a69db6c3e072fe237d6b44e10b8864736f6c63430008000033

Deployed ByteCode Sourcemap

28156:24840:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42103:506;;;;;;;;;;-1:-1:-1;42103:506:0;;;;;:::i;:::-;;:::i;:::-;;32410:1269;;;:::i;31448:130::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35258:1148;;;;;;;;;;-1:-1:-1;35258:1148:0;;;;;:::i;:::-;;:::i;52631:116::-;;;;;;;;;;-1:-1:-1;52631:116:0;;;;;:::i;:::-;;:::i;41473:624::-;;;;;;;;;;-1:-1:-1;41473:624:0;;;;;:::i;:::-;;:::i;52381:110::-;;;;;;;;;;-1:-1:-1;52381:110:0;;;;;:::i;:::-;;:::i;31206:114::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52755:113::-;;;;;;;;;;-1:-1:-1;52755:113:0;;;;;:::i;:::-;;:::i;40928:539::-;;;;;;;;;;-1:-1:-1;40928:539:0;;;;;:::i;:::-;;:::i;50877:103::-;;;;;;;;;;;;;:::i;29871:148::-;;;;;;;;;;-1:-1:-1;29871:148:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52874:119::-;;;;;;;;;;-1:-1:-1;52874:119:0;;;;;:::i;:::-;;:::i;42615:2713::-;;;;;;;;;;-1:-1:-1;42615:2713:0;;;;;:::i;:::-;;:::i;31046:154::-;;;;;;;;;;-1:-1:-1;31046:154:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50986:297::-;;;;;;;;;;-1:-1:-1;50986:297:0;;;;;:::i;:::-;;:::i;27456:94::-;;;;;;;;;;;;;:::i;36412:2098::-;;;;;;;;;;-1:-1:-1;36412:2098:0;;;;;:::i;:::-;;:::i;29397:324::-;;;;;;;;;;-1:-1:-1;29397:324:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26805:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52497:128::-;;;;;;;;;;-1:-1:-1;52497:128:0;;;;;:::i;:::-;;:::i;31887:255::-;;;;;;;;;;-1:-1:-1;31887:255:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29727:138::-;;;;;;;;;;-1:-1:-1;29727:138:0;;;;;:::i;:::-;;:::i;28271:32::-;;;;;;;;;;;;;:::i;31326:116::-;;;;;;;;;;;;;:::i;31584:128::-;;;;;;;;;;-1:-1:-1;31584:128:0;;;;;:::i;:::-;;:::i;51289:974::-;;;;;;;;;;-1:-1:-1;51289:974:0;;;;;:::i;:::-;;:::i;31718:163::-;;;;;;;;;;-1:-1:-1;31718:163:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38516:2406::-;;;;;;;;;;-1:-1:-1;38516:2406:0;;;;;:::i;:::-;;:::i;32148:256::-;;;;;;;;;;-1:-1:-1;32148:256:0;;;;;:::i;:::-;;:::i;30025:516::-;;;;;;;;;;-1:-1:-1;30025:516:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;27705:192::-;;;;;;;;;;-1:-1:-1;27705:192:0;;;;;:::i;:::-;;:::i;52269:105::-;;;;;;;;;;-1:-1:-1;52269:105:0;;;;;:::i;:::-;;:::i;33685:1567::-;;;;;;;;;;-1:-1:-1;33685:1567:0;;;;;:::i;:::-;;:::i;42103:506::-;42182:6;42177:427;42194:7;:14;42192:1;:16;42177:427;;;42301:12;;42322:10;;42337:9;;-1:-1:-1;;;;;42301:12:0;;:20;;42322:7;;42330:1;;42322:10;;;;-1:-1:-1;;;42322:10:0;;;;;;;;;;;;;;;42301:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42301:45:0;;42293:70;;;;-1:-1:-1;;;42293:70:0;;;;;;;:::i;:::-;;;;;;;;;42380:10;:22;42391:7;42399:1;42391:10;;;;;;-1:-1:-1;;;42391:10:0;;;;;;;;;;;;;;;;;;;;42380:22;;;;;;;;;;-1:-1:-1;42380:22:0;:32;;;;;42416:2;42380:38;42372:66;;;;-1:-1:-1;;;42372:66:0;;;;;;;:::i;:::-;42464:9;42451:23;;;;:12;:23;;;;;42449:35;;42451:33;;42449:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42527:12;;;;;;;;;-1:-1:-1;;;;;42527:12:0;-1:-1:-1;;;;;42527:19:0;;42547:7;42555:1;42547:10;;;;;;-1:-1:-1;;;42547:10:0;;;;;;;;;;;;;;;42527:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42574:10;:22;42585:7;42593:1;42585:10;;;;;;-1:-1:-1;;;42585:10:0;;;;;;;;;;;;;;;;;;;;42574:22;;;;;;;;;;-1:-1:-1;42574:22:0;;;42567:29;;;;;;;;-1:-1:-1;;42567:29:0;;;42574:22;42567:29;;;;-1:-1:-1;42567:29:0;:::i;:::-;-1:-1:-1;42567:29:0;;;;;-1:-1:-1;;;;;;42567:29:0;;;;;;;;;42210:3;;;:::i;:::-;;;42177:427;;;;42103:506;:::o;32410:1269::-;32521:9;32508:23;;;;:12;:23;;;;;:37;;;32507:38;32499:60;;;;-1:-1:-1;;;32499:60:0;;;;;;;:::i;:::-;32704:16;;32682:19;;32656:23;;32595:16;;;;32704;;32656:45;;32682:19;;;;;-1:-1:-1;;;32656:23:0;;;:45;:::i;:::-;:64;;;;;;:::i;:::-;32637:7;:16;:83;;;;:::i;:::-;32731:26;;32618:102;;-1:-1:-1;32731:31:0;32727:141;;32839:21;;32808:26;;32839:21;;;;;32793:41;;:12;:41;:::i;:::-;32785:75;;;;:::i;:::-;32773:87;;32727:141;32935:16;;32896:23;;32880:12;;32935:16;32896:35;;32922:9;;32896:23;;:35;:::i;:::-;32895:56;;;;;;:::i;:::-;32981:7;:16;32880:71;;-1:-1:-1;32880:71:0;;32970:27;;:8;:27;:::i;:::-;32969:39;:81;;33034:7;:16;32969:81;;;33012:18;33023:7;33012:8;:18;:::i;:::-;32958:92;;33078:8;33065:9;:21;;33057:50;;;;-1:-1:-1;;;33057:50:0;;;;;;;:::i;:::-;33141:19;33163:18;:16;:18::i;:::-;33238:9;33225:23;;;;:12;:23;;;;;:44;;-1:-1:-1;;33225:44:0;33265:4;33225:44;;;33141:40;-1:-1:-1;33357:9:0;:20;-1:-1:-1;33353:92:0;;;33396:9;33388:49;33416:20;33428:8;33416:9;:20;:::i;:::-;33388:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33353:92;33485:23;:28;;33512:1;;33485:23;;;:28;;33512:1;;-1:-1:-1;;;33485:28:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;33549:12;33520:26;:41;33568:23;:36;;33595:9;;-1:-1:-1;33568:23:0;;-1:-1:-1;;33568:36:0;;33595:9;;33568:36;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33630:12:0;:43;;-1:-1:-1;;;33630:43:0;;-1:-1:-1;;;;;33630:12:0;;;;:19;;:43;;33650:9;;33661:11;;33630:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32410:1269;;;;:::o;31448:130::-;31504:26;31551:7;:21;;31539:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31539:33:0;;;;;;;;;;;;;;;;;;;;;;;31448:130;:::o;35258:1148::-;35427:12;;:33;;-1:-1:-1;;;35427:33:0;;35464:9;;-1:-1:-1;;;;;35427:12:0;;:20;;:33;;35448:11;;35427:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35427:46:0;;35419:65;;;;-1:-1:-1;;;35419:65:0;;;;;;;:::i;:::-;35518:1;35499:9;:16;:20;35491:47;;;;-1:-1:-1;;;35491:47:0;;;;;;;:::i;:::-;35580:22;35607:7;:23;;;35605:25;;;;;:::i;:::-;;;;;-1:-1:-1;35605:25:0;-1:-1:-1;35637:43:0;35652:11;35605:25;35637:14;:43::i;:::-;35722:6;35717:419;35734:9;:16;35732:1;:18;35717:419;;;35787:20;;35774:12;;-1:-1:-1;;;35787:20:0;;;;;;35774:12;;35784:1;;35774:12;;;;-1:-1:-1;;;35774:12:0;;;;;;;;;;;;;;;:33;;;35766:62;;;;-1:-1:-1;;;35766:62:0;;;;;;;:::i;:::-;35839:15;35857:14;:30;35872:14;35857:30;;;;;;;;;;;:41;;:55;35899:9;35909:1;35899:12;;;;;;-1:-1:-1;;;35899:12:0;;;;;;;;;;;;;;;35857:55;;;;;;;;;;;;;;;;35839:73;;35925:7;35936:1;35925:12;35921:47;;;35950:8;;;35921:47;36036:1;35978:14;:30;35993:14;35978:30;;;;;;;;;;;:41;;:55;36020:9;36030:1;36020:12;;;;;;-1:-1:-1;;;36020:12:0;;;;;;;;;;;;;;;;;;;;35978:55;;;;;;;;;;;;;;;-1:-1:-1;35978:55:0;;;:59;;;;36046:19;;;:10;:19;;;;;;:30;;;;:34;;;;36089:12;;:39;;-1:-1:-1;;;36089:39:0;;-1:-1:-1;;;;;36089:12:0;;;;:19;;:39;;36109:9;;36057:7;;36089:39;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35717:419;;35752:3;;;:::i;:::-;;;35717:419;;;-1:-1:-1;36189:12:0;;:32;;-1:-1:-1;;;36189:32:0;;-1:-1:-1;;;;;36189:12:0;;;;:19;;:32;;36209:11;;36189:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36235:27:0;;;;:14;:27;;;;;36228:34;;;;;;;;-1:-1:-1;;36228:34:0;;;;;;;;;;;;;;;;;-1:-1:-1;36316:31:0;36332:14;36316:15;:31::i;:::-;36271:30;;;;:14;:30;;;;;;;:42;;:76;;-1:-1:-1;;36271:76:0;;;;;;;;;;;;;-1:-1:-1;36354:12:0;:46;;-1:-1:-1;;;36354:46:0;;-1:-1:-1;;;;;36354:12:0;;;;:19;;:46;;36374:9;;36271:30;;36354:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35258:1148;;;:::o;52631:116::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;52704:22;:37;;-1:-1:-1;;;;;;52704:37:0::1;-1:-1:-1::0;;;;;52704:37:0;;;::::1;::::0;;;::::1;::::0;;52631:116::o;41473:624::-;41542:22;;-1:-1:-1;;;;;41542:22:0;41534:57;;;;-1:-1:-1;;;41534:57:0;;;;;;;:::i;:::-;41657:24;;41636:18;;41657:32;;;;;;-1:-1:-1;;;41657:24:0;;;;:32;:::i;:::-;41711:22;;41636:53;;;;;;-1:-1:-1;41696:76:0;;-1:-1:-1;;;;;41711:22:0;41735:9;41754:4;41636:53;41696:14;:76::i;:::-;41811:7;41806:286;41824:5;41822:7;;:1;:7;;;41806:286;;;41845:18;41868:7;:23;;;41866:25;;;;;:::i;:::-;;;;;-1:-1:-1;41900:131:0;;;;;;;;;;;-1:-1:-1;;;41900:131:0;;;;;;;-1:-1:-1;41901:22:0;;;:10;:22;;;;;;41900:131;;41866:25;;-1:-1:-1;41866:25:0;;42013:2;;41901:22;;41934:32;;;;-1:-1:-1;;41900:131:0;;41968:28;;;;41900:131;;:::i;:::-;-1:-1:-1;41900:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42042:12:0;:42;;-1:-1:-1;;;42042:42:0;;-1:-1:-1;;;;;42042:12:0;;;;:19;;:42;;42062:9;;42073:10;;42042:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41806:286;41831:3;;;;:::i;:::-;;;41806:286;;;;41473:624;;:::o;52381:110::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;52451:20;:34;;::::1;::::0;;::::1;-1:-1:-1::0;;;52451:34:0::1;-1:-1:-1::0;;52451:34:0;;::::1;::::0;;;::::1;::::0;;52381:110::o;31206:114::-;31291:23;;-1:-1:-1;;;31291:23:0;;;;;31206:114::o;52755:113::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;52824:21;:38;;::::1;::::0;::::1;::::0;;-1:-1:-1;52824:38:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52824:38:0::1;-1:-1:-1::0;;;;;52824:38:0;;;::::1;::::0;;;::::1;::::0;;52755:113::o;40928:539::-;41037:21;:28;41029:36;;;;41021:60;;;;-1:-1:-1;;;41021:60:0;;;;;;;:::i;:::-;41095:6;41090:372;41107:12;:19;41105:1;:21;41090:372;;;41167:88;41183:7;:21;;41205:5;41183:28;;;;;;;;-1:-1:-1;;;41183:28:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41183:28:0;41213:9;41232:4;41239:12;41252:1;41239:15;;;;;;-1:-1:-1;;;41239:15:0;;;;;;;;;;;;;;;41167;:88::i;:::-;41295:18;41316:85;41379:7;:20;;;;;;;;;;;;41338:61;;:38;41349:26;:12;41362:1;41349:15;;;;;;-1:-1:-1;;;41349:15:0;;;;;;;;;;;;;;;:24;:26::i;:::-;41338:10;:38::i;:::-;:61;;;;:::i;:::-;41316:15;:85::i;:::-;41412:12;;:42;;-1:-1:-1;;;41412:42:0;;41295:106;;-1:-1:-1;;;;;;41412:12:0;;:19;;:42;;41432:9;;41295:106;;41412:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41090:372;41128:3;;;;:::i;:::-;;;41090:372;;50877:103;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;50923:51:::1;::::0;50931:10:::1;::::0;50952:21:::1;50923:51:::0;::::1;;;::::0;::::1;::::0;;;50952:21;50931:10;50923:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50877:103::o:0;29871:148::-;29940:35;;:::i;:::-;-1:-1:-1;;;;;;29994:19:0;;;;;:12;:19;;;;;;;;;29984:29;;;;;;;;;;;;;;;;;;;;;;;;;;29871:148::o;52874:119::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;52946:12:::1;:41:::0;;-1:-1:-1;;;;;;52946:41:0::1;-1:-1:-1::0;;;;;52946:41:0;;;::::1;::::0;;;::::1;::::0;;52874:119::o;42615:2713::-;42786:12;;:29;;-1:-1:-1;;;42786:29:0;;42819:9;;-1:-1:-1;;;;;42786:12:0;;:20;;:29;;42807:7;;42786:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42786:42:0;;42778:61;;;;-1:-1:-1;;;42778:61:0;;;;;;;:::i;:::-;42854:19;;;;:10;:19;;;;;:26;;;-1:-1:-1;;;42854:26:0;;;;42884:1;42854:31;42846:54;;;;-1:-1:-1;;;42846:54:0;;;;;;;:::i;:::-;42916:19;;;;:10;:19;;;;;:31;;;-1:-1:-1;;;42916:31:0;;;;42915:32;42907:60;;;;-1:-1:-1;;;42907:60:0;;;;;;;:::i;:::-;43004:2;42988:4;42982:18;:24;;42974:47;;;;-1:-1:-1;;;42974:47:0;;;;;;;:::i;:::-;43060:14;43077:19;;;:10;:19;;;;;:29;;;;;;;;;;43060:14;43126:29;;43077;43126:25;;;;;;:29;:::i;:::-;43113:42;;43162:16;43216:4;43199:22;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43199:22:0;;;;;;;;;43189:33;;43199:22;43189:33;;;;43244:36;;;;43181:42;43244:36;;;:10;:36;;;;;:42;;;;;;;;;;43189:33;;-1:-1:-1;43244:42:0;;43236:67;;;;-1:-1:-1;;;43236:67:0;;;;;;;:::i;:::-;43319:30;;;;:20;:30;;;;;;;;43318:31;43310:54;;;;-1:-1:-1;;;43310:54:0;;;;;;;:::i;:::-;43381:11;;;43377:208;;43414:21;43412:23;;43414:21;;43412:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43444:28:0;;;:20;:28;;;;;:40;;-1:-1:-1;;;;;;43444:40:0;43475:9;43444:40;;;43412:23;-1:-1:-1;43377:208:0;;;43515:28;;;;;;;:20;:28;;;;;;-1:-1:-1;;;;;43515:28:0;43547:9;43515:41;43507:70;;;;-1:-1:-1;;;43507:70:0;;;;;;;:::i;:::-;43593:35;;;;;;;;:25;:35;;;;;;;;:41;;;;;;;;;;;43640:35;;;;;;;;;;;;;;;;;;43593:83;;:25;:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43593:83:0;;;;;;;;;;;-1:-1:-1;;43593:83:0;;;;;;;;43718:32;;;-1:-1:-1;43718:32:0;;;:22;:32;;;;;;;;:36;;:32;;:36;:::i;:::-;43683:32;;;;;;;:22;:32;;;;;;;;:71;;-1:-1:-1;;43683:71:0;;;;;;;;;;;;;43761:30;;;:20;:30;;;;;:37;;-1:-1:-1;;43761:37:0;-1:-1:-1;43761:37:0;;;43810:53;;;43850:4;;43810:53;:::i;:::-;;;;;;;;43823:9;-1:-1:-1;;;;;43810:53:0;;43834:8;43844:4;43856:6;43810:53;;;;;;;;:::i;:::-;;;;;;;;43916:6;43911:701;43928:1;43926;:3;43911:701;;;43945:18;43968:7;:23;;;43966:25;;;;;:::i;:::-;;;;;-1:-1:-1;44026:36:0;;;;44000:16;44026:36;;;:10;:36;;;;;;;;:42;;;;;;;;;;;;43966:25;;-1:-1:-1;44000:16:0;44071:2;44026:42;;;;:47;:245;;44223:36;;;;:26;:36;;;:10;:36;;;;;;;;:42;;;;;;;;;;:47;;44268:2;;44223:42;;:47;:::i;:::-;44184:87;;:35;44195:23;44203:3;44195:21;:23::i;44184:35::-;:87;;;;:::i;:::-;44026:245;;;44147:1;44109:35;44120:23;44128:3;44120:21;:23::i;44109:35::-;:39;;;;:::i;:::-;44347:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44481:36:0;;;:10;:36;;;;;:42;;;;;;;;;;44000:272;;-1:-1:-1;44347:202:0;;;;;44481:54;;44000:272;;44481:42;:54;:::i;:::-;44347:202;;;;44537:1;44347:202;;;;;;;-1:-1:-1;44347:202:0;;;;;;;;;;;;;;44322:22;;;:10;:22;;;;;;:227;;;;;;;;;;;;;;;;;-1:-1:-1;;44322:227:0;;;44347:202;44322:227;;;;-1:-1:-1;;44322:227:0;;;;;;;;;;;;;;;;;;;;;;;:22;;:227;;;;;;;;;;;:::i;:::-;-1:-1:-1;44322:227:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44322:227:0;-1:-1:-1;;;;44322:227:0;;;;-1:-1:-1;;;44322:227:0;-1:-1:-1;;;;44322:227:0;;;;-1:-1:-1;;;44322:227:0;-1:-1:-1;;44322:227:0;;;;-1:-1:-1;;44322:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44562:12;:42;;-1:-1:-1;;;44562:42:0;;-1:-1:-1;;;;;44562:12:0;;;;:19;;:42;;44582:9;;44593:10;;44562:42;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43911:701;;43931:3;;;;:::i;:::-;;;43911:701;;;;44667:23;44695:7;:23;;;44693:25;;;;;:::i;:::-;;;;;-1:-1:-1;44755:258:0;;;;;;;;;;;;;;;;;;44693:25;;-1:-1:-1;44755:258:0;;44820:8;44827:1;44820:4;:8;:::i;:::-;44755:258;;;;;;44830:10;:19;44841:7;44830:19;;;;;;;;;;;:25;;44755:258;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44755:258:0;;;-1:-1:-1;;44916:19:0;;;;:10;44755:258;44916:19;;;;;;;:27;;;;;;;;44755:258;;;;-1:-1:-1;;;44945:26:0;;;;44755:258;;;;44973:1;44755:258;;;;;;;;44916:27;44755:258;;;;;;44945:26;44982:30;;;;44755:258;;;;;;;;44725:27;;;;;;;;;;:288;;;;;;;;;;;;;;;;;44755:258;44725:288;;;44916:27;44725:288;-1:-1:-1;;44725:288:0;;;;-1:-1:-1;;44725:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44725:288:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44725:288:0;-1:-1:-1;;;;44725:288:0;;;;-1:-1:-1;;;44725:288:0;-1:-1:-1;;;;44725:288:0;;;;-1:-1:-1;;;44725:288:0;-1:-1:-1;;44725:288:0;;;;-1:-1:-1;;44725:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45026:27;;;:10;:27;;;;;:38;;:43;45022:266;;45080:54;45095:27;;;:10;:27;;;;;;;;:38;;;45080:54;;:14;:54;;;;;:75;;;;;:65;;:75;;;;;:93;;;45022:266;;;45196:12;;:28;;-1:-1:-1;;;45196:28:0;;-1:-1:-1;;;;;45196:12:0;;;;:19;;:28;;45216:7;;45196:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45233:12:0;;:47;;-1:-1:-1;;;45233:47:0;;-1:-1:-1;;;;;45233:12:0;;;;-1:-1:-1;45233:19:0;;-1:-1:-1;45233:47:0;;45253:9;;45264:15;;45233:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45022:266;45303:19;;;;:10;:19;;;;;45296:26;;;;;;;;-1:-1:-1;;45296:26:0;;;45303:19;45296:26;;;;45303:19;45296:26;:::i;:::-;-1:-1:-1;45296:26:0;;;;;-1:-1:-1;;;;;;45296:26:0;;;;;;;;;-1:-1:-1;;;;;;;42615:2713:0:o;31046:154::-;31115:39;;:::i;:::-;31175:19;;;;:10;:19;;;;;;;;;31163:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31175:19;31163:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31163:31:0;;;-1:-1:-1;;31163:31:0;;;;;;;;;;;;-1:-1:-1;;;31163:31:0;;;;;;;;-1:-1:-1;;;31163:31:0;;;;;;;;-1:-1:-1;;;31163:31:0;;;;;;;;;;;;;;;;;;;;;31046:154;-1:-1:-1;;31046:154:0:o;50986:297::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;51204:16;51123:154;51181:21;51123:154;;::::1;::::0;;::::1;-1:-1:-1::0;;51123:154:0;;::::1;;::::0;;;51163:16;51123:154;;;;51142:19;51123:154;;;;;::::1;::::0;::::1;;::::0;;51124:7:::1;51123:154:::0;50986:297::o;27456:94::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;27521:21:::1;27539:1;27521:9;:21::i;:::-;27456:94::o:0;36412:2098::-;36516:12;;:34;;-1:-1:-1;;;36516:34:0;;36554:9;;-1:-1:-1;;;;;36516:12:0;;:20;;:34;;36537:12;;36516:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36516:47:0;;36508:72;;;;-1:-1:-1;;;36508:72:0;;;;;;;:::i;:::-;36595:12;;:35;;-1:-1:-1;;;36595:35:0;;36634:9;;-1:-1:-1;;;;;36595:12:0;;:20;;:35;;36616:13;;36595:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36595:48:0;;36587:74;;;;-1:-1:-1;;;36587:74:0;;;;;;;:::i;:::-;36777:25;;;;:10;:25;;;;;;;36761:49;;;;36777:31;;;36761:49;:::i;:::-;;;;;;;;;;36725:24;;;;:10;:24;;;;;;36761:49;;36709:48;;36725:30;;;36709:48;:::i;:::-;;;;;;;;:101;36701:119;;;;-1:-1:-1;;;36701:119:0;;;;;;;:::i;:::-;36870:25;;;;:10;:25;;;;;;:32;;;;;36835:24;;;;;;;:31;;;;-1:-1:-1;;;36870:32:0;;;;;;;;36835:31;;;;;:67;36827:86;;;;-1:-1:-1;;;36827:86:0;;;;;;;:::i;:::-;36966:25;;;;:10;:25;;;;;;:35;;;;;36928:24;;;;;;;:34;;;;36966:35;36928:34;;;36966:35;;36928:73;36920:95;;;;-1:-1:-1;;;36920:95:0;;;;;;;:::i;:::-;37064:25;;;;:10;:25;;;;;;:31;;;;;37030:24;;;;;;;:30;;;;37064:31;;;;;;;;;37030:30;;;;;:65;37022:83;;;;-1:-1:-1;;;37022:83:0;;;;;;;:::i;:::-;37120:24;;;;:10;:24;;;;;:31;;;37154:1;-1:-1:-1;;;37120:31:0;;;;;:35;37112:57;;;;-1:-1:-1;;;37112:57:0;;;;;;;:::i;:::-;37190:24;;;;:10;:24;;;;;:35;;;:40;37182:61;;;;-1:-1:-1;;;37182:61:0;;;;;;;:::i;:::-;37258:25;;;;:10;:25;;;;;:36;;;:41;37250:62;;;;-1:-1:-1;;;37250:62:0;;;;;;;:::i;:::-;37376:16;37422:24;;;:10;:24;;;;;;;;:34;;;;;;;;;37395:62;;:10;:62;;;;;37422:34;37458:30;;;;;37395:94;;;;;;;;;37585:24;;;;;;;;:31;;;;;37395:94;;;;;37585:35;;37422:34;-1:-1:-1;;;37585:31:0;;;;:35;:::i;:::-;37577:44;;:3;:44;:::i;:::-;37536:24;;;;:10;:24;;;;;:31;;;:35;;37570:1;;-1:-1:-1;;;37536:31:0;;;;:35;:::i;:::-;37528:44;;:3;:44;:::i;:::-;37515:58;;;;;;:::i;:::-;:107;;;;:::i;:::-;37496:127;;37630:16;37668:2;37656:9;:14;;;:113;;37754:14;37766:2;37754:9;:14;:::i;:::-;37715:54;;:35;37726:23;37734:3;37726:21;:23::i;37715:35::-;:54;;;;:::i;:::-;37656:113;;;37711:1;37673:35;37684:23;37692:3;37684:21;:23::i;37673:35::-;:39;;;;:::i;:::-;37630:140;;37804:18;37827:7;:23;;;37825:25;;;;;:::i;:::-;;;;;-1:-1:-1;37882:359:0;;;;;;;;;;;-1:-1:-1;37932:24:0;;;:10;37882:359;37932:24;;;;;;:34;;;;;;;;37882:359;;;;37932:34;37968:30;;;;37882:359;;;;;;;38053:24;;;;;;:30;;;;37882:359;;37825:25;;-1:-1:-1;37882:359:0;;;;;;38053:30;37882:359;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37882:359:0;;;-1:-1:-1;;38085:24:0;;;;:10;37882:359;38085:24;;;;;;;;:32;;;;;37882:359;;;;;38119:21;38131:9;38119;:21;:::i;:::-;37882:359;;;;38195:24;;;;:10;37882:359;38195:24;;;;;;;:31;;;37882:359;;;38195:35;;-1:-1:-1;;;38195:31:0;;;;38229:1;38195:35;:::i;:::-;37882:359;;;;;;38232:5;37882:359;;;;;;;;;;;;;;37857:22;;;:10;:22;;;;;;:384;;;;;;;;37882:359;37857:384;;;;;;;;;;;;-1:-1:-1;;37857:384:0;;;;-1:-1:-1;;37857:384:0;;;;;;;;;;;;;;;;;;;;;:22;;:384;;;;;;;;;;;:::i;:::-;-1:-1:-1;37857:384:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37857:384:0;-1:-1:-1;;;;37857:384:0;;;;-1:-1:-1;;;37857:384:0;-1:-1:-1;;;;37857:384:0;;;;-1:-1:-1;;;37857:384:0;-1:-1:-1;;37857:384:0;;;;-1:-1:-1;;37857:384:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38275:12;:33;;-1:-1:-1;;;38275:33:0;;-1:-1:-1;;;;;38275:12:0;;;;:19;;:33;;38295:12;;38275:33;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38322:24:0;;;;:10;:24;;;;;38315:31;;;;;;;;-1:-1:-1;;38315:31:0;;;38322:24;-1:-1:-1;38315:31:0;;;;38322:24;38315:31;:::i;:::-;-1:-1:-1;38315:31:0;;;;;-1:-1:-1;;;;;;38315:31:0;;;;;;;;;;38353:12;:34;;-1:-1:-1;;;38353:34:0;;-1:-1:-1;;;;;38353:12:0;;;;:19;;:34;;38373:13;;38353:34;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38401:25:0;;;;:10;:25;;;;;38394:32;;;;;;;;-1:-1:-1;;38394:32:0;;;38401:25;-1:-1:-1;38394:32:0;;;;38401:25;38394:32;:::i;:::-;-1:-1:-1;38394:32:0;;;;;-1:-1:-1;;;;;;38394:32:0;;;;;;;;;;38462:12;:42;;-1:-1:-1;;;38462:42:0;;-1:-1:-1;;;;;38462:12:0;;;;:19;;:42;;38482:9;;38493:10;;38462:42;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36412:2098;;;;;:::o;29397:324::-;29470:15;29497:19;;;:10;:19;;;;;:28;:39;;29494:144;;;29549:19;;;;:10;:19;;;;;:29;;;;;29582:2;29549:35;29546:68;;;-1:-1:-1;29603:1:0;29596:8;;29546:68;-1:-1:-1;29629:1:0;29622:8;;29494:144;29647:23;;;;:14;:23;;;;;:32;:43;;29644:72;;;-1:-1:-1;29707:1:0;29644:72;29397:324;;;:::o;26805:87::-;26851:7;26878:6;-1:-1:-1;;;;;26878:6:0;26805:87;:::o;52497:128::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;52578:22;:41;;-1:-1:-1;;;;;52578:41:0;;::::1;-1:-1:-1::0;;;52578:41:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;52497:128::o;31887:255::-;32017:12;;:33;;-1:-1:-1;;;32017:33:0;;31987:13;;32054:9;;-1:-1:-1;;;;;32017:12:0;;;;:20;;:33;;32038:11;;32017:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32017:46:0;;32009:65;;;;-1:-1:-1;;;32009:65:0;;;;;;;:::i;:::-;32088:27;;;;:14;:27;;;;;;;;:48;;;:38;;:48;;;;;32081:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31887:255;;;;:::o;29727:138::-;29832:27;;;;;;;:21;:27;;;;;29825:34;;29797:19;;29832:27;29825:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29727:138;;;:::o;28271:32::-;;;-1:-1:-1;;;;;28271:32:0;;:::o;31326:116::-;31412:24;;-1:-1:-1;;;31412:24:0;;;;;31326:116::o;31584:128::-;31678:28;;31655:7;31678:28;;;:20;:28;;;;;;-1:-1:-1;;;;;31678:28:0;;31584:128::o;51289:974::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;51447:36:::1;::::0;;::::1;:26;:36:::0;;;:10:::1;:36;::::0;;;;;;;:42;;::::1;::::0;;;;;;;;:58;;-1:-1:-1;;51447:58:0::1;;::::0;::::1;;::::0;;51512:21;:27;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;51561:6;51556:599;51573:5;:12;51571:1;:14;51556:599;;;51601:35;::::0;;::::1;;::::0;;;:25;:35:::1;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;51648;;;;::::1;::::0;;;51670:8;;51601:41;;51648;;;51670:5;;51676:1;;51670:8;::::1;;;-1:-1:-1::0;;;51670:8:0::1;;;;;;;;;;;;;;;51648:41;;;;51680:5;51686:1;51680:8;;;;;;-1:-1:-1::0;;;51680:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;51648:41:::1;;::::0;;;51601:89;;::::1;::::0;::::1;::::0;;-1:-1:-1;51601:89:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51601:89:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;51601:89:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;51755:8;;51699:20;;-1:-1:-1;;51755:8:0;;51761:1;;51755:8;::::1;;;-1:-1:-1::0;;;51755:8:0::1;;;;;;;;;;;;;;;51738:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;51728:37;;;;;;51720:46;;51699:68;;;;;;;;;;;;:75;;;;;;;;;;;;;;;;;;51800:1;51789:5;51795:1;51789:8;;;;;;-1:-1:-1::0;;;51789:8:0::1;;;;;;;;;;;;;;;:12;;;51785:363;;;51861:1;-1:-1:-1::0;;;;;51819:44:0::1;:10;:20;;:30;51840:5;51846:1;51840:8;;;;;;-1:-1:-1::0;;;51840:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;51819:30:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;51819:30:0;;-1:-1:-1;;;;;51819:30:0::1;:44;51815:324;;;51926:5;51932:1;51926:8;;;;;;-1:-1:-1::0;;;51926:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;51902:21;;:32:::1;::::0;;::::1;:21:::0;::::1;:32;:67;;51948:21:::0;;::::1;;51902:67;;;51937:5;51943:1;51937:8;;;;;;-1:-1:-1::0;;;51937:8:0::1;;;;;;;;;;;;;;;51902:67;51878:21:::0;:91;;-1:-1:-1;;51878:91:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;52003:8;;52015:9:::1;::::0;51982:20;;-1:-1:-1;;52003:8:0;;52009:1;;52003:8;::::1;;;-1:-1:-1::0;;;52003:8:0::1;;;;;;;;;;;;;;;51982:30;;;;;;;;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;51982:42:0::1;;;;;-1:-1:-1::0;;;;;51982:42:0::1;;;;;;51815:324;;;52097:9;-1:-1:-1::0;;;;;52063:43:0::1;:10;:20;;:30;52084:5;52090:1;52084:8;;;;;;-1:-1:-1::0;;;52084:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;52063:30:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52063:30:0;;-1:-1:-1;;;;;52063:30:0::1;:43;52055:72;;;;-1:-1:-1::0;;;52055:72:0::1;;;;;;;:::i;:::-;51587:3;::::0;::::1;:::i;:::-;;;51556:599;;;-1:-1:-1::0;52244:12:0;;52209:32:::1;::::0;::::1;;::::0;;;:22;:32:::1;::::0;;;;;:47:::1;::::0;52244:12;52209:32:::1;;:47;:::i;:::-;52167:32;::::0;;;::::1;;::::0;;;:22;:32:::1;::::0;;;;:90;;-1:-1:-1;;52167:90:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;;;51289:974:0:o;31718:163::-;31791:4;31811:10;:20;;:64;31867:4;31850:22;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;31850:22:0;;;;;;31840:33;;31850:22;31840:33;;;;31811:64;;;;;;;;;;-1:-1:-1;31811:64:0;;;;;31718:163;-1:-1:-1;;31718:163:0:o;38516:2406::-;38685:12;;:33;;-1:-1:-1;;;38685:33:0;;38722:9;;-1:-1:-1;;;;;38685:12:0;;:20;;:33;;38706:11;;38685:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38685:46:0;;38677:65;;;;-1:-1:-1;;;38677:65:0;;;;;;;:::i;:::-;38821:12;;:29;;-1:-1:-1;;;38821:29:0;;38854:9;;-1:-1:-1;;;;;38821:12:0;;:20;;:29;;38842:7;;38821:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38821:42:0;;38813:67;;;;-1:-1:-1;;;38813:67:0;;;;;;;:::i;:::-;38889:14;38906:19;;;:10;:19;;;;;;;;:29;;;38960:27;;;:14;:27;;;;;38906:29;;;;38960:48;;;:38;;;;:48;;;;;;39119:19;;;;;;;;;;;39103:43;;38906:29;;39103:43;;39119:25;;;39103:43;:::i;:::-;;;;;;;;;;39072:19;;;;:10;:19;;;;;;39103:43;;39056;;39072:25;;;39056:43;:::i;:::-;;;;;;;;:90;39048:109;;;;-1:-1:-1;;;39048:109:0;;;;;;;:::i;:::-;39202:19;;;;:10;:19;;;;;;:26;;;;;39172:19;;;;;;;:26;;;;-1:-1:-1;;;39202:26:0;;;;;;;;39172;;;;;:56;39164:75;;;;-1:-1:-1;;;39164:75:0;;;;;;;:::i;:::-;39283:19;;;;:10;:19;;;;;;:25;;;;;39254:19;;;;;;;:25;;;;39283;;;;;;;;;39254;;;;;:54;39246:72;;;;-1:-1:-1;;;39246:72:0;;;;;;;:::i;:::-;39333:19;;;;:10;:19;;;;;:26;;;39362:1;-1:-1:-1;;;39333:26:0;;;;;:30;39325:52;;;;-1:-1:-1;;;39325:52:0;;;;;;;:::i;:::-;39392:19;;;;:10;:19;;;;;:30;;;:35;39384:54;;;;-1:-1:-1;;;39384:54:0;;;;;;;:::i;:::-;39476:22;39503:7;:23;;;39501:25;;;;;:::i;:::-;;;;;-1:-1:-1;39501:25:0;-1:-1:-1;39533:43:0;39548:11;39501:25;39533:14;:43::i;:::-;39659:36;;;;39640:16;39659:36;;;:10;:36;;;;;;;;39696:19;;;:10;:19;;;;;;:25;;;;;;;;;;39659:63;;;;;;;;;39813:19;;;;;;;:26;;;39659:63;;;;;39813:30;;-1:-1:-1;;;39813:26:0;;;:30;:::i;:::-;39805:39;;:3;:39;:::i;:::-;39769:19;;;;:10;:19;;;;;:26;;;:30;;39798:1;;-1:-1:-1;;;39769:26:0;;;;:30;:::i;:::-;39761:39;;:3;:39;:::i;:::-;39748:53;;;;;;:::i;:::-;:97;;;;:::i;:::-;39729:117;;39853:16;39891:2;39879:9;:14;;;:113;;39977:14;39989:2;39977:9;:14;:::i;:::-;39938:54;;:35;39949:23;39957:3;39949:21;:23::i;39938:35::-;:54;;;;:::i;:::-;39879:113;;;39934:1;39896:35;39907:23;39915:3;39907:21;:23::i;39896:35::-;:39;;;;:::i;:::-;39853:140;;40027:18;40050:7;:23;;;40048:25;;;;;:::i;:::-;;;;;-1:-1:-1;40105:347:0;;;;;;;;;;;-1:-1:-1;40155:19:0;;;:10;40105:347;40155:19;;;;;;:29;;;;;;;;40105:347;;;;40155:29;40186:25;;;;40105:347;;;;;;;40266:19;;;;;;:25;;;;40105:347;;40048:25;;-1:-1:-1;40105:347:0;;;;;;40266:25;40105:347;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40105:347:0;;;-1:-1:-1;;40293:19:0;;;;:10;40105:347;40293:19;;;;;;;;:27;;;;;40105:347;;;;;40322:21;40334:9;40322;:21;:::i;:::-;40105:347;;;;40398:19;;;;:10;40105:347;40398:19;;;;;;;:26;;;40105:347;;;40398:30;;-1:-1:-1;;;40398:26:0;;;;40427:1;40398:30;:::i;:::-;40105:347;;;;;;40430:5;40105:347;;;;;;;;;;;;;;40080:22;;;:10;:22;;;;;;:372;;;;;;;;40105:347;40080:372;;;;;;;;;;;;-1:-1:-1;;40080:372:0;;;;-1:-1:-1;;40080:372:0;;;;;;;;;;;;;;;;;;;;;:22;;:372;;;;;;;;;;;:::i;:::-;-1:-1:-1;40080:372:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40080:372:0;;;;;;;;-1:-1:-1;;40080:372:0;-1:-1:-1;;;40080:372:0;;;;;;;;;-1:-1:-1;;;;40080:372:0;-1:-1:-1;;;40080:372:0;;;;;;-1:-1:-1;;;;40080:372:0;-1:-1:-1;;;40080:372:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40461:30:0;;;:14;:30;;;;;;;;:51;;;;;:41;;;;:51;;;:64;;;40577:31;40461:30;40577:15;:31::i;:::-;40532:30;;;;:14;:30;;;;;;;:42;;:76;;-1:-1:-1;;40532:76:0;;;;;;;;;;;;;-1:-1:-1;40642:12:0;:28;;-1:-1:-1;;;40642:28:0;;-1:-1:-1;;;;;40642:12:0;;;;:19;;:28;;40662:7;;40642:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40684:19:0;;;;:10;:19;;;;;40677:26;;;;;;;;-1:-1:-1;;40677:26:0;;;40684:19;-1:-1:-1;40677:26:0;;;;40684:19;40677:26;:::i;:::-;-1:-1:-1;40677:26:0;;;;;-1:-1:-1;;;;;;40677:26:0;;;;;;;;;;;40717:19;;;:10;:19;;;;;40710:26;;;40677;40710;;;;-1:-1:-1;;40710:26:0;;;40717:19;40710:26;;;;40677;40710;:::i;:::-;-1:-1:-1;40710:26:0;;;;;-1:-1:-1;;;;;;40710:26:0;;;;;;;;;;40790:12;:32;;-1:-1:-1;;;40790:32:0;;-1:-1:-1;;;;;40790:12:0;;;;:19;;:32;;40810:11;;40790:32;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40836:27:0;;;;:14;:27;;;;;;40829:34;;;;;;;;;-1:-1:-1;;40829:34:0;;;;;;;;;;;;;;;;;;40870:12;;:46;;-1:-1:-1;;;40870:46:0;;-1:-1:-1;;;;;40870:12:0;;;;-1:-1:-1;40870:19:0;;:46;;40890:9;;40901:14;;40870:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38516:2406;;;;;;;;:::o;32148:256::-;32273:12;;:33;;-1:-1:-1;;;32273:33:0;;32310:9;;-1:-1:-1;;;;;32273:12:0;;:20;;:33;;32294:11;;32273:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32273:46:0;;32265:65;;;;-1:-1:-1;;;32265:65:0;;;;;;;:::i;:::-;32337:27;;;;:14;:27;;;;;;;;:48;;;:38;;:48;;;;;:61;;;;;;;;:::i;:::-;;32148:256;;;:::o;30025:516::-;30102:15;30231:27;;;:14;:27;;;;;:36;;30269:40;;;;30311:39;;;;;30390:20;;30231:36;;30269:40;;;;;30139:26;;30311:39;;;-1:-1:-1;;;30390:20:0;;;;-1:-1:-1;;;;;30376:35:0;;;;;-1:-1:-1;;;30376:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30376:35:0;;30364:47;;30423:7;30418:118;30436:20;;-1:-1:-1;;;30436:20:0;;;;30434:22;;;;30418:118;;;30487:27;;;;:14;:27;;;;;;;;:41;;;;;;:38;;;;:41;;;;;;;30472:12;;30487:41;;30472:9;;:12;;;;-1:-1:-1;;;30472:12:0;;;;;;;;;;;;;;;;;;:56;30458:3;;;:::i;:::-;;;30418:118;;;;30025:516;;;;;:::o;27705:192::-;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27794:22:0;::::1;27786:73;;;;-1:-1:-1::0;;;27786:73:0::1;;;;;;;:::i;:::-;27870:19;27880:8;27870:9;:19::i;52269:105::-:0;27036:12;:10;:12::i;:::-;-1:-1:-1;;;;;27025:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27025:23:0;;27017:68;;;;-1:-1:-1;;;27017:68:0;;;;;;;:::i;:::-;52336:24;:32;;::::1;::::0;;::::1;-1:-1:-1::0;;;52336:32:0::1;-1:-1:-1::0;;52336:32:0;;::::1;::::0;;;::::1;::::0;;52269:105::o;33685:1567::-;33863:12;;:33;;-1:-1:-1;;;33863:33:0;;33900:9;;-1:-1:-1;;;;;33863:12:0;;:20;;:33;;33884:11;;33863:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33863:46:0;;33855:55;;;;;;33944:1;33925:9;:16;:20;33917:44;;;;-1:-1:-1;;;33917:44:0;;;;;;;:::i;:::-;34003:22;34030:7;:23;;;34028:25;;;;;:::i;:::-;;;;;-1:-1:-1;34028:25:0;-1:-1:-1;34060:43:0;34075:11;34028:25;34060:14;:43::i;:::-;34145:6;34140:842;34161:9;:16;34157:1;:20;34140:842;;;34197:9;34207:1;34197:12;;;;;;-1:-1:-1;;;34197:12:0;;;;;;;;;;;;;;;34213:1;34197:17;34193:52;;;34227:8;;34193:52;34340:12;;34361;;34378:9;;-1:-1:-1;;;;;34340:12:0;;:20;;34361:9;;34371:1;;34361:12;;;;-1:-1:-1;;;34361:12:0;;;;;;;;;;;;;;;34340:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34340:47:0;;34332:72;;;;-1:-1:-1;;;34332:72:0;;;;;;;:::i;:::-;34421:10;:24;34432:9;34442:1;34432:12;;;;;;-1:-1:-1;;;34432:12:0;;;;;;;;;;;;;;;34421:24;;;;;;;;;;;:35;;;34460:1;34421:40;34413:59;;;;-1:-1:-1;;;34413:59:0;;;;;;;:::i;:::-;34504:14;34521:10;:24;34532:9;34542:1;34532:12;;;;;;-1:-1:-1;;;34532:12:0;;;;;;;;;;;;;;;;;;;;34521:24;;;;;;;;;;;;;-1:-1:-1;34521:24:0;;;:34;;;34582:30;;;:14;:30;;;;;34521:34;;;;34582:51;;;:41;;;;:51;;;;;34698:12;;34521:34;;-1:-1:-1;34582:51:0;34698:9;;34708:1;;34698:12;;;;-1:-1:-1;;;34698:12:0;;;;;;;;;;;;;;;;;;;;34644:30;;;;:14;:30;;;;;;:51;;;;;:41;;:51;;;;;;:66;34730:12;;34659:14;;34719:10;;34730:9;;34740:1;;34730:12;;;;-1:-1:-1;;;34730:12:0;;;;;;;;;;;;;;;34719:24;;;;;;;;;;;:35;;:52;;;;34780:12;;;;;;;;;-1:-1:-1;;;;;34780:12:0;-1:-1:-1;;;;;34780:19:0;;34800:9;34810:1;34800:12;;;;;;-1:-1:-1;;;34800:12:0;;;;;;;;;;;;;;;34780:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34856:7;34867:1;34856:12;34852:123;;34914:1;34881:19;;;:10;:19;;;;;;:30;;;;:34;;;;34926:12;;:39;;-1:-1:-1;;;34926:39:0;;-1:-1:-1;;;;;34926:12:0;;;;:19;;:39;;34946:9;;34892:7;;34926:39;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34852:123;34140:842;;;34179:3;;;:::i;:::-;;;34140:842;;47401:698;47447:15;47508:7;:23;;;47506:25;;;;;:::i;:::-;;;;;-1:-1:-1;47538:23:0;;;;:14;:23;;;;;:42;;;47506:25;-1:-1:-1;47722:2:0;47684:35;47695:23;47703:3;47695:21;:23::i;47684:35::-;:40;;;;:::i;:::-;47638:23;;;;:14;:23;;;;;:36;;:87;;-1:-1:-1;;47638:87:0;;;;;;;;;;;;;47780:205;47798:20;;-1:-1:-1;;;47798:20:0;;;;47796:22;;;;47780:205;;;47834:15;47852:18;47868:1;47852:15;:18::i;:::-;47881:23;;;;:14;:23;;;;;;;;:37;;;;;:34;;:37;;;;;:47;;;47937:19;;;:10;:19;;;:30;;:40;;;-1:-1:-1;47820:3:0;47916:1;47820:3;:::i;:::-;;;47780:205;;;;48069:24;48085:7;48069:15;:24::i;:::-;48031:23;;;;:14;:23;;;;;:35;;:62;;-1:-1:-1;;48031:62:0;;;;;;;;;;;;:23;47401:698::o;49034:536::-;49232:21;;;;:14;:21;;;;;;:34;;;;;49105:21;;;;;;49171:34;;;49104:163;;-1:-1:-1;;49104:163:0;49232:34;;;;49104:163;;;;;;;;;;49320:245;49346:20;;-1:-1:-1;;;49346:20:0;;;;49340:26;;;;49320:245;;;49428:21;;;;:14;:21;;;;;;;;:39;;;;;;:32;;;;:39;;;;;;49386:21;;;;;;;;;:39;;;:32;:39;;;;;:81;;;49487:51;;;:10;:51;;;;:62;;:70;;;49368:7;49461:5;49368:7;:::i;:::-;;;49320:245;;48105:923;48170:17;;48237:4;48170:17;48274:575;48292:20;;-1:-1:-1;;;48292:20:0;;;;48290:22;;;;48274:575;;;48328:13;48344:23;;;:14;:23;;;;;;;;:37;;;;;:34;;:37;;;;;;48394:10;48390:72;;48428:5;48417:16;;48444:8;;;48390:72;48486:17;;;;:10;:17;;;;;:24;;;48472:38;;-1:-1:-1;;;48486:24:0;;;;48472:38;;:::i;:::-;;-1:-1:-1;48531:17:0;;;:51;;-1:-1:-1;48552:17:0;;;;:10;:17;;;;;:25;;;;;:30;48531:51;48527:113;;;48606:5;48595:16;;48622:8;;;48527:113;48655:15;48651:99;;48696:17;;;;:10;:17;;;;;:25;;;;;;-1:-1:-1;48732:8:0;;48651:99;48764:17;;;;:10;:17;;;;;:25;;;;;:39;;48760:82;;48827:5;48816:16;;48760:82;48274:575;;48314:3;;;:::i;:::-;;;48274:575;;;;48885:8;48881:66;;;48936:3;48918:15;:10;48931:2;48918:15;:::i;:::-;:21;;;;:::i;:::-;48904:35;;;;:::i;:::-;;;48881:66;48980:23;;;;:14;:23;;;;;:36;;;49019:3;;48967:49;;48980:36;;48967:10;:49;:::i;:::-;:55;;;;:::i;:::-;48953:69;;;;:::i;:::-;;48105:923;-1:-1:-1;;;;48105:923:0:o;25009:98::-;25089:10;25009:98;:::o;49576:842::-;49755:54;;-1:-1:-1;;;49755:54:0;;-1:-1:-1;;;;;49755:36:0;;;;;:54;;49792:4;;49798:2;;49802:6;;49755:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49818:12;49862:16;49893:1;49888:137;;;;50040:2;50035:196;;;;50351:1;50348;50341:12;49888:137;-1:-1:-1;;49976:6:0;-1:-1:-1;49888:137:0;;50035:196;50130:2;50127:1;50124;50109:24;50164:1;50158:8;50147:19;;49855:509;;50385:7;50377:35;;;;-1:-1:-1;;;50377:35:0;;;;;;;:::i;:::-;49576:842;;;;;:::o;50424:421::-;50555:41;;-1:-1:-1;;;50555:41:0;;50533:19;;-1:-1:-1;;;;;50555:32:0;;;;;:41;;50588:7;;50555:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50533:63;;50626:4;-1:-1:-1;;;;;50611:19:0;:11;-1:-1:-1;;;;;50611:19:0;;50603:45;;;;-1:-1:-1;;;50603:45:0;;;;;;;:::i;:::-;50661:56;;-1:-1:-1;;;50661:56:0;;-1:-1:-1;;;;;50661:37:0;;;;;:56;;50699:4;;50705:2;;50709:7;;50661:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50747:41:0;;-1:-1:-1;;;50747:41:0;;50726:18;;-1:-1:-1;;;;;;50747:32:0;;;-1:-1:-1;50747:32:0;;:41;;50780:7;;50747:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50726:62;;50817:2;-1:-1:-1;;;;;50803:16:0;:10;-1:-1:-1;;;;;50803:16:0;;50795:44;;;;-1:-1:-1;;;50795:44:0;;;;;;;:::i;:::-;50424:421;;;;;;:::o;20788:723::-;20844:13;21065:10;21061:53;;-1:-1:-1;21092:10:0;;;;;;;;;;;;-1:-1:-1;;;21092:10:0;;;;;;21061:53;21139:5;21124:12;21180:78;21187:9;;21180:78;;21213:8;;;;:::i;:::-;;-1:-1:-1;21236:10:0;;-1:-1:-1;21244:2:0;21236:10;;:::i;:::-;;;21180:78;;;21268:19;21300:6;-1:-1:-1;;;;;21290:17:0;;;;;-1:-1:-1;;;21290:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21290:17:0;;21268:39;;21318:154;21325:10;;21318:154;;21352:11;21362:1;21352:11;;:::i;:::-;;-1:-1:-1;21421:10:0;21429:2;21421:5;:10;:::i;:::-;21408:24;;:2;:24;:::i;:::-;21395:39;;21378:6;21385;21378:14;;;;;;-1:-1:-1;;;21378:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;21378:56:0;;;;;;;;-1:-1:-1;21449:11:0;21458:2;21449:11;;:::i;:::-;;;21318:154;;45619:181;45685:7;45743:15;45760:11;45773:9;45784:7;45726:66;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45726:66:0;;;;;;;;;45716:77;;45726:66;45716:77;;;;;45619:181;-1:-1:-1;;45619:181:0:o;45806:1589::-;46063:9;45865:15;46050:23;;;:12;:23;;;;;;;;:33;46015:32;;;;;;:22;:32;;;;;;;45865:15;;46050:33;;;;;;;;;46015:32;;;45972:40;;45983:28;;:26;:28::i;45972:40::-;:75;;;;:::i;:::-;:111;;;;:::i;:::-;46105:32;;;;;;;:22;:32;;;;;;45954:129;;-1:-1:-1;46105:32:0;;46094:43;;46090:112;;46158:32;;;;;;;:22;:32;;;;;;:36;;46193:1;;46158:32;;:36;:::i;:::-;46148:46;;;;46090:112;46273:23;46271:25;;46273:23;;46271:25;;;:::i;:::-;;;;;-1:-1:-1;46271:25:0;-1:-1:-1;46307:10:0;46303:985;46326:3;46321:4;:8;;;46303:985;;;46363:35;;;;;;;;:25;:35;;;;;;;;:41;;;;;;;;;:48;46352:59;;46348:164;;46435:35;;;;;;;;:25;:35;;;;;;;;:41;;;;;;;;;:48;46424:59;;;;:::i;:::-;;;46494:8;;46348:164;46597:36;;;;46571:16;46597:36;;;:10;:36;;;;;;;;:42;;;;;;;;;;;;46643:2;46597:42;;;;:48;;:246;;46795:36;;;;:26;:36;;;:10;:36;;;;;;;;:42;;;;;;;;;;:47;;46840:2;;46795:42;;:47;:::i;:::-;46756:87;;:35;46767:23;46775:3;46767:21;:23::i;46756:35::-;:87;;;;:::i;:::-;46597:246;;;46719:1;46681:35;46692:23;46700:3;46692:21;:23::i;46681:35::-;:39;;;;:::i;:::-;46912:354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46975:35:0;;;:25;:35;;;;;:41;;;;;;;;;;:50;;46571:273;;-1:-1:-1;46912:354:0;;;;;;46975:41;47017:7;;46975:50;;;;-1:-1:-1;;;46975:50:0;;;;;;;;;;;;;;;;;;;:56;;46912:354;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46912:354:0;;;-1:-1:-1;;47085:35:0;;;;;;;;:25;46912:354;47085:35;;;;;;;:41;;;;;;;;;;;:50;;46912:354;;;;;47085:41;47127:7;;47085:50;;;;-1:-1:-1;;;47085:50:0;;;;;;;;;;;;;;;;;:58;:50;;;;;:58;;;;;;;;;46912:354;;47198:36;;;;;;:10;:36;;;;;;:42;;;;;;;;;;;;46912:354;;;47198:54;;47243:9;;47198:42;:54;:::i;:::-;46912:354;;;;47254:1;46912:354;;;;;;;-1:-1:-1;46912:354:0;;;;;;;;;;;;;;46890:19;;;:10;:19;;;;;;:376;;;;;;;;;;;;;;;;;-1:-1:-1;;46890:376:0;;;46912:354;46890:376;;;;-1:-1:-1;;46890:376:0;;;;;;;;;;;;;;;;;;;;;;;:19;;:376;;;;;;;;;;;:::i;:::-;-1:-1:-1;46890:376:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46890:376:0;-1:-1:-1;;;;46890:376:0;;;;-1:-1:-1;;;46890:376:0;-1:-1:-1;;;;46890:376:0;;;;-1:-1:-1;;;46890:376:0;-1:-1:-1;;46890:376:0;;;;-1:-1:-1;;46890:376:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47275:5:0;;46303:985;46331:6;;;:::i;:::-;;;46303:985;;;-1:-1:-1;;47365:9:0;47388:1;47352:23;;;:12;:23;;;;;:37;;-1:-1:-1;;47352:37:0;;;45806:1589;;-1:-1:-1;45806:1589:0:o;27905:173::-;27961:16;27980:6;;-1:-1:-1;;;;;27997:17:0;;;-1:-1:-1;;;;;;27997:17:0;;;;;;28030:40;;27980:6;;;;;;;28030:40;;27961:16;28030:40;27905:173;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:704:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:64;254:48;299:2;254:48;:::i;:::-;239:64;:::i;:::-;337:15;;;368:12;;;;400:15;;;446:11;;;434:24;;430:33;;427:42;-1:-1:-1;424:2:1;;;486:5;479;472:20;424:2;512:5;526:163;540:2;537:1;534:9;526:163;;;597:17;;585:30;;635:12;;;;667;;;;558:1;551:9;526:163;;;-1:-1:-1;707:5:1;;84:634;-1:-1:-1;;;;;;;84:634:1:o;723:710::-;;835:3;828:4;820:6;816:17;812:27;802:2;;857:5;850;843:20;802:2;897:6;884:20;923:4;947:64;962:48;1007:2;962:48;:::i;947:64::-;1045:15;;;1076:12;;;;1108:15;;;1154:11;;;1142:24;;1138:33;;1135:42;-1:-1:-1;1132:2:1;;;1194:5;1187;1180:20;1132:2;1220:5;1234:170;1248:2;1245:1;1242:9;1234:170;;;1305:24;1325:3;1305:24;:::i;:::-;1293:37;;1350:12;;;;1382;;;;1266:1;1259:9;1234:170;;1438:552;;1536:3;1529:4;1521:6;1517:17;1513:27;1503:2;;1558:5;1551;1544:20;1503:2;1598:6;1585:20;-1:-1:-1;;;;;1620:2:1;1617:26;1614:2;;;1646:18;;:::i;:::-;1690:54;1732:2;1713:13;;-1:-1:-1;;1709:27:1;1738:4;1705:38;1690:54;:::i;:::-;1769:2;1760:7;1753:19;1815:3;1808:4;1803:2;1795:6;1791:15;1787:26;1784:35;1781:2;;;1836:5;1829;1822:20;1781:2;1905;1898:4;1890:6;1886:17;1879:4;1870:7;1866:18;1853:55;1928:16;;;1946:4;1924:27;1917:42;;;;1932:7;1493:497;-1:-1:-1;;1493:497:1:o;1995:165::-;2064:20;;2124:10;2113:22;;2103:33;;2093:2;;2150:1;2147;2140:12;2165:158;2233:20;;2293:4;2282:16;;2272:27;;2262:2;;2313:1;2310;2303:12;2328:259;;2440:2;2428:9;2419:7;2415:23;2411:32;2408:2;;;2461:6;2453;2446:22;2408:2;2505:9;2492:23;2524:33;2551:5;2524:33;:::i;:::-;2576:5;2398:189;-1:-1:-1;;;2398:189:1:o;2592:263::-;;2715:2;2703:9;2694:7;2690:23;2686:32;2683:2;;;2736:6;2728;2721:22;2683:2;2773:9;2767:16;2792:33;2819:5;2792:33;:::i;2860:374::-;;2997:2;2985:9;2976:7;2972:23;2968:32;2965:2;;;3018:6;3010;3003:22;2965:2;3063:9;3050:23;-1:-1:-1;;;;;3088:6:1;3085:30;3082:2;;;3133:6;3125;3118:22;3082:2;3161:67;3220:7;3211:6;3200:9;3196:22;3161:67;:::i;3239:344::-;;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3382:6;3374;3367:22;3329:2;3427:9;3414:23;-1:-1:-1;;;;;3452:6:1;3449:30;3446:2;;;3497:6;3489;3482:22;3446:2;3525:52;3569:7;3560:6;3549:9;3545:22;3525:52;:::i;3588:190::-;;3700:2;3688:9;3679:7;3675:23;3671:32;3668:2;;;3721:6;3713;3706:22;3668:2;-1:-1:-1;3749:23:1;;3658:120;-1:-1:-1;3658:120:1:o;3783:442::-;;;3937:2;3925:9;3916:7;3912:23;3908:32;3905:2;;;3958:6;3950;3943:22;3905:2;3999:9;3986:23;3976:33;;4060:2;4049:9;4045:18;4032:32;-1:-1:-1;;;;;4079:6:1;4076:30;4073:2;;;4124:6;4116;4109:22;4073:2;4152:67;4211:7;4202:6;4191:9;4187:22;4152:67;:::i;:::-;4142:77;;;3895:330;;;;;:::o;4230:1024::-;;;4382:2;4370:9;4361:7;4357:23;4353:32;4350:2;;;4403:6;4395;4388:22;4350:2;4444:9;4431:23;4421:33;;4473:2;4526;4515:9;4511:18;4498:32;-1:-1:-1;;;;;4545:6:1;4542:30;4539:2;;;4590:6;4582;4575:22;4539:2;4618:22;;4671:4;4663:13;;4659:27;-1:-1:-1;4649:2:1;;4705:6;4697;4690:22;4649:2;4746;4733:16;4769:64;4784:48;4829:2;4784:48;:::i;4769:64::-;4867:15;;;4898:12;;;;4930:11;;;4968;;;4960:20;;4956:29;;4953:42;-1:-1:-1;4950:2:1;;;5013:6;5005;4998:22;4950:2;5040:6;5031:15;;5055:169;5069:2;5066:1;5063:9;5055:169;;;5126:23;5145:3;5126:23;:::i;:::-;5114:36;;5087:1;5080:9;;;;;5170:12;;;;5202;;5055:169;;;5059:3;5243:5;5233:15;;;;;;;4340:914;;;;;:::o;5259:486::-;;;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5435:6;5427;5420:22;5382:2;5476:9;5463:23;5453:33;;5537:2;5526:9;5522:18;5509:32;-1:-1:-1;;;;;5556:6:1;5553:30;5550:2;;;5601:6;5593;5586:22;5550:2;5629:52;5673:7;5664:6;5653:9;5649:22;5629:52;:::i;:::-;5619:62;;;5700:39;5735:2;5724:9;5720:18;5700:39;:::i;:::-;5690:49;;5372:373;;;;;:::o;5750:258::-;;;5879:2;5867:9;5858:7;5854:23;5850:32;5847:2;;;5900:6;5892;5885:22;5847:2;-1:-1:-1;;5928:23:1;;;5998:2;5983:18;;;5970:32;;-1:-1:-1;5837:171:1:o;6013:480::-;;;;6169:2;6157:9;6148:7;6144:23;6140:32;6137:2;;;6190:6;6182;6175:22;6137:2;6231:9;6218:23;6208:33;;6288:2;6277:9;6273:18;6260:32;6250:42;;6343:2;6332:9;6328:18;6315:32;-1:-1:-1;;;;;6362:6:1;6359:30;6356:2;;;6407:6;6399;6392:22;6356:2;6435:52;6479:7;6470:6;6459:9;6455:22;6435:52;:::i;:::-;6425:62;;;6127:366;;;;;:::o;6498:476::-;;;;;;6676:3;6664:9;6655:7;6651:23;6647:33;6644:2;;;6698:6;6690;6683:22;6644:2;6739:9;6726:23;6716:33;;6768:39;6803:2;6792:9;6788:18;6768:39;:::i;:::-;6758:49;;6854:2;6843:9;6839:18;6826:32;6816:42;;6877:39;6912:2;6901:9;6897:18;6877:39;:::i;:::-;6634:340;;;;-1:-1:-1;6634:340:1;;6963:3;6948:19;6935:33;;6634:340;-1:-1:-1;;6634:340:1:o;6979:196::-;;7090:2;7078:9;7069:7;7065:23;7061:32;7058:2;;;7111:6;7103;7096:22;7058:2;7139:30;7159:9;7139:30;:::i;7180:448::-;;;7333:2;7321:9;7312:7;7308:23;7304:32;7301:2;;;7354:6;7346;7339:22;7301:2;7382:30;7402:9;7382:30;:::i;:::-;7372:40;;7463:2;7452:9;7448:18;7435:32;-1:-1:-1;;;;;7482:6:1;7479:30;7476:2;;;7527:6;7519;7512:22;7633:194;;7743:2;7731:9;7722:7;7718:23;7714:32;7711:2;;;7764:6;7756;7749:22;7711:2;7792:29;7811:9;7792:29;:::i;7832:1596::-;;;;;;;8094:3;8082:9;8073:7;8069:23;8065:33;8062:2;;;8116:6;8108;8101:22;8062:2;8144:29;8163:9;8144:29;:::i;:::-;8134:39;;8192:38;8226:2;8215:9;8211:18;8192:38;:::i;:::-;8182:48;;8281:2;8270:9;8266:18;8253:32;-1:-1:-1;;;;;8345:2:1;8337:6;8334:14;8331:2;;;8366:6;8358;8351:22;8331:2;8394:52;8438:7;8429:6;8418:9;8414:22;8394:52;:::i;:::-;8384:62;;8493:2;8482:9;8478:18;8465:32;8455:42;;8550:3;8539:9;8535:19;8522:33;8506:49;;8580:2;8570:8;8567:16;8564:2;;;8601:6;8593;8586:22;8564:2;8644:8;8633:9;8629:24;8619:34;;8691:7;8684:4;8680:2;8676:13;8672:27;8662:2;;8718:6;8710;8703:22;8662:2;8759;8746:16;8782:64;8797:48;8842:2;8797:48;:::i;8782:64::-;8880:15;;;8920:2;8911:12;;;;8868:3;8943:11;;8972:6;8987:211;9001:2;8998:1;8995:9;8987:211;;;9058:65;9115:7;9110:2;9103:3;9090:17;9086:2;9082:26;9078:35;9058:65;:::i;:::-;9046:78;;9153:2;9144:12;;;;9176;;;;;9019:1;9012:9;8987:211;;;-1:-1:-1;9217:5:1;;-1:-1:-1;;;;9275:3:1;9260:19;;9247:33;;-1:-1:-1;9292:16:1;;;9289:2;;;9326:6;9318;9311:22;9289:2;;9354:68;9414:7;9403:8;9392:9;9388:24;9354:68;:::i;:::-;9344:78;;;8052:1376;;;;;;;;:::o;9433:93::-;9505:13;9498:21;9486:34;;9476:50::o;9531:260::-;;9613:5;9607:12;9640:6;9635:3;9628:19;9656:63;9712:6;9705:4;9700:3;9696:14;9689:4;9682:5;9678:16;9656:63;:::i;:::-;9773:2;9752:15;-1:-1:-1;;9748:29:1;9739:39;;;;9780:4;9735:50;;9583:208;-1:-1:-1;;9583:208:1:o;9796:96::-;9874:10;9863:22;9851:35;;9841:51::o;9897:77::-;9966:4;9955:16;9943:29;;9941:33::o;9979:1109::-;10167:13;;9979:1109;;;;10240:1;10225:17;;10261:1;10297:18;;;;10324:2;;10378:4;10370:6;10366:17;10356:27;;10324:2;10404;10452;10444:6;10441:14;10421:18;10418:38;10415:2;;;-1:-1:-1;;;10479:33:1;;10535:4;10532:1;10525:15;10565:4;10486:3;10553:17;10415:2;10596:18;10623:104;;;;10741:1;10736:327;;;;10589:474;;10623:104;-1:-1:-1;;10656:24:1;;10644:37;;10701:16;;;;-1:-1:-1;10623:104:1;;10736:327;10772:42;10807:6;10772:42;:::i;:::-;10836:3;10852:165;10866:6;10863:1;10860:13;10852:165;;;10944:14;;10931:11;;;10924:35;10987:16;;;;10881:10;;10852:165;;;10856:3;;11046:6;11041:3;11037:16;11030:23;;10589:474;-1:-1:-1;11079:3:1;;10117:971;-1:-1:-1;;;;;;;;10117:971:1:o;11093:276::-;;11262:6;11256:13;11278:53;11324:6;11319:3;11312:4;11304:6;11300:17;11278:53;:::i;:::-;11347:16;;;;;11232:137;-1:-1:-1;;11232:137:1:o;11374:525::-;;11619:6;11614:3;11607:19;11656:6;11651:2;11646:3;11642:12;11635:28;11718:26;11714:31;11705:6;11701:2;11697:15;11693:53;11688:2;11683:3;11679:12;11672:75;11776:6;11770:13;11792:60;11845:6;11840:2;11835:3;11831:12;11826:2;11818:6;11814:15;11792:60;:::i;:::-;11872:16;;;;11890:2;11868:25;;11597:302;-1:-1:-1;;;;;11597:302:1:o;11904:203::-;-1:-1:-1;;;;;12068:32:1;;;;12050:51;;12038:2;12023:18;;12005:102::o;12112:375::-;-1:-1:-1;;;;;12370:15:1;;;12352:34;;12422:15;;;;12417:2;12402:18;;12395:43;12469:2;12454:18;;12447:34;;;;12302:2;12287:18;;12269:218::o;12492:274::-;-1:-1:-1;;;;;12684:32:1;;;;12666:51;;12748:2;12733:18;;12726:34;12654:2;12639:18;;12621:145::o;12771:661::-;12942:2;12994:21;;;13064:13;;12967:18;;;13086:22;;;12771:661;;12942:2;13165:15;;;;13139:2;13124:18;;;12771:661;13211:195;13225:6;13222:1;13219:13;13211:195;;;13290:13;;-1:-1:-1;;;;;13286:39:1;13274:52;;13381:15;;;;13346:12;;;;13322:1;13240:9;13211:195;;;-1:-1:-1;13423:3:1;;12922:510;-1:-1:-1;;;;;;12922:510:1:o;13437:187::-;13602:14;;13595:22;13577:41;;13565:2;13550:18;;13532:92::o;13857:222::-;;14006:2;13995:9;13988:21;14026:47;14069:2;14058:9;14054:18;14046:6;14026:47;:::i;14084:340::-;14286:2;14268:21;;;14325:2;14305:18;;;14298:30;-1:-1:-1;;;14359:2:1;14344:18;;14337:46;14415:2;14400:18;;14258:166::o;14429:337::-;14631:2;14613:21;;;14670:2;14650:18;;;14643:30;-1:-1:-1;;;14704:2:1;14689:18;;14682:43;14757:2;14742:18;;14603:163::o;14771:336::-;14973:2;14955:21;;;15012:2;14992:18;;;14985:30;-1:-1:-1;;;15046:2:1;15031:18;;15024:42;15098:2;15083:18;;14945:162::o;15112:331::-;15314:2;15296:21;;;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15386:2:1;15371:18;;15364:38;15434:2;15419:18;;15286:157::o;15448:339::-;15650:2;15632:21;;;15689:2;15669:18;;;15662:30;-1:-1:-1;;;15723:2:1;15708:18;;15701:45;15778:2;15763:18;;15622:165::o;15792:331::-;15994:2;15976:21;;;16033:1;16013:18;;;16006:29;-1:-1:-1;;;16066:2:1;16051:18;;16044:38;16114:2;16099:18;;15966:157::o;16128:328::-;16330:2;16312:21;;;16369:1;16349:18;;;16342:29;-1:-1:-1;;;16402:2:1;16387:18;;16380:35;16447:2;16432:18;;16302:154::o;16461:402::-;16663:2;16645:21;;;16702:2;16682:18;;;16675:30;16741:34;16736:2;16721:18;;16714:62;-1:-1:-1;;;16807:2:1;16792:18;;16785:36;16853:3;16838:19;;16635:228::o;16868:339::-;17070:2;17052:21;;;17109:2;17089:18;;;17082:30;-1:-1:-1;;;17143:2:1;17128:18;;17121:45;17198:2;17183:18;;17042:165::o;17212:335::-;17414:2;17396:21;;;17453:2;17433:18;;;17426:30;-1:-1:-1;;;17487:2:1;17472:18;;17465:41;17538:2;17523:18;;17386:161::o;17552:332::-;17754:2;17736:21;;;17793:1;17773:18;;;17766:29;-1:-1:-1;;;17826:2:1;17811:18;;17804:39;17875:2;17860:18;;17726:158::o;17889:340::-;18091:2;18073:21;;;18130:2;18110:18;;;18103:30;-1:-1:-1;;;18164:2:1;18149:18;;18142:46;18220:2;18205:18;;18063:166::o;18234:339::-;18436:2;18418:21;;;18475:2;18455:18;;;18448:30;-1:-1:-1;;;18509:2:1;18494:18;;18487:45;18564:2;18549:18;;18408:165::o;18578:336::-;18780:2;18762:21;;;18819:2;18799:18;;;18792:30;-1:-1:-1;;;18853:2:1;18838:18;;18831:42;18905:2;18890:18;;18752:162::o;18919:329::-;19121:2;19103:21;;;19160:1;19140:18;;;19133:29;-1:-1:-1;;;19193:2:1;19178:18;;19171:36;19239:2;19224:18;;19093:155::o;19253:328::-;19455:2;19437:21;;;19494:1;19474:18;;;19467:29;-1:-1:-1;;;19527:2:1;19512:18;;19505:35;19572:2;19557:18;;19427:154::o;19586:340::-;19788:2;19770:21;;;19827:2;19807:18;;;19800:30;-1:-1:-1;;;19861:2:1;19846:18;;19839:46;19917:2;19902:18;;19760:166::o;19931:331::-;20133:2;20115:21;;;20172:1;20152:18;;;20145:29;-1:-1:-1;;;20205:2:1;20190:18;;20183:38;20253:2;20238:18;;20105:157::o;20267:329::-;20469:2;20451:21;;;20508:1;20488:18;;;20481:29;-1:-1:-1;;;20541:2:1;20526:18;;20519:36;20587:2;20572:18;;20441:155::o;20601:356::-;20803:2;20785:21;;;20822:18;;;20815:30;20881:34;20876:2;20861:18;;20854:62;20948:2;20933:18;;20775:182::o;20962:332::-;21164:2;21146:21;;;21203:1;21183:18;;;21176:29;-1:-1:-1;;;21236:2:1;21221:18;;21214:39;21285:2;21270:18;;21136:158::o;21299:329::-;21501:2;21483:21;;;21540:1;21520:18;;;21513:29;-1:-1:-1;;;21573:2:1;21558:18;;21551:36;21619:2;21604:18;;21473:155::o;21633:337::-;21835:2;21817:21;;;21874:2;21854:18;;;21847:30;-1:-1:-1;;;21908:2:1;21893:18;;21886:43;21961:2;21946:18;;21807:163::o;21975:336::-;22177:2;22159:21;;;22216:2;22196:18;;;22189:30;-1:-1:-1;;;22250:2:1;22235:18;;22228:42;22302:2;22287:18;;22149:162::o;22316:334::-;22518:2;22500:21;;;22557:2;22537:18;;;22530:30;-1:-1:-1;;;22591:2:1;22576:18;;22569:40;22641:2;22626:18;;22490:160::o;22655:338::-;22857:2;22839:21;;;22896:2;22876:18;;;22869:30;-1:-1:-1;;;22930:2:1;22915:18;;22908:44;22984:2;22969:18;;22829:164::o;22998:332::-;23200:2;23182:21;;;23239:1;23219:18;;;23212:29;-1:-1:-1;;;23272:2:1;23257:18;;23250:39;23321:2;23306:18;;23172:158::o;23335:334::-;23537:2;23519:21;;;23576:2;23556:18;;;23549:30;-1:-1:-1;;;23610:2:1;23595:18;;23588:40;23660:2;23645:18;;23509:160::o;23674:335::-;23876:2;23858:21;;;23915:2;23895:18;;;23888:30;-1:-1:-1;;;23949:2:1;23934:18;;23927:41;24000:2;23985:18;;23848:161::o;24014:329::-;24216:2;24198:21;;;24255:1;24235:18;;;24228:29;-1:-1:-1;;;24288:2:1;24273:18;;24266:36;24334:2;24319:18;;24188:155::o;24348:329::-;24550:2;24532:21;;;24589:1;24569:18;;;24562:29;-1:-1:-1;;;24622:2:1;24607:18;;24600:36;24668:2;24653:18;;24522:155::o;24682:326::-;24906:13;;24899:21;24892:29;24874:48;;24982:4;24970:17;;;24964:24;24990:10;24960:41;24938:20;;;24931:71;;;;24862:2;24847:18;;24829:179::o;25013:1239::-;;25192:2;25181:9;25174:21;25237:6;25231:13;25226:2;25215:9;25211:18;25204:41;25292:2;25284:6;25280:15;25274:22;25305:52;25353:2;25342:9;25338:18;25324:12;25305:52;:::i;:::-;;25406:2;25398:6;25394:15;25388:22;25419:54;25469:2;25458:9;25454:18;25438:14;25419:54;:::i;:::-;;25522:2;25514:6;25510:15;25504:22;25545:6;25588:2;25582:3;25571:9;25567:19;25560:31;25614:56;25665:3;25654:9;25650:19;25634:14;25614:56;:::i;:::-;25600:70;;25719:3;25711:6;25707:16;25701:23;25733:56;25784:3;25773:9;25769:19;25753:14;25733:56;:::i;:::-;;25838:3;25830:6;25826:16;25820:23;25852:56;25903:3;25892:9;25888:19;25872:14;25852:56;:::i;:::-;;25957:3;25949:6;25945:16;25939:23;25971:55;26021:3;26010:9;26006:19;25990:14;25971:55;:::i;:::-;;26075:3;26067:6;26063:16;26057:23;26099:3;26111:53;26160:2;26149:9;26145:18;26129:14;26111:53;:::i;:::-;26206:15;;;;26200:22;26180:18;;26173:50;;;;-1:-1:-1;26240:6:1;25164:1088;-1:-1:-1;25164:1088:1:o;26257:177::-;26403:25;;;26391:2;26376:18;;26358:76::o;26439:894::-;;26709:3;26698:9;26694:19;26740:6;26729:9;26722:25;26766:2;26787:10;26845:2;26837:6;26833:15;26828:2;26817:9;26813:18;26806:43;26885:3;26880:2;26869:9;26865:18;26858:31;26909:6;26944;26938:13;26975:6;26967;26960:22;27013:3;27002:9;26998:19;26991:26;;27052:2;27044:6;27040:15;27026:29;;27073:4;27086:169;27100:6;27097:1;27094:13;27086:169;;;27161:13;;27149:26;;27230:15;;;;27195:12;;;;27122:1;27115:9;27086:169;;;-1:-1:-1;;27311:15:1;;27306:2;27291:18;;;;27284:43;;;;-1:-1:-1;27272:3:1;;26670:663;-1:-1:-1;;;;;26670:663:1:o;27338:192::-;27512:10;27500:23;;;;27482:42;;27470:2;27455:18;;27437:93::o;27535:184::-;27707:4;27695:17;;;;27677:36;;27665:2;27650:18;;27632:87::o;27724:349::-;27947:4;27935:17;;;27917:36;;27989:17;;;;27984:2;27969:18;;27962:45;28055:10;28043:23;;;28038:2;28023:18;;28016:51;27905:2;27890:18;;27872:201::o;28078:251::-;28148:2;28142:9;28178:17;;;-1:-1:-1;;;;;28210:34:1;;28246:22;;;28207:62;28204:2;;;28272:18;;:::i;:::-;28308:2;28301:22;28122:207;;-1:-1:-1;28122:207:1:o;28334:191::-;;-1:-1:-1;;;;;28424:6:1;28421:30;28418:2;;;28454:18;;:::i;:::-;-1:-1:-1;28514:4:1;28495:17;;;28491:28;;28408:117::o;28530:132::-;;28601:17;;;28651:4;28635:21;;;28591:71::o;28667:128::-;;28738:1;28734:6;28731:1;28728:13;28725:2;;;28744:18;;:::i;:::-;-1:-1:-1;28780:9:1;;28715:80::o;28800:228::-;;28867:10;28904:2;28901:1;28897:10;28934:2;28931:1;28927:10;28965:3;28961:2;28957:12;28952:3;28949:21;28946:2;;;28973:18;;:::i;:::-;29009:13;;28847:181;-1:-1:-1;;;;28847:181:1:o;29033:204::-;;29107:4;29104:1;29100:12;29139:4;29136:1;29132:12;29174:3;29168:4;29164:14;29159:3;29156:23;29153:2;;;29182:18;;:::i;:::-;29218:13;;29079:158;-1:-1:-1;;;29079:158:1:o;29242:120::-;;29308:1;29298:2;;29313:18;;:::i;:::-;-1:-1:-1;29347:9:1;;29288:74::o;29367:191::-;;29432:10;29469:2;29466:1;29462:10;29491:3;29481:2;;29498:18;;:::i;:::-;29536:10;;29532:20;;;;;29412:146;-1:-1:-1;;29412:146:1:o;29563:453::-;29659:6;29682:5;29696:314;29745:1;29782:2;29772:8;29769:16;29759:2;;29789:5;;;29759:2;29830:4;29825:3;29821:14;29815:4;29812:24;29809:2;;;29839:18;;:::i;:::-;29889:2;29879:8;29875:17;29872:2;;;29904:16;;;;29872:2;29983:17;;;;;29943:15;;29696:314;;;29640:376;;;;;;;:::o;30021:148::-;;30108:55;-1:-1:-1;;30149:4:1;30135:19;;30129:4;30174:922;30258:8;30248:2;;-1:-1:-1;30299:1:1;30313:5;;30248:2;30347:4;30337:2;;-1:-1:-1;30384:1:1;30398:5;;30337:2;30429:4;30447:1;30442:59;;;;30515:1;30510:183;;;;30422:271;;30442:59;30472:1;30463:10;;30486:5;;;30510:183;30547:3;30537:8;30534:17;30531:2;;;30554:18;;:::i;:::-;30610:1;30600:8;30596:16;30587:25;;30638:3;30631:5;30628:14;30625:2;;;30645:18;;:::i;:::-;30678:5;;;30422:271;;30777:2;30767:8;30764:16;30758:3;30752:4;30749:13;30745:36;30739:2;30729:8;30726:16;30721:2;30715:4;30712:12;30708:35;30705:77;30702:2;;;-1:-1:-1;30814:19:1;;;30849:14;;;30846:2;;;30866:18;;:::i;:::-;30899:5;;30702:2;30946:42;30984:3;30974:8;30968:4;30965:1;30946:42;:::i;:::-;31021:6;31016:3;31012:16;31003:7;31000:29;30997:2;;;31032:18;;:::i;:::-;31070:20;;30238:858;-1:-1:-1;;;;30238:858:1:o;31101:168::-;;31207:1;31203;31199:6;31195:14;31192:1;31189:21;31184:1;31177:9;31170:17;31166:45;31163:2;;;31214:18;;:::i;:::-;-1:-1:-1;31254:9:1;;31153:116::o;31274:262::-;;31345:10;31382:2;31379:1;31375:10;31412:2;31409:1;31405:10;31468:3;31464:2;31460:12;31455:3;31452:21;31445:3;31438:11;31431:19;31427:47;31424:2;;;31477:18;;:::i;31541:125::-;;31609:1;31606;31603:8;31600:2;;;31614:18;;:::i;:::-;-1:-1:-1;31651:9:1;;31590:76::o;31671:221::-;;31739:10;31799;;;;31769;;31821:12;;;31818:2;;;31836:18;;:::i;:::-;31873:13;;31719:173;-1:-1:-1;;;31719:173:1:o;31897:195::-;;31972:4;31969:1;31965:12;32004:4;32001:1;31997:12;32029:3;32024;32021:12;32018:2;;;32036:18;;:::i;:::-;32073:13;;;31944:148;-1:-1:-1;;;31944:148:1:o;32097:258::-;32169:1;32179:113;32193:6;32190:1;32187:13;32179:113;;;32269:11;;;32263:18;32250:11;;;32243:39;32215:2;32208:10;32179:113;;;32310:6;32307:1;32304:13;32301:2;;;-1:-1:-1;;32345:1:1;32327:16;;32320:27;32150:205::o;32360:380::-;32445:1;32435:12;;32492:1;32482:12;;;32503:2;;32557:4;32549:6;32545:17;32535:27;;32503:2;32610;32602:6;32599:14;32579:18;32576:38;32573:2;;;32656:10;32651:3;32647:20;32644:1;32637:31;32691:4;32688:1;32681:15;32719:4;32716:1;32709:15;32573:2;;32415:325;;;:::o;32745:135::-;;-1:-1:-1;;32805:17:1;;32802:2;;;32825:18;;:::i;:::-;-1:-1:-1;32872:1:1;32861:13;;32792:88::o;32885:201::-;;32951:10;32996:2;32989:5;32985:14;33023:2;33014:7;33011:15;33008:2;;;33029:18;;:::i;:::-;33078:1;33065:15;;32931:155;-1:-1:-1;;;32931:155:1:o;33091:175::-;;33172:4;33165:5;33161:16;33201:4;33192:7;33189:17;33186:2;;;33209:18;;:::i;:::-;33258:1;33245:15;;33136:130;-1:-1:-1;;33136:130:1:o;33271:112::-;;33329:1;33319:2;;33334:18;;:::i;:::-;-1:-1:-1;33368:9:1;;33309:74::o;33388:127::-;33449:10;33444:3;33440:20;33437:1;33430:31;33480:4;33477:1;33470:15;33504:4;33501:1;33494:15;33520:127;33581:10;33576:3;33572:20;33569:1;33562:31;33612:4;33609:1;33602:15;33636:4;33633:1;33626:15;33652:127;33713:10;33708:3;33704:20;33701:1;33694:31;33744:4;33741:1;33734:15;33768:4;33765:1;33758:15;33784:133;-1:-1:-1;;;;;33861:31:1;;33851:42;;33841:2;;33907:1;33904;33897:12

Swarm Source

ipfs://b3797e4545008355936141fa1117b7d0f235a69db6c3e072fe237d6b44e10b88
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.