ETH Price: $3,829.25 (+5.32%)

Contract

0xA125D3429458c7621CCb1DF8bfEa449f611c824E
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Age:30D
Reset Filter

Transaction Hash
Method
Block
From
To

There are no matching entries

Update your filters to view other transactions

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
200426982024-06-07 21:41:11187 days ago1717796471
0xA125D342...f611c824E
 Contract Creation0 ETH
157969382022-10-21 14:00:23782 days ago1666360823
0xA125D342...f611c824E
 Contract Creation0 ETH
153074312022-08-09 10:21:28855 days ago1660040488
0xA125D342...f611c824E
 Contract Creation0 ETH
150458622022-06-29 16:25:42896 days ago1656519942
0xA125D342...f611c824E
 Contract Creation0 ETH
142169782022-02-16 11:57:431029 days ago1645012663
0xA125D342...f611c824E
 Contract Creation0 ETH
137156902021-11-30 15:57:341107 days ago1638287854  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xBccE1c1F...42c84Ea34
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
ProposalsManager

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @ethereansos/swissknife/contracts/lib/GeneralUtilities.sol


pragma solidity >=0.7.0;


library BehaviorUtilities {

    function randomKey(uint256 i) internal view returns (bytes32) {
        return keccak256(abi.encode(i, block.timestamp, block.number, tx.origin, tx.gasprice, block.coinbase, block.difficulty, msg.sender, blockhash(block.number - 5)));
    }

    function calculateProjectedArraySizeAndLoopUpperBound(uint256 arraySize, uint256 start, uint256 offset) internal pure returns(uint256 projectedArraySize, uint256 projectedArrayLoopUpperBound) {
        if(arraySize != 0 && start < arraySize && offset != 0) {
            uint256 length = start + offset;
            if(start < (length = length > arraySize ? arraySize : length)) {
                projectedArraySize = (projectedArrayLoopUpperBound = length) - start;
            }
        }
    }
}

library ReflectionUtilities {

    function read(address subject, bytes memory inputData) internal view returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.staticcall(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function submit(address subject, uint256 value, bytes memory inputData) internal returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.call{value : value}(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function isContract(address subject) internal view returns (bool) {
        if(subject == address(0)) {
            return false;
        }
        uint256 codeLength;
        assembly {
            codeLength := extcodesize(subject)
        }
        return codeLength > 0;
    }

    function clone(address originalContract) internal returns(address copyContract) {
        assembly {
            mstore(
                0,
                or(
                    0x5880730000000000000000000000000000000000000000803b80938091923cF3,
                    mul(originalContract, 0x1000000000000000000)
                )
            )
            copyContract := create(0, 0, 32)
            switch extcodesize(copyContract)
                case 0 {
                    invalid()
                }
        }
    }
}

library BytesUtilities {

    bytes private constant ALPHABET = "0123456789abcdef";
    string internal constant BASE64_ENCODER_DATA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function asAddress(bytes memory b) internal pure returns(address) {
        if(b.length == 0) {
            return address(0);
        }
        if(b.length == 20) {
            address addr;
            assembly {
                addr := mload(add(b, 20))
            }
            return addr;
        }
        return abi.decode(b, (address));
    }

    function asAddressArray(bytes memory b) internal pure returns(address[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (address[]));
        }
    }

    function asBool(bytes memory bs) internal pure returns(bool) {
        return asUint256(bs) != 0;
    }

    function asBoolArray(bytes memory b) internal pure returns(bool[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bool[]));
        }
    }

    function asBytesArray(bytes memory b) internal pure returns(bytes[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bytes[]));
        }
    }

    function asString(bytes memory b) internal pure returns(string memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string));
        }
    }

    function asStringArray(bytes memory b) internal pure returns(string[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string[]));
        }
    }

    function asUint256(bytes memory bs) internal pure returns(uint256 x) {
        if (bs.length >= 32) {
            assembly {
                x := mload(add(bs, add(0x20, 0)))
            }
        }
    }

    function asUint256Array(bytes memory b) internal pure returns(uint256[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (uint256[]));
        }
    }

    function toString(bytes memory data) internal pure returns(string memory) {
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < data.length; i++) {
            str[2+i*2] = ALPHABET[uint256(uint8(data[i] >> 4))];
            str[3+i*2] = ALPHABET[uint256(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }

    function asSingletonArray(bytes memory a) internal pure returns(bytes[] memory array) {
        array = new bytes[](1);
        array[0] = a;
    }

    function toBase64(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        string memory table = BASE64_ENCODER_DATA;

        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        string memory result = new string(encodedLen + 32);

        assembly {
            mstore(result, encodedLen)

            let tablePtr := add(table, 1)

            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            let resultPtr := add(result, 32)

            for {} lt(dataPtr, endPtr) {}
            {
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

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

        return result;
    }
}

library StringUtilities {

    bytes1 private constant CHAR_0 = bytes1('0');
    bytes1 private constant CHAR_A = bytes1('A');
    bytes1 private constant CHAR_a = bytes1('a');
    bytes1 private constant CHAR_f = bytes1('f');

    bytes  internal constant BASE64_DECODER_DATA = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                                   hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                                   hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                                   hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function isEmpty(string memory test) internal pure returns (bool) {
        return equals(test, "");
    }

    function equals(string memory a, string memory b) internal pure returns(bool) {
        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
    }

    function toLowerCase(string memory str) internal pure returns(string memory) {
        bytes memory bStr = bytes(str);
        for (uint256 i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
        }
        return string(bStr);
    }

    function asBytes(string memory str) internal pure returns(bytes memory toDecode) {
        bytes memory data = abi.encodePacked(str);
        if(data.length == 0 || data[0] != "0" || (data[1] != "x" && data[1] != "X")) {
            return "";
        }
        uint256 start = 2;
        toDecode = new bytes((data.length - 2) / 2);

        for(uint256 i = 0; i < toDecode.length; i++) {
            toDecode[i] = bytes1(_fromHexChar(uint8(data[start++])) + _fromHexChar(uint8(data[start++])) * 16);
        }
    }

    function toBase64(string memory input) internal pure returns(string memory) {
        return BytesUtilities.toBase64(abi.encodePacked(input));
    }

    function fromBase64(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        bytes memory table = BASE64_DECODER_DATA;

        uint256 decodedLen = (data.length / 4) * 3;

        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            mstore(result, decodedLen)

            let tablePtr := add(table, 1)

            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            let resultPtr := add(result, 32)

            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }

    function _fromHexChar(uint8 c) private pure returns (uint8) {
        bytes1 charc = bytes1(c);
        return charc < CHAR_0 || charc > CHAR_f ? 0 : (charc < CHAR_A ? 0 : 10) + c - uint8(charc < CHAR_A ? CHAR_0 : charc < CHAR_a ? CHAR_A : CHAR_a);
    }
}

library Uint256Utilities {
    function asSingletonArray(uint256 n) internal pure returns(uint256[] memory array) {
        array = new uint256[](1);
        array[0] = n;
    }

    function toHex(uint256 _i) internal pure returns (string memory) {
        return BytesUtilities.toString(abi.encodePacked(_i));
    }

    function toString(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function sum(uint256[] memory arr) internal pure returns (uint256 result) {
        for(uint256 i = 0; i < arr.length; i++) {
            result += arr[i];
        }
    }
}

library AddressUtilities {
    function asSingletonArray(address a) internal pure returns(address[] memory array) {
        array = new address[](1);
        array[0] = a;
    }

    function toString(address _addr) internal pure returns (string memory) {
        return _addr == address(0) ? "0x0000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(_addr));
    }
}

library Bytes32Utilities {

    function asSingletonArray(bytes32 a) internal pure returns(bytes32[] memory array) {
        array = new bytes32[](1);
        array[0] = a;
    }

    function toString(bytes32 bt) internal pure returns (string memory) {
        return bt == bytes32(0) ?  "0x0000000000000000000000000000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(bt));
    }
}

library TransferUtilities {
    using ReflectionUtilities for address;

    function balanceOf(address erc20TokenAddress, address account) internal view returns(uint256) {
        if(erc20TokenAddress == address(0)) {
            return account.balance;
        }
        return abi.decode(erc20TokenAddress.read(abi.encodeWithSelector(IERC20(erc20TokenAddress).balanceOf.selector, account)), (uint256));
    }

    function allowance(address erc20TokenAddress, address account, address spender) internal view returns(uint256) {
        if(erc20TokenAddress == address(0)) {
            return 0;
        }
        return abi.decode(erc20TokenAddress.read(abi.encodeWithSelector(IERC20(erc20TokenAddress).allowance.selector, account, spender)), (uint256));
    }

    function safeApprove(address erc20TokenAddress, address spender, uint256 value) internal {
        bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).approve.selector, spender, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'APPROVE_FAILED');
    }

    function safeTransfer(address erc20TokenAddress, address to, uint256 value) internal {
        if(value == 0) {
            return;
        }
        if(erc20TokenAddress == address(0)) {
            to.submit(value, "");
            return;
        }
        bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).transfer.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED');
    }

    function safeTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) internal {
        if(value == 0) {
            return;
        }
        if(erc20TokenAddress == address(0)) {
            to.submit(value, "");
            return;
        }
        bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).transferFrom.selector, from, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED');
    }
}
// File: @openzeppelin/contracts/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: @openzeppelin/contracts/token/ERC1155/IERC1155.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol



pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @ethereansos/swissknife/contracts/generic/model/ILazyInitCapableElement.sol


pragma solidity >=0.7.0;


interface ILazyInitCapableElement is IERC165 {

    function lazyInit(bytes calldata lazyInitData) external returns(bytes memory initResponse);
    function initializer() external view returns(address);

    event Host(address indexed from, address indexed to);

    function host() external view returns(address);
    function setHost(address newValue) external returns(address oldValue);

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) external view returns(bool);
}
// File: @ethereansos/swissknife/contracts/generic/impl/LazyInitCapableElement.sol


pragma solidity >=0.7.0;



abstract contract LazyInitCapableElement is ILazyInitCapableElement {
    using ReflectionUtilities for address;

    address public override initializer;
    address public override host;

    constructor(bytes memory lazyInitData) {
        if(lazyInitData.length > 0) {
            _privateLazyInit(lazyInitData);
        }
    }

    function lazyInit(bytes calldata lazyInitData) override external returns (bytes memory lazyInitResponse) {
        return _privateLazyInit(lazyInitData);
    }

    function supportsInterface(bytes4 interfaceId) override external view returns(bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == this.supportsInterface.selector ||
            interfaceId == type(ILazyInitCapableElement).interfaceId ||
            interfaceId == this.lazyInit.selector ||
            interfaceId == this.initializer.selector ||
            interfaceId == this.subjectIsAuthorizedFor.selector ||
            interfaceId == this.host.selector ||
            interfaceId == this.setHost.selector ||
            _supportsInterface(interfaceId);
    }

    function setHost(address newValue) external override authorizedOnly returns(address oldValue) {
        oldValue = host;
        host = newValue;
        emit Host(oldValue, newValue);
    }

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) public override virtual view returns(bool) {
        (bool chidlElementValidationIsConsistent, bool chidlElementValidationResult) = _subjectIsAuthorizedFor(subject, location, selector, payload, value);
        if(chidlElementValidationIsConsistent) {
            return chidlElementValidationResult;
        }
        if(subject == host) {
            return true;
        }
        if(!host.isContract()) {
            return false;
        }
        (bool result, bytes memory resultData) = host.staticcall(abi.encodeWithSelector(ILazyInitCapableElement(host).subjectIsAuthorizedFor.selector, subject, location, selector, payload, value));
        return result && abi.decode(resultData, (bool));
    }

    function _privateLazyInit(bytes memory lazyInitData) private returns (bytes memory lazyInitResponse) {
        require(initializer == address(0), "init");
        initializer = msg.sender;
        (host, lazyInitResponse) = abi.decode(lazyInitData, (address, bytes));
        emit Host(address(0), host);
        lazyInitResponse = _lazyInit(lazyInitResponse);
    }

    function _lazyInit(bytes memory) internal virtual returns (bytes memory) {
        return "";
    }

    function _supportsInterface(bytes4 selector) internal virtual view returns (bool);

    function _subjectIsAuthorizedFor(address, address, bytes4, bytes calldata, uint256) internal virtual view returns(bool, bool) {
    }

    modifier authorizedOnly {
        require(_authorizedOnly(), "unauthorized");
        _;
    }

    function _authorizedOnly() internal returns(bool) {
        return subjectIsAuthorizedFor(msg.sender, address(this), msg.sig, msg.data, msg.value);
    }
}
// File: @ethereansos/swissknife/contracts/dynamicMetadata/model/IDynamicMetadataCapableElement.sol

//SPDX-License-Identifier: MIT
pragma solidity >=0.7.0;


interface IDynamicMetadataCapableElement is ILazyInitCapableElement {

    function uri() external view returns(string memory);
    function plainUri() external view returns(string memory);

    function setUri(string calldata newValue) external returns (string memory oldValue);

    function dynamicUriResolver() external view returns(address);
    function setDynamicUriResolver(address newValue) external returns(address oldValue);
}
// File: contracts/core/model/IOrganization.sol


pragma solidity >=0.7.0;


interface IOrganization is IDynamicMetadataCapableElement {

    struct Component {
        bytes32 key;
        address location;
        bool active;
        bool log;
    }

    function keyOf(address componentAddress) external view returns(bytes32);
    function history(bytes32 key) external view returns(address[] memory componentsAddresses);
    function batchHistory(bytes32[] calldata keys) external view returns(address[][] memory componentsAddresses);

    function get(bytes32 key) external view returns(address componentAddress);
    function list(bytes32[] calldata keys) external view returns(address[] memory componentsAddresses);
    function isActive(address subject) external view returns(bool);
    function keyIsActive(bytes32 key) external view returns(bool);

    function set(Component calldata) external returns(address replacedComponentAddress);
    function batchSet(Component[] calldata) external returns (address[] memory replacedComponentAddresses);

    event ComponentSet(bytes32 indexed key, address indexed from, address indexed to, bool active);

    function submit(address location, bytes calldata payload, address restReceiver) external payable returns(bytes memory response);
}
// File: contracts/base/model/IProposalsManager.sol


pragma solidity >=0.7.0;



interface IProposalsManager is IERC1155Receiver, ILazyInitCapableElement {

    struct ProposalCode {
        address location;
        bytes bytecode;
    }

    struct ProposalCodes {
        ProposalCode[] codes;
        bool alsoTerminate;
    }

    struct Proposal {
        address proposer;
        address[] codeSequence;
        uint256 creationBlock;
        uint256 accept;
        uint256 refuse;
        address triggeringRules;
        address[] canTerminateAddresses;
        address[] validatorsAddresses;
        bool validationPassed;
        uint256 terminationBlock;
        bytes votingTokens;
    }

    struct ProposalConfiguration {
        address[] collections;
        uint256[] objectIds;
        uint256[] weights;
        address creationRules;
        address triggeringRules;
        address[] canTerminateAddresses;
        address[] validatorsAddresses;
    }

    function batchCreate(ProposalCodes[] calldata codeSequences) external returns(bytes32[] memory createdProposalIds);

    function list(bytes32[] calldata proposalIds) external view returns(Proposal[] memory);

    function votes(bytes32[] calldata proposalIds, address[] calldata voters, bytes32[][] calldata items) external view returns(uint256[][] memory accepts, uint256[][] memory refuses, uint256[][] memory toWithdraw);
    function weight(bytes32 code) external view returns(uint256);

    function vote(address erc20TokenAddress, bytes memory permitSignature, bytes32 proposalId, uint256 accept, uint256 refuse, address voter, bool alsoTerminate) external payable;
    function batchVote(bytes[] calldata data) external payable;

    function withdrawAll(bytes32[] memory proposalIds, address voterOrReceiver, bool afterTermination) external;

    function terminate(bytes32[] calldata proposalIds) external;

    function configuration() external view returns(ProposalConfiguration memory);
    function setConfiguration(ProposalConfiguration calldata newValue) external returns(ProposalConfiguration memory oldValue);

    function lastProposalId() external view returns(bytes32);

    function lastVoteBlock(address voter) external view returns (uint256);

    event ProposalCreated(address indexed proposer, address indexed code, bytes32 indexed proposalId);
    event ProposalWeight(bytes32 indexed proposalId, address indexed collection, uint256 indexed id, bytes32 key, uint256 weight);
    event ProposalTerminated(bytes32 indexed proposalId, bool result, bytes errorData);

    event Accept(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event MoveToAccept(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event RetireAccept(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);

    event Refuse(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event MoveToRefuse(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event RetireRefuse(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
}

interface IProposalChecker {
    function check(address proposalsManagerAddress, bytes32 id, bytes calldata data, address from, address voter) external view returns(bool);
}

interface IExternalProposalsManagerCommands {
    function createProposalCodeSequence(bytes32 proposalId, IProposalsManager.ProposalCode[] memory codeSequenceInput, address sender) external returns (address[] memory codeSequence, IProposalsManager.ProposalConfiguration memory localConfiguration);
    function proposalCanBeFinalized(bytes32 proposalId, IProposalsManager.Proposal memory proposal, bool validationPassed, bool result) external view returns (bool);
    function isVotable(bytes32 proposalId, IProposalsManager.Proposal memory proposal, address from, address voter, bool voteOrWithtraw) external view returns (bytes memory response);
}
// File: contracts/base/impl/ProposalsManager.sol


pragma solidity >=0.7.0;







library ProposalsManagerLibrary {
    using ReflectionUtilities for address;

    function createCodeSequence(IProposalsManager.ProposalCode[] memory codeSequenceInput) external returns (address[] memory codeSequence) {
        require(codeSequenceInput.length > 0, "code");
        codeSequence = new address[](codeSequenceInput.length);
        for(uint256 i = 0; i < codeSequenceInput.length; i++) {
            address code = codeSequenceInput[i].location;
            bytes memory bytecode = codeSequenceInput[i].bytecode;
            if(bytecode.length > 0) {
                assembly {
                    code := create(0, add(bytecode, 0x20), mload(bytecode))
                }
            }
            codeSequence[i] = code;
            bool isContract;
            assembly {
                isContract := not(iszero(extcodesize(code)))
            }
            require(isContract, "code");
        }
    }

    function giveBack(address[] memory collections, uint256[] memory objectIds, uint256[] memory accepts, uint256[] memory refuses, address receiver) external returns (bool almostOne) {
        for(uint256 i = 0; i < collections.length; i++) {
            uint256 amount = accepts[i] + refuses[i];
            if(amount == 0) {
                continue;
            }
            if(collections[i] != address(0)) {
                collections[i].submit(0, abi.encodeWithSelector(IERC1155(address(0)).safeTransferFrom.selector, address(this), receiver, objectIds[i], amount, ""));
            } else {
                _safeTransferOrTransferFrom(address(uint160(objectIds[i])), address(0), receiver, amount);
            }
            almostOne = true;
        }
    }

    function safeTransferOrTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) external {
        _safeTransferOrTransferFrom(erc20TokenAddress, from, to, value);
    }

    function _safeTransferOrTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) private {
        if(value == 0) {
            return;
        }
        if(erc20TokenAddress == address(0)) {
            if(from != address(0)) {
                return;
            }
            to.submit(value, "");
            return;
        }
        bytes memory returnData = erc20TokenAddress.submit(0, from == address(0) ? abi.encodeWithSelector(IERC20(address(0)).transfer.selector, to, value) : abi.encodeWithSelector(IERC20(address(0)).transferFrom.selector, from, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)));
    }

    function setConfiguration(IProposalsManager.ProposalConfiguration storage _configuration, IProposalsManager.ProposalConfiguration memory newValue) external returns(IProposalsManager.ProposalConfiguration memory oldValue) {
        oldValue = _configuration;
        require(newValue.collections.length == newValue.objectIds.length && newValue.collections.length == newValue.weights.length, "lengths");
        _configuration.collections = newValue.collections;
        _configuration.objectIds = newValue.objectIds;
        _configuration.weights = newValue.weights;
        _configuration.creationRules = newValue.creationRules;
        _configuration.triggeringRules = newValue.triggeringRules;
        _configuration.canTerminateAddresses = newValue.canTerminateAddresses;
        _configuration.validatorsAddresses = newValue.validatorsAddresses;
    }

    function performAuthorizedCall(address host, bytes32 key, address subject, bytes memory inputData) external {
        IOrganization organization = IOrganization(host);
        organization.set(IOrganization.Component(key, subject, true, false));
        (bool result, bytes memory returnData) = subject.call(inputData);
        if(!result) {
            returnData = abi.encode(subject, returnData);
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
        if(organization.isActive(subject)) {
            organization.set(IOrganization.Component(key, address(0), false, false));
        }
    }
}

contract ProposalsManager is IProposalsManager, LazyInitCapableElement {
    using ReflectionUtilities for address;

    mapping(bytes32 => Proposal) private _proposal;
    mapping(bytes32 => uint256) public override weight;

    // Mapping for proposalId => address => item => weighted accept votes
    mapping(bytes32 => mapping(address => mapping(bytes32 => uint256))) private _accept;

    // Mapping for proposalId => address => item => weighted refuse votes
    mapping(bytes32 => mapping(address => mapping(bytes32 => uint256))) private _refuse;

    // If the address has withdrawed or not the given objectId
    mapping(bytes32 => mapping(address => mapping(bytes32 => uint256))) private _toWithdraw;

    ProposalConfiguration private _configuration;

    uint256 private _keyIndex;

    bool private _hostIsProposalCommand;

    bytes32 public override lastProposalId;

    mapping(address => uint256) public override lastVoteBlock;

    constructor(bytes memory lazyInitData) LazyInitCapableElement(lazyInitData) {
    }

    function _lazyInit(bytes memory lazyInitData) internal override returns(bytes memory) {
        (_hostIsProposalCommand, lazyInitData) = abi.decode(lazyInitData, (bool, bytes));
        if(lazyInitData.length > 0) {
            ProposalsManagerLibrary.setConfiguration(_configuration, abi.decode(lazyInitData, (ProposalConfiguration)));
        }
        return "";
    }

    function _supportsInterface(bytes4 interfaceId) internal override pure returns(bool) {
        return
            interfaceId == type(IProposalsManager).interfaceId ||
            interfaceId == type(IERC1155Receiver).interfaceId;
    }

    bytes32[] private _toTerminate;

    function batchCreate(ProposalCodes[] calldata proposalCodesArray) external override returns(bytes32[] memory createdProposalIds) {
        createdProposalIds = new bytes32[](proposalCodesArray.length);
        ProposalConfiguration memory standardConfiguration = _configuration;
        for(uint256 i = 0; i < proposalCodesArray.length; i++) {
            ProposalCodes memory proposalCodes = proposalCodesArray[i];
            bytes32 proposalId = createdProposalIds[i] = lastProposalId = _randomKey();
            if(proposalCodes.alsoTerminate) {
                _toTerminate.push(proposalId);
            }
            (address[] memory codeSequence, ProposalConfiguration memory localConfiguration) =
            _hostIsProposalCommand ? IExternalProposalsManagerCommands(host).createProposalCodeSequence(proposalId, proposalCodes.codes, msg.sender) :
            (ProposalsManagerLibrary.createCodeSequence(proposalCodes.codes), standardConfiguration);
            (address[] memory collections, uint256[] memory objectIds, uint256[] memory weights) = (
                localConfiguration.collections.length > 0 ? localConfiguration.collections : standardConfiguration.collections,
                localConfiguration.objectIds.length > 0 ? localConfiguration.objectIds : standardConfiguration.objectIds,
                localConfiguration.weights.length > 0 ? localConfiguration.weights : standardConfiguration.weights
            );
            for(uint256 z = 0; z < collections.length; z++) {
                bytes32 key = keccak256(abi.encodePacked(proposalId, collections[z], objectIds[z]));
                emit ProposalWeight(proposalId, collections[z], objectIds[z], key, weight[key] = weights[z]);
            }
            (bool result, bytes memory response) = _validateRules(localConfiguration.creationRules != address(0) ? localConfiguration.creationRules : standardConfiguration.creationRules, proposalId, abi.encode(_proposal[proposalId] = Proposal(
                msg.sender,
                codeSequence,
                block.number,
                0,
                0,
                localConfiguration.triggeringRules != address(0) ? localConfiguration.triggeringRules : standardConfiguration.triggeringRules,
                localConfiguration.canTerminateAddresses.length > 0 ? localConfiguration.canTerminateAddresses : standardConfiguration.canTerminateAddresses,
                localConfiguration.validatorsAddresses.length > 0 ? localConfiguration.validatorsAddresses : standardConfiguration.validatorsAddresses,
                false,
                0,
                abi.encode(collections, objectIds, weights)
            )), msg.sender);
            if(!result) {
                if(response.length > 0) {
                    assembly {
                        revert(add(response, 0x20), mload(response))
                    }
                } else {
                    revert("creation");
                }
            }
            for(uint256 z = 0; z < codeSequence.length; z++) {
                emit ProposalCreated(msg.sender, codeSequence[z], proposalId);
            }
        }
        bytes32[] memory toTerminate = _toTerminate;
        delete _toTerminate;
        if(toTerminate.length > 0) {
            terminate(toTerminate);
        }
    }

    function list(bytes32[] calldata proposalIds) external override view returns(Proposal[] memory proposals) {
        proposals = new Proposal[](proposalIds.length);
        for(uint256 i = 0; i < proposalIds.length; i++) {
            proposals[i] = _proposal[proposalIds[i]];
        }
    }

    function votes(bytes32[] calldata proposalIds, address[] calldata voters, bytes32[][] calldata items) external override view returns(uint256[][] memory accepts, uint256[][] memory refuses, uint256[][] memory toWithdraw) {
        accepts = new uint256[][](proposalIds.length);
        refuses = new uint256[][](proposalIds.length);
        toWithdraw = new uint256[][](proposalIds.length);
        for(uint256 i = 0; i < proposalIds.length; i++) {
            accepts[i] = new uint256[](items[i].length);
            refuses[i] = new uint256[](items[i].length);
            toWithdraw[i] = new uint256[](items[i].length);
            for(uint256 z = 0; z < items[i].length; z++) {
                accepts[i][z] = _accept[proposalIds[i]][voters[i]][items[i][z]];
                refuses[i][z] = _refuse[proposalIds[i]][voters[i]][items[i][z]];
                toWithdraw[i][z] = _toWithdraw[proposalIds[i]][voters[i]][items[i][z]];
            }
        }
    }

    function onERC1155Received(address operator, address from, uint256 objectId, uint256 amount, bytes calldata data) external override returns(bytes4) {
        if(operator != address(this) || data.length > 0) {
            _onItemReceived(from, objectId, amount, data);
        }
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address operator, address from, uint256[] calldata objectIds, uint256[] calldata amounts, bytes calldata data) external override returns (bytes4) {
        if(operator != address(this) || data.length > 0) {
            bytes[] memory dataArray = abi.decode(data, (bytes[]));
            for(uint256 i = 0; i < objectIds.length; i++) {
                _onItemReceived(from, objectIds[i], amounts[i], dataArray[i]);
            }
        }
        return this.onERC1155BatchReceived.selector;
    }

    function vote(address erc20TokenAddress, bytes memory permitSignature, bytes32 proposalId, uint256 accept, uint256 refuse, address voter, bool alsoTerminate) public override payable {
        if(permitSignature.length > 0) {
            (uint8 v, bytes32 r, bytes32 s, uint256 deadline) = abi.decode(permitSignature, (uint8, bytes32, bytes32, uint256));
            IERC20Permit(erc20TokenAddress).permit(msg.sender, address(this), (accept + refuse), deadline, v, r, s);
        }
        uint256 transferedValue = _safeTransferFrom(erc20TokenAddress, (accept + refuse));
        require(erc20TokenAddress != address(0) || transferedValue == msg.value, "ETH");
        _vote(msg.sender, address(0), uint160(erc20TokenAddress), transferedValue, proposalId, accept, refuse, voter, alsoTerminate);
    }

    function batchVote(bytes[] calldata data) external override payable {
        for(uint256 i = 0; i < data.length; i++) {
            (address erc20TokenAddress, bytes memory permitSignature, bytes32 proposalId, uint256 accept, uint256 refuse, address voter, bool alsoTerminate) = abi.decode(data[i], (address, bytes, bytes32, uint256, uint256, address, bool));
            vote(erc20TokenAddress, permitSignature, proposalId, accept, refuse, voter, alsoTerminate);
        }
    }

    function withdrawAll(bytes32[] memory proposalIds, address voterOrReceiver, bool afterTermination) external override {
        bool almostOne = false;
        address voter = msg.sender;
        address receiver = voterOrReceiver != address(0) ? voterOrReceiver : msg.sender;
        if(afterTermination) {
            require(voterOrReceiver != address(0), "Mandatory");
            voter = voterOrReceiver;
            receiver = voterOrReceiver;
        }
        for(uint256 z = 0; z < proposalIds.length; z++) {
            bytes32 proposalId = proposalIds[z];
            (bool canVote, address[] memory collections, uint256[] memory objectIds, uint256[] memory accepts, uint256[] memory refuses) = _withdrawAll(proposalId, afterTermination ? voter : msg.sender, voter);
            require(canVote ? !afterTermination : afterTermination, "termination switch");
            bool result = ProposalsManagerLibrary.giveBack(collections, objectIds, accepts, refuses, receiver);
            almostOne = almostOne || result;
        }
        require(almostOne, "No transfers");
    }

    function terminate(bytes32[] memory proposalIds) public override {
        for(uint256 i = 0; i < proposalIds.length; i++) {
            Proposal storage proposal = _proposal[proposalIds[i]];
            require(proposal.terminationBlock == 0, "terminated");
            require(proposal.validationPassed || _mustStopAtFirst(true, proposal.canTerminateAddresses, proposalIds[i], msg.sender, msg.sender), "Cannot Terminate");
            if(!proposal.validationPassed) {
                if(_mustStopAtFirst(false, proposal.validatorsAddresses, proposalIds[i], msg.sender, msg.sender)) {
                    _finalizeTermination(proposalIds[i], proposal, false, false);
                    emit ProposalTerminated(proposalIds[i], false, "");
                    continue;
                }
            }
            (bool result, bytes memory errorData) = address(this).call(abi.encodeWithSelector(this.tryExecute.selector, proposal.codeSequence, abi.encodeWithSelector(0xe751f271, proposalIds[i]), new bytes[](0)));//execute(bytes32)
            if(result && errorData.length == 0) {
                (result, ) = _validateRules(proposal.triggeringRules, proposalIds[i], abi.encode(proposal), msg.sender);
                errorData = result ? errorData : bytes("triggering");
            }
            _finalizeTermination(proposalIds[i], proposal, true, result && errorData.length == 0);
            emit ProposalTerminated(proposalIds[i], result, errorData);
        }
    }

    function tryExecute(address[] memory codeSequence, bytes memory inputData, bytes[] memory bytecodes) external {
        require(msg.sender == address(this));
        for(uint256 i = 0; i < codeSequence.length; i++) {
            address codeLocation = codeSequence[i];
            if(i < bytecodes.length && bytecodes[i].length > 0) {
                require(codeSequence[i] == address(0), "codeLocation");
                bytes memory bytecode = bytecodes[i];
                uint256 codeSize;
                assembly {
                    codeLocation := create(0, add(bytecode, 0x20), mload(bytecode))
                    codeSize := extcodesize(codeLocation)
                }
                require(codeLocation != address(0), "codeLocation");
                require(codeSize > 0, "codeSize");
            }
            ProposalsManagerLibrary.performAuthorizedCall(host, _randomKey(), codeLocation, inputData);
        }
    }

    function configuration() external override view returns(ProposalConfiguration memory) {
        return _configuration;
    }

    function setConfiguration(ProposalConfiguration calldata newValue) external override authorizedOnly returns(ProposalConfiguration memory oldValue) {
        return ProposalsManagerLibrary.setConfiguration(_configuration, newValue);
    }

    function _onItemReceived(address from, uint256 objectId, uint256 amount, bytes memory data) private {
        (bytes32 proposalId, uint256 accept, uint256 refuse, address voter, bool alsoTterminate) = abi.decode(data, (bytes32, uint256, uint256, address, bool));
        _vote(from, msg.sender, objectId, amount, proposalId, accept, refuse, voter, alsoTterminate);
    }

    function _vote(address from, address collection, uint256 objectId, uint256 amount, bytes32 proposalId, uint256 accept, uint256 refuse, address voterInput, bool alsoTterminate) private {
        if(amount == 0) {
            return;
        }
        require(amount == (accept + refuse), "amount");
        address voter = voterInput == address(0) ? from : voterInput;
        _ensure(proposalId, from, voter, true);
        bytes32 item = keccak256(abi.encodePacked(proposalId, collection, objectId));
        uint256 proposalWeight = weight[item];
        require(proposalWeight > 0, "item");
        _toWithdraw[proposalId][voter][item] += (accept + refuse);
        if(accept > 0) {
            _accept[proposalId][voter][item] += accept;
            _proposal[proposalId].accept += (accept * proposalWeight);
            emit Accept(proposalId, voter, item, accept);
        }
        if(refuse > 0) {
            _refuse[proposalId][voter][item] += refuse;
            _proposal[proposalId].refuse += (refuse * proposalWeight);
            emit Refuse(proposalId, voter, item, refuse);
        }
        if(accept > 0 || refuse > 0) {
            lastVoteBlock[voter] = block.number;
        }
        if(alsoTterminate) {
            bytes32[] memory proposalIds = new bytes32[](1);
            proposalIds[0] = proposalId;
            terminate(proposalIds);
        }
    }

    function _ensure(bytes32 proposalId, address from, address voter, bool voteOrWithtraw) private view returns (bool canVote) {
        Proposal memory proposal = _proposal[proposalId];
        require(proposal.creationBlock > 0, "proposal");
        if(_hostIsProposalCommand) {
            bytes memory response = IExternalProposalsManagerCommands(host).isVotable(proposalId, proposal, from, voter, voteOrWithtraw);
            if(response.length > 0) {
                return abi.decode(response, (bool));
            }
        }
        bool isTerminated;
        canVote = !(isTerminated = proposal.terminationBlock != 0) && !proposal.validationPassed && !_mustStopAtFirst(true, proposal.canTerminateAddresses, proposalId, from, voter);
        if(voteOrWithtraw) {
            require(canVote, "vote");
        } else {
            require(block.number > lastVoteBlock[voter], "wait 1 block");
            require(!isTerminated || _proposal[proposalId].terminationBlock < block.number, "early");
        }
    }

    function _mustStopAtFirst(bool value, address[] memory checkers, bytes32 proposalId, address from, address voter) private view returns(bool) {
        if(checkers.length == 0 || (checkers.length == 1 && checkers[0] == address(0))) {
            return value;
        }
        Proposal memory proposal = _proposal[proposalId];
        bytes memory inputData = abi.encodeWithSelector(IProposalChecker(address(0)).check.selector, address(this), proposalId, abi.encode(proposal), from, voter);
        for(uint256 i = 0; i < checkers.length; i++) {
            (bool result, bytes memory response) = checkers[i].staticcall(inputData);
            if((!result || abi.decode(response, (bool))) == value) {
                return true;
            }
        }
        return false;
    }

    function _validateRules(address rulesToValidate, bytes32 key, bytes memory payload, address sender) private returns(bool result, bytes memory response) {
        if(rulesToValidate == address(0)) {
            return (true, "");
        }
        (result, response) = rulesToValidate.call(abi.encodeWithSelector(IProposalChecker(address(0)).check.selector, address(this), key, payload, sender, sender));
        if(result) {
            result = abi.decode(response, (bool));
            response = "";
        }
    }

    function _finalizeTermination(bytes32 proposalId, Proposal storage proposal, bool validationPassed, bool result) internal virtual {
        proposal.validationPassed = validationPassed;
        if(_hostIsProposalCommand) {
            proposal.terminationBlock = IExternalProposalsManagerCommands(host).proposalCanBeFinalized(proposalId, proposal, validationPassed, result) ? block.number : proposal.terminationBlock;
            return;
        }
        proposal.terminationBlock = !validationPassed || result ? block.number : proposal.terminationBlock;
    }

    function _safeTransferFrom(address erc20TokenAddress, uint256 value) private returns(uint256) {
        if(erc20TokenAddress == address(0)) {
            return value;
        }
        uint256 previousBalance = IERC20(erc20TokenAddress).balanceOf(address(this));
        ProposalsManagerLibrary.safeTransferOrTransferFrom(erc20TokenAddress, msg.sender, address(this), value);
        uint256 actualBalance = IERC20(erc20TokenAddress).balanceOf(address(this));
        require(actualBalance > previousBalance);
        require(actualBalance - previousBalance == value, "unsupported");
        return actualBalance - previousBalance;
    }

    function _randomKey() private returns (bytes32) {
        return keccak256(abi.encode(_keyIndex++, block.timestamp, block.number, tx.origin, tx.gasprice, block.coinbase, block.difficulty, msg.sender, blockhash(block.number - 5)));
    }

    function _withdrawAll(bytes32 proposalId, address sender, address voter) private returns(bool canVote, address[] memory collections, uint256[] memory objectIds, uint256[] memory accepts, uint256[] memory refuses) {
        canVote = _ensure(proposalId, sender, voter, false);
        Proposal storage proposal = _proposal[proposalId];
        require(!canVote || block.number > proposal.creationBlock, "Cannot withdraw during creation");
        (collections, objectIds,) = abi.decode(proposal.votingTokens, (address[], uint256[], uint256[]));
        accepts = new uint256[](collections.length);
        refuses = new uint256[](collections.length);
        for(uint256 i = 0; i < collections.length; i++) {
            (accepts[i], refuses[i]) = _singleWithdraw(proposal, proposalId, collections[i], objectIds[i], voter, canVote);
        }
    }

    function _singleWithdraw(Proposal storage proposal, bytes32 proposalId, address collection, uint256 objectId, address voter, bool canVote) private returns(uint256 accept, uint256 refuse) {
        bytes32 item = keccak256(abi.encodePacked(proposalId, collection, objectId));
        uint256 proposalWeight = weight[item];
        require(proposalWeight > 0, "item");
        accept = _accept[proposalId][voter][item];
        refuse = _refuse[proposalId][voter][item];
        require(_toWithdraw[proposalId][voter][item] >= (accept + refuse), "amount");
        if(accept > 0) {
            _toWithdraw[proposalId][voter][item] -= accept;
            if(canVote) {
                _accept[proposalId][voter][item] -= accept;
                proposal.accept -= (accept * proposalWeight);
                emit RetireAccept(proposalId, voter, item, accept);
            }
        }
        if(refuse > 0) {
            _toWithdraw[proposalId][voter][item] -= refuse;
            if(canVote) {
                _refuse[proposalId][voter][item] -= refuse;
                proposal.refuse -= (refuse * proposalWeight);
                emit RetireRefuse(proposalId, voter, item, refuse);
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"bytes32","name":"item","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Accept","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Host","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"bytes32","name":"item","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MoveToAccept","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"bytes32","name":"item","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MoveToRefuse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"address","name":"code","type":"address"},{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"},{"indexed":false,"internalType":"bytes","name":"errorData","type":"bytes"}],"name":"ProposalTerminated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"ProposalWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"bytes32","name":"item","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refuse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"bytes32","name":"item","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RetireAccept","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"bytes32","name":"item","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RetireRefuse","type":"event"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"location","type":"address"},{"internalType":"bytes","name":"bytecode","type":"bytes"}],"internalType":"struct IProposalsManager.ProposalCode[]","name":"codes","type":"tuple[]"},{"internalType":"bool","name":"alsoTerminate","type":"bool"}],"internalType":"struct IProposalsManager.ProposalCodes[]","name":"proposalCodesArray","type":"tuple[]"}],"name":"batchCreate","outputs":[{"internalType":"bytes32[]","name":"createdProposalIds","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"batchVote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"configuration","outputs":[{"components":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"address","name":"creationRules","type":"address"},{"internalType":"address","name":"triggeringRules","type":"address"},{"internalType":"address[]","name":"canTerminateAddresses","type":"address[]"},{"internalType":"address[]","name":"validatorsAddresses","type":"address[]"}],"internalType":"struct IProposalsManager.ProposalConfiguration","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"host","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProposalId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastVoteBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"name":"lazyInit","outputs":[{"internalType":"bytes","name":"lazyInitResponse","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proposalIds","type":"bytes32[]"}],"name":"list","outputs":[{"components":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"address[]","name":"codeSequence","type":"address[]"},{"internalType":"uint256","name":"creationBlock","type":"uint256"},{"internalType":"uint256","name":"accept","type":"uint256"},{"internalType":"uint256","name":"refuse","type":"uint256"},{"internalType":"address","name":"triggeringRules","type":"address"},{"internalType":"address[]","name":"canTerminateAddresses","type":"address[]"},{"internalType":"address[]","name":"validatorsAddresses","type":"address[]"},{"internalType":"bool","name":"validationPassed","type":"bool"},{"internalType":"uint256","name":"terminationBlock","type":"uint256"},{"internalType":"bytes","name":"votingTokens","type":"bytes"}],"internalType":"struct IProposalsManager.Proposal[]","name":"proposals","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"address","name":"creationRules","type":"address"},{"internalType":"address","name":"triggeringRules","type":"address"},{"internalType":"address[]","name":"canTerminateAddresses","type":"address[]"},{"internalType":"address[]","name":"validatorsAddresses","type":"address[]"}],"internalType":"struct IProposalsManager.ProposalConfiguration","name":"newValue","type":"tuple"}],"name":"setConfiguration","outputs":[{"components":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"objectIds","type":"uint256[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"address","name":"creationRules","type":"address"},{"internalType":"address","name":"triggeringRules","type":"address"},{"internalType":"address[]","name":"canTerminateAddresses","type":"address[]"},{"internalType":"address[]","name":"validatorsAddresses","type":"address[]"}],"internalType":"struct IProposalsManager.ProposalConfiguration","name":"oldValue","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setHost","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"address","name":"location","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"subjectIsAuthorizedFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proposalIds","type":"bytes32[]"}],"name":"terminate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"codeSequence","type":"address[]"},{"internalType":"bytes","name":"inputData","type":"bytes"},{"internalType":"bytes[]","name":"bytecodes","type":"bytes[]"}],"name":"tryExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20TokenAddress","type":"address"},{"internalType":"bytes","name":"permitSignature","type":"bytes"},{"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"internalType":"uint256","name":"accept","type":"uint256"},{"internalType":"uint256","name":"refuse","type":"uint256"},{"internalType":"address","name":"voter","type":"address"},{"internalType":"bool","name":"alsoTerminate","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proposalIds","type":"bytes32[]"},{"internalType":"address[]","name":"voters","type":"address[]"},{"internalType":"bytes32[][]","name":"items","type":"bytes32[][]"}],"name":"votes","outputs":[{"internalType":"uint256[][]","name":"accepts","type":"uint256[][]"},{"internalType":"uint256[][]","name":"refuses","type":"uint256[][]"},{"internalType":"uint256[][]","name":"toWithdraw","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"weight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proposalIds","type":"bytes32[]"},{"internalType":"address","name":"voterOrReceiver","type":"address"},{"internalType":"bool","name":"afterTermination","type":"bool"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x60806040526004361061012a5760003560e01c80639ce110d7116100ab578063daa9ee5f1161006f578063daa9ee5f14610393578063e810f78a146103a6578063f1488db2146103d3578063f23a6e61146103f3578063f437bc5914610413578063fad847231461043357600080fd5b80639ce110d7146102b5578063a2d1d4a6146102ed578063bc197c811461031a578063c85e0be214610353578063cd6e1d7c1461037357600080fd5b80633d0d364f116100f25780633d0d364f14610210578063457f4bcc1461023d5780636c70bee91461026a57806374cb30411461028c57806395ff44ee146102a257600080fd5b806301ffc9a71461012f5780630965fccf146101645780630d48f9b1146101935780631f5eea9e146101b55780633aac6f37146101f0575b600080fd5b34801561013b57600080fd5b5061014f61014a366004614d16565b610453565b60405190151581526020015b60405180910390f35b34801561017057600080fd5b5061018461017f366004614b19565b61053b565b60405161015b93929190615497565b34801561019f57600080fd5b506101b36101ae366004614ba0565b610b06565b005b3480156101c157600080fd5b506101e26101d0366004614628565b60116020526000908152604090205481565b60405190815260200161015b565b3480156101fc57600080fd5b506101b361020b366004614bd4565b610fdd565b34801561021c57600080fd5b5061023061022b366004614ad8565b6111e6565b60405161015b9190615591565b34801561024957600080fd5b5061025d610258366004614d31565b611551565b60405161015b9190615715565b34801561027657600080fd5b5061027f611599565b60405161015b9190615728565b34801561029857600080fd5b506101e260105481565b6101b36102b0366004614695565b6117ac565b3480156102c157600080fd5b506000546102d5906001600160a01b031681565b6040516001600160a01b03909116815260200161015b565b3480156102f957600080fd5b5061030d610308366004614ad8565b611900565b60405161015b91906154d0565b34801561032657600080fd5b5061033a610335366004614728565b612240565b6040516001600160e01b0319909116815260200161015b565b34801561035f57600080fd5b506102d561036e366004614628565b6122f8565b34801561037f57600080fd5b5061014f61038e3660046147e6565b612391565b6101b36103a1366004614ad8565b6124c2565b3480156103b257600080fd5b506101e26103c1366004614ca6565b60036020526000908152604090205481565b3480156103df57600080fd5b506101b36103ee36600461499d565b612545565b3480156103ff57600080fd5b5061033a61040e366004614867565b612760565b34801561041f57600080fd5b506001546102d5906001600160a01b031681565b34801561043f57600080fd5b5061027f61044e366004614d9a565b6127d3565b60006001600160e01b031982166301ffc9a760e01b148061048457506001600160e01b031982166301ffc9a760e01b145b8061049f57506001600160e01b03198216630a267c7760e21b145b806104ba57506001600160e01b0319821663115fd2f360e21b145b806104d557506001600160e01b03198216639ce110d760e01b145b806104f057506001600160e01b0319821663335b875f60e21b145b8061050b57506001600160e01b0319821663f437bc5960e01b145b8061052657506001600160e01b0319821663642f05f160e11b145b806105355750610535826128b1565b92915050565b60608080876001600160401b0381111561055757610557615dac565b60405190808252806020026020018201604052801561058a57816020015b60608152602001906001900390816105755790505b509250876001600160401b038111156105a5576105a5615dac565b6040519080825280602002602001820160405280156105d857816020015b60608152602001906001900390816105c35790505b509150876001600160401b038111156105f3576105f3615dac565b60405190808252806020026020018201604052801561062657816020015b60608152602001906001900390816106115790505b50905060005b88811015610af95785858281811061064657610646615d96565b905060200281019061065891906159ee565b90506001600160401b0381111561067157610671615dac565b60405190808252806020026020018201604052801561069a578160200160208202803683370190505b508482815181106106ad576106ad615d96565b60200260200101819052508585828181106106ca576106ca615d96565b90506020028101906106dc91906159ee565b90506001600160401b038111156106f5576106f5615dac565b60405190808252806020026020018201604052801561071e578160200160208202803683370190505b5083828151811061073157610731615d96565b602002602001018190525085858281811061074e5761074e615d96565b905060200281019061076091906159ee565b90506001600160401b0381111561077957610779615dac565b6040519080825280602002602001820160405280156107a2578160200160208202803683370190505b508282815181106107b5576107b5615d96565b602002602001018190525060005b8686838181106107d5576107d5615d96565b90506020028101906107e791906159ee565b9050811015610ae657600460008c8c8581811061080657610806615d96565b90506020020135815260200190815260200160002060008a8a8581811061082f5761082f615d96565b90506020020160208101906108449190614628565b6001600160a01b03166001600160a01b03168152602001908152602001600020600088888581811061087857610878615d96565b905060200281019061088a91906159ee565b8481811061089a5761089a615d96565b905060200201358152602001908152602001600020548583815181106108c2576108c2615d96565b602002602001015182815181106108db576108db615d96565b602002602001018181525050600560008c8c858181106108fd576108fd615d96565b90506020020135815260200190815260200160002060008a8a8581811061092657610926615d96565b905060200201602081019061093b9190614628565b6001600160a01b03166001600160a01b03168152602001908152602001600020600088888581811061096f5761096f615d96565b905060200281019061098191906159ee565b8481811061099157610991615d96565b905060200201358152602001908152602001600020548483815181106109b9576109b9615d96565b602002602001015182815181106109d2576109d2615d96565b602002602001018181525050600660008c8c858181106109f4576109f4615d96565b90506020020135815260200190815260200160002060008a8a85818110610a1d57610a1d615d96565b9050602002016020810190610a329190614628565b6001600160a01b03166001600160a01b031681526020019081526020016000206000888885818110610a6657610a66615d96565b9050602002810190610a7891906159ee565b84818110610a8857610a88615d96565b90506020020135815260200190815260200160002054838381518110610ab057610ab0615d96565b60200260200101518281518110610ac957610ac9615d96565b602090810291909101015280610ade81615d65565b9150506107c3565b5080610af181615d65565b91505061062c565b5096509650969350505050565b60005b8151811015610fd957600060026000848481518110610b2a57610b2a615d96565b6020026020010151815260200190815260200160002090508060090154600014610b885760405162461bcd60e51b815260206004820152600a6024820152691d195c9b5a5b985d195960b21b60448201526064015b60405180910390fd5b600881015460ff1680610c195750610c19600182600601805480602002602001604051908101604052809291908181526020018280548015610bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bd5575b5050505050858581518110610c0a57610c0a615d96565b602002602001015133336128e7565b610c585760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f74205465726d696e61746560801b6044820152606401610b7f565b600881015460ff16610d6c57610cd6600082600701805480602002602001604051908101604052809291908181526020018280548015610bf3576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610bd5575050505050858581518110610c0a57610c0a615d96565b15610d6c57610d01838381518110610cf057610cf0615d96565b602002602001015182600080612cdc565b828281518110610d1357610d13615d96565b60200260200101517fea8d23697cddc291c214d54db7928726143782387871b1e28261af4c168405456000604051610d5e911515815260406020820181905260009082015260600190565b60405180910390a250610fc7565b600080306001600160a01b031663f1488db260e01b8460010163e751f271888881518110610d9c57610d9c615d96565b6020026020010151604051602401610db691815260200190565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b94909417909352805160008082529381019091529091610e0c565b6060815260200190600190039081610df75790505b50604051602401610e1f93929190615410565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610e5d919061527a565b6000604051808303816000865af19150503d8060008114610e9a576040519150601f19603f3d011682016040523d82523d6000602084013e610e9f565b606091505b5091509150818015610eb057508051155b15610f3f5760058301548551610f0a916001600160a01b031690879087908110610edc57610edc615d96565b602002602001015185604051602001610ef591906159db565b60405160208183030381529060405233612dbc565b50915081610f3a576040518060400160405280600a81526020016974726967676572696e6760b01b815250610f3c565b805b90505b610f70858581518110610f5457610f54615d96565b6020026020010151846001858015610f6b57508451155b612cdc565b848481518110610f8257610f82615d96565b60200260200101517fea8d23697cddc291c214d54db7928726143782387871b1e28261af4c168405458383604051610fbb9291906155f3565b60405180910390a25050505b80610fd181615d65565b915050610b09565b5050565b600033816001600160a01b038516610ff55733610ff7565b845b90508315611047576001600160a01b0385166110415760405162461bcd60e51b81526020600482015260096024820152684d616e6461746f727960b81b6044820152606401610b7f565b50839050805b60005b86518110156111a157600087828151811061106757611067615d96565b602002602001015190506000806000806000611090868c611088573361108a565b8a5b8b612ed0565b94509450945094509450846110a5578a6110a8565b8a155b6110e95760405162461bcd60e51b81526020600482015260126024820152710e8cae4dad2dcc2e8d2dedc40e6eed2e8c6d60731b6044820152606401610b7f565b600073985061f05da5284b985d156f29de9fbb91f26ea963e9fe4d4e868686868e6040518663ffffffff1660e01b815260040161112a9594939291906153a8565b60206040518083038186803b15801561114257600080fd5b505af4158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190614c6b565b90508a806111855750805b9a5050505050505050808061119990615d65565b91505061104a565b50826111de5760405162461bcd60e51b815260206004820152600c60248201526b4e6f207472616e736665727360a01b6044820152606401610b7f565b505050505050565b6060816001600160401b0381111561120057611200615dac565b6040519080825280602002602001820160405280156112a257816020015b61128f60405180610160016040528060006001600160a01b031681526020016060815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001606081526020016060815260200160001515815260200160008152602001606081525090565b81526020019060019003908161121e5790505b50905060005b8281101561154a57600260008585848181106112c6576112c6615d96565b6020908102929092013583525081810192909252604090810160002081516101608101835281546001600160a01b03168152600182018054845181870281018701909552808552919492938584019390929083018282801561135157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611333575b505050505081526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016006820180548060200260200160405190810160405280929190818152602001828054801561140057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113e2575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561146257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611444575b5050509183525050600882015460ff161515602082015260098201546040820152600a8201805460609092019161149890615d2a565b80601f01602080910402602001604051908101604052809291908181526020018280546114c490615d2a565b80156115115780601f106114e657610100808354040283529160200191611511565b820191906000526020600020905b8154815290600101906020018083116114f457829003601f168201915b50505050508152505082828151811061152c5761152c615d96565b6020026020010181905250808061154290615d65565b9150506112a8565b5092915050565b606061159283838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061312792505050565b9392505050565b6115a16140a4565b6040805160078054610100602082028401810190945260e083018181529293919284929091849184018282801561160157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115e3575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561165957602002820191906000526020600020905b815481526020019060010190808311611645575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156116b157602002820191906000526020600020905b81548152602001906001019080831161169d575b505050918352505060038201546001600160a01b039081166020808401919091526004840154909116604080840191909152600584018054825181850281018501909352808352606090940193919290919083018282801561173c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161171e575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561179e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611780575b505050505081525050905090565b85511561187c57600080600080898060200190518101906117cd9190614e21565b93509350935093508a6001600160a01b031663d505accf33308a8c6117f29190615b9f565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064810184905260ff8716608482015260a4810186905260c4810185905260e401600060405180830381600087803b15801561185f57600080fd5b505af1158015611873573d6000803e3d6000fd5b50505050505050505b60006118918861188c8688615b9f565b6131e9565b90506001600160a01b0388161515806118a957503481145b6118db5760405162461bcd60e51b815260206004820152600360248201526208aa8960eb1b6044820152606401610b7f565b6118f63360008a6001600160a01b0316848a8a8a8a8a6133d3565b5050505050505050565b6060816001600160401b0381111561191a5761191a615dac565b604051908082528060200260200182016040528015611943578160200160208202803683370190505b509050600060076040518060e0016040529081600082018054806020026020016040519081016040528092919081815260200182805480156119ae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611990575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a0657602002820191906000526020600020905b8154815260200190600101908083116119f2575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611a5e57602002820191906000526020600020905b815481526020019060010190808311611a4a575b505050918352505060038201546001600160a01b0390811660208084019190915260048401549091166040808401919091526005840180548251818502810185019093528083526060909401939192909190830182828015611ae957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611acb575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611b4b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b2d575b505050505081525050905060005b838110156121c4576000858583818110611b7557611b75615d96565b9050602002810190611b879190615a7d565b611b9090615bed565b90506000611b9c613713565b6010819055858481518110611bb357611bb3615d96565b60200260200101818152509050816020015115611c0057601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444018190555b600f54600090819060ff16611ca157835160405163848f181360e01b815273985061f05da5284b985d156f29de9fbb91f26ea99163848f181391611c479190600401615514565b60006040518083038186803b158015611c5f57600080fd5b505af4158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b91908101906148e2565b86611d2c565b60015484516040516322c18a8560e21b81526001600160a01b0390921691638b062a1491611cd691879190339060040161560e565b600060405180830381600087803b158015611cf057600080fd5b505af1158015611d04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2c9190810190614a7f565b9150915060008060008084600001515111611d48578851611d4b565b83515b600085602001515111611d62578960200151611d68565b84602001515b600086604001515111611d7f578a60400151611d85565b85604001515b92509250925060005b8351811015611ead57600087858381518110611dac57611dac615d96565b6020026020010151858481518110611dc657611dc6615d96565b6020026020010151604051602001611de093929190615252565b604051602081830303815290604052805190602001209050838281518110611e0a57611e0a615d96565b6020026020010151858381518110611e2457611e24615d96565b60200260200101516001600160a01b0316897feee91718330cc4e1608ffa4c52b7d8a1beadb05baa971bb060a69a00f686177684878781518110611e6a57611e6a615d96565b6020908102919091018101516000888152600383526040908190208290558051938452918301520160405180910390a45080611ea581615d65565b915050611d8e565b506000806120e460006001600160a01b031687606001516001600160a01b03161415611edd578b60600151611ee3565b86606001515b89604051806101600160405280336001600160a01b031681526020018b8152602001438152602001600081526020016000815260200160006001600160a01b03168b608001516001600160a01b03161415611f42578f60800151611f48565b8a608001515b6001600160a01b0316815260200160008b60a001515111611f6d578f60a00151611f73565b8a60a001515b815260200160008b60c001515111611f8f578f60c00151611f95565b8a60c001515b815260200160001515815260200160008152602001898989604051602001611fbf9392919061536f565b60408051808303601f19018152918152915260008d815260026020908152919020825181546001600160a01b0319166001600160a01b039091161781558282015180519192612016926001850192909101906140f3565b5060408201516002820155606082015160038201556080820151600482015560a08201516005820180546001600160a01b0319166001600160a01b0390921691909117905560c082015180516120769160068401916020909101906140f3565b5060e082015180516120929160078401916020909101906140f3565b5061010082015160088201805460ff1916911515919091179055610120820151600982015561014082015180516120d391600a840191602090910190614158565b50604051610ef592506020016159db565b915091508161212f578051156120fc57805160208201fd5b60405162461bcd60e51b815260206004820152600860248201526731b932b0ba34b7b760c11b6044820152606401610b7f565b60005b87518110156121a7578888828151811061214e5761214e615d96565b60200260200101516001600160a01b0316336001600160a01b03167fb43403c8185341c35046287720ea7090861bc088942d59d2652eca70e2e7ae8360405160405180910390a48061219f81615d65565b915050612132565b5050505050505050505080806121bc90615d65565b915050611b59565b506000601280548060200260200160405190810160405280929190818152602001828054801561221357602002820191906000526020600020905b8154815260200190600101908083116121ff575b505050505090506012600061222891906141cc565b8051156122385761223881610b06565b505092915050565b60006001600160a01b0389163014158061225957508115155b156122e357600061226c83850185614c37565b905060005b878110156122e0576122ce8a8a8a8481811061228f5761228f615d96565b905060200201358989858181106122a8576122a8615d96565b905060200201358585815181106122c1576122c1615d96565b60200260200101516137a5565b806122d881615d65565b915050612271565b50505b5063bc197c8160e01b98975050505050505050565b60006123026137dc565b61233d5760405162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b6044820152606401610b7f565b50600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e436990600090a3919050565b600080806001546001600160a01b038a8116911614156123b6576001925050506124b8565b6001546123cb906001600160a01b03166137fe565b6123da576000925050506124b8565b60015460405160009182916001600160a01b039091169063335b875f60e21b90612412908e908e908e908e908e908e90602401615296565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612450919061527a565b600060405180830381855afa9150503d806000811461248b576040519150601f19603f3d011682016040523d82523d6000602084013e612490565b606091505b50915091508180156124b15750808060200190518101906124b19190614c6b565b9450505050505b9695505050505050565b60005b818110156125405760008060008060008060008989898181106124ea576124ea615d96565b90506020028101906124fc9190615a37565b8101906125099190614695565b9650965096509650965096509650612526878787878787876117ac565b50505050505050808061253890615d65565b9150506124c5565b505050565b33301461255157600080fd5b60005b835181101561275a57600084828151811061257157612571615d96565b602002602001015190508251821080156125a55750600083838151811061259a5761259a615d96565b602002602001015151115b156126c55760006001600160a01b03168583815181106125c7576125c7615d96565b60200260200101516001600160a01b0316146126145760405162461bcd60e51b815260206004820152600c60248201526b31b7b232a637b1b0ba34b7b760a11b6044820152606401610b7f565b600083838151811061262857612628615d96565b6020026020010151905060008151602083016000f0925050813b6001600160a01b0383166126875760405162461bcd60e51b815260206004820152600c60248201526b31b7b232a637b1b0ba34b7b760a11b6044820152606401610b7f565b600081116126c25760405162461bcd60e51b8152602060048201526008602482015267636f646553697a6560c01b6044820152606401610b7f565b50505b60015473985061f05da5284b985d156f29de9fbb91f26ea99063eeded78f906001600160a01b03166126f5613713565b84886040518563ffffffff1660e01b815260040161271694939291906152fa565b60006040518083038186803b15801561272e57600080fd5b505af4158015612742573d6000803e3d6000fd5b5050505050808061275290615d65565b915050612554565b50505050565b60006001600160a01b0387163014158061277957508115155b156127c0576127c086868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506137a592505050565b5063f23a6e6160e01b9695505050505050565b6127db6140a4565b6127e36137dc565b61281e5760405162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b6044820152606401610b7f565b6040516322fb7c8b60e21b815273985061f05da5284b985d156f29de9fbb91f26ea990638bedf22c906128589060079086906004016157e9565b60006040518083038186803b15801561287057600080fd5b505af4158015612884573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105359190810190614dd4565b919050565b60006001600160e01b03198216637d937b4760e11b148061053557506001600160e01b03198216630271189760e51b1492915050565b6000845160001480612931575084516001148015612931575060006001600160a01b03168560008151811061291e5761291e615d96565b60200260200101516001600160a01b0316145b1561293d575084612cd3565b600084815260026020908152604080832081516101608101835281546001600160a01b0316815260018201805484518187028101870190955280855291949293858401939092908301828280156129bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161299f575b505050505081526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a6c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a4e575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612ace57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ab0575b5050509183525050600882015460ff161515602082015260098201546040820152600a82018054606090920191612b0490615d2a565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3090615d2a565b8015612b7d5780601f10612b5257610100808354040283529160200191612b7d565b820191906000526020600020905b815481529060010190602001808311612b6057829003601f168201915b50505050508152505090506000638fb242fa60e01b308784604051602001612ba591906159c8565b60408051601f1981840301815290829052612bc89392918a908a9060240161532d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060005b8751811015612ccb57600080898381518110612c1d57612c1d615d96565b60200260200101516001600160a01b031684604051612c3c919061527a565b600060405180830381855afa9150503d8060008114612c77576040519150601f19603f3d011682016040523d82523d6000602084013e612c7c565b606091505b50915091508a1515821580612ca0575081806020019051810190612ca09190614c6b565b15151415612cb657600195505050505050612cd3565b50508080612cc390615d65565b915050612bff565b506000925050505b95945050505050565b60088301805460ff1916831515179055600f5460ff1615612d975760015460405163090be5e160e01b81526001600160a01b039091169063090be5e190612d2d9087908790879087906004016156e4565b60206040518083038186803b158015612d4557600080fd5b505afa158015612d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7d9190614c6b565b612d8b578260090154612d8d565b435b600984015561275a565b811580612da15750805b612daf578260090154612db1565b435b600984015550505050565b600060606001600160a01b038616612de7575050604080516020810190915260008152600190612ec7565b856001600160a01b0316638fb242fa60e01b3087878788604051602401612e1295949392919061532d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612e50919061527a565b6000604051808303816000865af19150503d8060008114612e8d576040519150601f19603f3d011682016040523d82523d6000602084013e612e92565b606091505b5090925090508115612ec75780806020019051810190612eb29190614c6b565b91506040518060200160405280600081525090505b94509492505050565b6000606080606080612ee5888888600061381d565b6000898152600260205260409020909550851580612f065750806002015443115b612f525760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420776974686472617720647572696e67206372656174696f6e006044820152606401610b7f565b80600a018054612f6190615d2a565b80601f0160208091040260200160405190810160405280929190818152602001828054612f8d90615d2a565b8015612fda5780601f10612faf57610100808354040283529160200191612fda565b820191906000526020600020905b815481529060010190602001808311612fbd57829003601f168201915b5050505050806020019051810190612ff29190614916565b50815191965094506001600160401b0381111561301157613011615dac565b60405190808252806020026020018201604052801561303a578160200160208202803683370190505b50925084516001600160401b0381111561305657613056615dac565b60405190808252806020026020018201604052801561307f578160200160208202803683370190505b50915060005b855181101561311a576130ce828b8884815181106130a5576130a5615d96565b60200260200101518885815181106130bf576130bf615d96565b60200260200101518c8c613c91565b8583815181106130e0576130e0615d96565b602002602001018584815181106130f9576130f9615d96565b6020908102919091010191909152528061311281615d65565b915050613085565b5050939792965093509350565b6000546060906001600160a01b03161561316c5760405162461bcd60e51b8152600401610b7f906020808252600490820152631a5b9a5d60e21b604082015260600190565b600080546001600160a01b0319163317905581516131939083016020908101908401614645565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a361053581613fbb565b60006001600160a01b038316613200575080610535565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561324257600080fd5b505afa158015613256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327a9190614e08565b60405163353a15f960e21b81526001600160a01b03861660048201523360248201523060448201526064810185905290915073985061f05da5284b985d156f29de9fbb91f26ea99063d4e857e49060840160006040518083038186803b1580156132e357600080fd5b505af41580156132f7573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03871691506370a082319060240160206040518083038186803b15801561333d57600080fd5b505afa158015613351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133759190614e08565b905081811161338357600080fd5b8361338e8383615bd6565b146133c95760405162461bcd60e51b815260206004820152600b60248201526a1d5b9cdd5c1c1bdc9d195960aa1b6044820152606401610b7f565b612cd38282615bd6565b856133dd57613708565b6133e78385615b9f565b861461341e5760405162461bcd60e51b8152602060048201526006602482015265185b5bdd5b9d60d21b6044820152606401610b7f565b60006001600160a01b038316156134355782613437565b895b9050613446868b83600161381d565b506000868a8a60405160200161345e93929190615252565b60408051601f19818403018152918152815160209283012060008181526003909352912054909150806134bc5760405162461bcd60e51b8152600401610b7f906020808252600490820152636974656d60e01b604082015260600190565b6134c68688615b9f565b60008981526006602090815260408083206001600160a01b0388168452825280832086845290915281208054909190613500908490615b9f565b909155505086156135c35760008881526004602090815260408083206001600160a01b0387168452825280832085845290915281208054899290613545908490615b9f565b9091555061355590508188615bb7565b60008981526002602052604081206003018054909190613576908490615b9f565b9250508190555081836001600160a01b0316897f8a4ac3c891b3fc74af51c217c613f685833edd07ae18ac484c248df04c2a4e258a6040516135ba91815260200190565b60405180910390a45b85156136815760008881526005602090815260408083206001600160a01b0387168452825280832085845290915281208054889290613603908490615b9f565b9091555061361390508187615bb7565b60008981526002602052604081206004018054909190613634908490615b9f565b9250508190555081836001600160a01b0316897f52155d6cba50a5e9f19105f56c99492c197afdb719fe08e7a1f212f9335bd39b8960405161367891815260200190565b60405180910390a45b60008711806136905750600086115b156136b1576001600160a01b03831660009081526011602052604090204390555b8315613704576040805160018082528183019092526000916020808301908036833701905050905088816000815181106136ed576136ed615d96565b60200260200101818152505061370281610b06565b505b5050505b505050505050505050565b600e80546000918261372483615d65565b909155504243323a41443361373a600587615bd6565b60408051602081019a909a5289019790975260608801959095526001600160a01b03938416608088015260a0870192909252821660c086015260e085015216610100830152406101208201526101400160405160208183030381529060405280519060200120905090565b6000806000806000858060200190518101906137c19190614cbf565b9450945094509450945061370889338a8a89898989896133d3565b60006137f933306000356001600160e01b03191660003634612391565b905090565b60006001600160a01b03821661381657506000919050565b503b151590565b600084815260026020908152604080832081516101608101835281546001600160a01b0316815260018201805484518187028101870190955280855286959294858401939092919083018282801561389e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613880575b505050505081526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016006820180548060200260200160405190810160405280929190818152602001828054801561394d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161392f575b50505050508152602001600782018054806020026020016040519081016040528092919081815260200182805480156139af57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613991575b5050509183525050600882015460ff161515602082015260098201546040820152600a820180546060909201916139e590615d2a565b80601f0160208091040260200160405190810160405280929190818152602001828054613a1190615d2a565b8015613a5e5780601f10613a3357610100808354040283529160200191613a5e565b820191906000526020600020905b815481529060010190602001808311613a4157829003601f168201915b50505050508152505090506000816040015111613aa85760405162461bcd60e51b81526020600482015260086024820152671c1c9bdc1bdcd85b60c21b6044820152606401610b7f565b600f5460ff1615613b6957600154604051633062773960e21b81526000916001600160a01b03169063c189dce490613aec908a9086908b908b908b906004016156a2565b60006040518083038186803b158015613b0457600080fd5b505afa158015613b18573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b409190810190614d66565b805190915015613b675780806020019051810190613b5e9190614c6b565b92505050613c89565b505b6101208101511580159081613b815750816101000151155b8015613b9c5750613b9a60018360c001518989896128e7565b155b92508315613bdf5782613bda5760405162461bcd60e51b8152600401610b7f90602080825260049082015263766f746560e01b604082015260600190565b613c86565b6001600160a01b0385166000908152601160205260409020544311613c355760405162461bcd60e51b815260206004820152600c60248201526b77616974203120626c6f636b60a01b6044820152606401610b7f565b801580613c52575060008781526002602052604090206009015443115b613c865760405162461bcd60e51b81526020600482015260056024820152646561726c7960d81b6044820152606401610b7f565b50505b949350505050565b6000806000878787604051602001613cab93929190615252565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915080613d095760405162461bcd60e51b8152600401610b7f906020808252600490820152636974656d60e01b604082015260600190565b60008981526004602090815260408083206001600160a01b038a168085529083528184208685528352818420548d855260058452828520918552908352818420868552909252909120549094509250613d628385615b9f565b60008a81526006602090815260408083206001600160a01b038b16845282528083208684529091529020541015613dc45760405162461bcd60e51b8152602060048201526006602482015265185b5bdd5b9d60d21b6044820152606401610b7f565b8315613eb95760008981526006602090815260408083206001600160a01b038a168452825280832085845290915281208054869290613e04908490615bd6565b90915550508415613eb95760008981526004602090815260408083206001600160a01b038a168452825280832085845290915281208054869290613e49908490615bd6565b90915550613e5990508185615bb7565b8a6003016000828254613e6c9190615bd6565b9250508190555081866001600160a01b03168a7feba0c24c9387c764048ce2f8a568b92295808addecddab7a118cc9b7c467d76387604051613eb091815260200190565b60405180910390a45b8215613fae5760008981526006602090815260408083206001600160a01b038a168452825280832085845290915281208054859290613ef9908490615bd6565b90915550508415613fae5760008981526005602090815260408083206001600160a01b038a168452825280832085845290915281208054859290613f3e908490615bd6565b90915550613f4e90508184615bb7565b8a6004016000828254613f619190615bd6565b9250508190555081866001600160a01b03168a7f7ff569269c52b52a364d8ec222e450373965e5d3691962a52623874b7102a7fe86604051613fa591815260200190565b60405180910390a45b5050965096945050505050565b606081806020019051810190613fd19190614c88565b600f805460ff1916921515929092179091558051909250156140905773985061f05da5284b985d156f29de9fbb91f26ea9638bedf22c60078480602001905181019061401d9190614dd4565b6040518363ffffffff1660e01b815260040161403a9291906158fe565b60006040518083038186803b15801561405257600080fd5b505af4158015614066573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261408e9190810190614dd4565b505b505060408051602081019091526000815290565b6040518060e0016040528060608152602001606081526020016060815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001606081525090565b828054828255906000526020600020908101928215614148579160200282015b8281111561414857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614113565b506141549291506141ed565b5090565b82805461416490615d2a565b90600052602060002090601f0160209004810192826141865760008555614148565b82601f1061419f57805160ff1916838001178555614148565b82800160010185558215614148579182015b828111156141485782518255916020019190600101906141b1565b50805460008255906000526020600020908101906141ea91906141ed565b50565b5b8082111561415457600081556001016141ee565b80356128ac81615dc2565b80516128ac81615dc2565b60008083601f84011261422a57600080fd5b5081356001600160401b0381111561424157600080fd5b6020830191508360208260051b850101111561425c57600080fd5b9250929050565b600082601f83011261427457600080fd5b8151602061428961428483615b0d565b615add565b80838252828201915082860187848660051b89010111156142a957600080fd5b60005b858110156142d15781516142bf81615dc2565b845292840192908401906001016142ac565b5090979650505050505050565b600082601f8301126142ef57600080fd5b813560206142ff61428483615b0d565b80838252828201915082860187848660051b890101111561431f57600080fd5b60005b858110156142d157813584529284019290840190600101614322565b600082601f83011261434f57600080fd5b8135602061435f61428483615b0d565b80838252828201915082860187848660051b890101111561437f57600080fd5b6000805b868110156143c15782356001600160401b038111156143a0578283fd5b6143ae8b88838d0101614493565b8652509385019391850191600101614383565b509198975050505050505050565b600082601f8301126143e057600080fd5b815160206143f061428483615b0d565b80838252828201915082860187848660051b890101111561441057600080fd5b60005b858110156142d157815184529284019290840190600101614413565b80356128ac81615dd7565b80356001600160e01b0319811681146128ac57600080fd5b60008083601f84011261446457600080fd5b5081356001600160401b0381111561447b57600080fd5b60208301915083602082850101111561425c57600080fd5b600082601f8301126144a457600080fd5b81356144b261428482615b30565b8181528460208386010111156144c757600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126144f557600080fd5b815161450361428482615b30565b81815284602083860101111561451857600080fd5b613c89826020830160208701615cfe565b600060e0828403121561453b57600080fd5b614543615a93565b905081516001600160401b038082111561455c57600080fd5b61456885838601614263565b8352602084015191508082111561457e57600080fd5b61458a858386016143cf565b602084015260408401519150808211156145a357600080fd5b6145af858386016143cf565b60408401526145c06060850161420d565b60608401526145d16080850161420d565b608084015260a08401519150808211156145ea57600080fd5b6145f685838601614263565b60a084015260c084015191508082111561460f57600080fd5b5061461c84828501614263565b60c08301525092915050565b60006020828403121561463a57600080fd5b813561159281615dc2565b6000806040838503121561465857600080fd5b825161466381615dc2565b60208401519092506001600160401b0381111561467f57600080fd5b61468b858286016144e4565b9150509250929050565b600080600080600080600060e0888a0312156146b057600080fd5b87356146bb81615dc2565b965060208801356001600160401b038111156146d657600080fd5b6146e28a828b01614493565b96505060408801359450606088013593506080880135925060a088013561470881615dc2565b915060c088013561471881615dd7565b8091505092959891949750929550565b60008060008060008060008060a0898b03121561474457600080fd5b883561474f81615dc2565b9750602089013561475f81615dc2565b965060408901356001600160401b038082111561477b57600080fd5b6147878c838d01614218565b909850965060608b01359150808211156147a057600080fd5b6147ac8c838d01614218565b909650945060808b01359150808211156147c557600080fd5b506147d28b828c01614452565b999c989b5096995094979396929594505050565b60008060008060008060a087890312156147ff57600080fd5b863561480a81615dc2565b9550602087013561481a81615dc2565b94506148286040880161443a565b935060608701356001600160401b0381111561484357600080fd5b61484f89828a01614452565b979a9699509497949695608090950135949350505050565b60008060008060008060a0878903121561488057600080fd5b863561488b81615dc2565b9550602087013561489b81615dc2565b9450604087013593506060870135925060808701356001600160401b038111156148c457600080fd5b6148d089828a01614452565b979a9699509497509295939492505050565b6000602082840312156148f457600080fd5b81516001600160401b0381111561490a57600080fd5b613c8984828501614263565b60008060006060848603121561492b57600080fd5b83516001600160401b038082111561494257600080fd5b61494e87838801614263565b9450602086015191508082111561496457600080fd5b614970878388016143cf565b9350604086015191508082111561498657600080fd5b50614993868287016143cf565b9150509250925092565b6000806000606084860312156149b257600080fd5b83356001600160401b03808211156149c957600080fd5b818601915086601f8301126149dd57600080fd5b813560206149ed61428483615b0d565b8083825282820191508286018b848660051b8901011115614a0d57600080fd5b600096505b84871015614a39578035614a2581615dc2565b835260019690960195918301918301614a12565b5097505087013592505080821115614a5057600080fd5b614a5c87838801614493565b93506040860135915080821115614a7257600080fd5b506149938682870161433e565b60008060408385031215614a9257600080fd5b82516001600160401b0380821115614aa957600080fd5b614ab586838701614263565b93506020850151915080821115614acb57600080fd5b5061468b85828601614529565b60008060208385031215614aeb57600080fd5b82356001600160401b03811115614b0157600080fd5b614b0d85828601614218565b90969095509350505050565b60008060008060008060608789031215614b3257600080fd5b86356001600160401b0380821115614b4957600080fd5b614b558a838b01614218565b90985096506020890135915080821115614b6e57600080fd5b614b7a8a838b01614218565b90965094506040890135915080821115614b9357600080fd5b506148d089828a01614218565b600060208284031215614bb257600080fd5b81356001600160401b03811115614bc857600080fd5b613c89848285016142de565b600080600060608486031215614be957600080fd5b83356001600160401b03811115614bff57600080fd5b614c0b868287016142de565b9350506020840135614c1c81615dc2565b91506040840135614c2c81615dd7565b809150509250925092565b600060208284031215614c4957600080fd5b81356001600160401b03811115614c5f57600080fd5b613c898482850161433e565b600060208284031215614c7d57600080fd5b815161159281615dd7565b60008060408385031215614c9b57600080fd5b825161466381615dd7565b600060208284031215614cb857600080fd5b5035919050565b600080600080600060a08688031215614cd757600080fd5b8551945060208601519350604086015192506060860151614cf781615dc2565b6080870151909250614d0881615dd7565b809150509295509295909350565b600060208284031215614d2857600080fd5b6115928261443a565b60008060208385031215614d4457600080fd5b82356001600160401b03811115614d5a57600080fd5b614b0d85828601614452565b600060208284031215614d7857600080fd5b81516001600160401b03811115614d8e57600080fd5b613c89848285016144e4565b600060208284031215614dac57600080fd5b81356001600160401b03811115614dc257600080fd5b820160e0818503121561159257600080fd5b600060208284031215614de657600080fd5b81516001600160401b03811115614dfc57600080fd5b613c8984828501614529565b600060208284031215614e1a57600080fd5b5051919050565b60008060008060808587031215614e3757600080fd5b845160ff81168114614e4857600080fd5b60208601516040870151606090970151919890975090945092505050565b8183526000602080850194508260005b85811015614ea4578135614e8981615dc2565b6001600160a01b031687529582019590820190600101614e76565b509495945050505050565b600081518084526020808501945080840160005b83811015614ea45781516001600160a01b031687529582019590820190600101614ec3565b6000815480845260208085019450836000528060002060005b83811015614ea45781546001600160a01b031687529582019560019182019101614f01565b6000815180845260208085019450848260051b860182860160005b858110156142d1578383038952614f59838351614fa1565b98850198925090840190600101614f41565b81835260006001600160fb1b03831115614f8457600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b83811015614ea457815187529582019590820190600101614fb5565b60008151808452614fe9816020860160208601615cfe565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061501757607f831692505b602080841082141561503957634e487b7160e01b600052602260045260246000fd5b83885260208801828015615054576001811461506557615090565b60ff19871682528282019750615090565b60008981526020902060005b8781101561508a57815484820152908601908401615071565b83019850505b5050505050505092915050565b80516001600160a01b03168252600061016060208301518160208601526150c682860182614eaf565b91505060408301516040850152606083015160608501526080830151608085015260a083015161510160a08601826001600160a01b03169052565b5060c083015184820360c08601526151198282614eaf565b91505060e083015184820360e08601526151338282614eaf565b9150506101008084015161514a8287018215159052565b5050610120838101519085015261014080840151858303828701526124b88382614fd1565b60006101606151968461518985546001600160a01b031690565b6001600160a01b03169052565b8060208501526151ab81850160018501614ee8565b90506002830154604085015260038301546060850152600483015460808501526151df60058401546001600160a01b031690565b6001600160a01b031660a085015283810360c08501526152028160068501614ee8565b905083810360e08501526152198160078501614ee8565b9050615229600884015460ff1690565b15156101008501526009830154610120850152838103610140850152613c8981600a8501614ffd565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6000825161528c818460208701615cfe565b9190910192915050565b6001600160a01b038781168252861660208201526001600160e01b03198516604082015260a06060820181905281018390526000838560c0840137600060c0858401015260c0601f19601f8601168301019050826080830152979650505050505050565b6001600160a01b03858116825260208201859052831660408201526080606082018190526000906124b890830184614fd1565b600060018060a01b03808816835286602084015260a0604084015261535560a0840187614fd1565b948116606084015292909216608090910152509392505050565b6060815260006153826060830186614eaf565b82810360208401526153948186614fa1565b905082810360408401526124b88185614fa1565b60a0815260006153bb60a0830188614eaf565b82810360208401526153cd8188614fa1565b905082810360408401526153e18187614fa1565b905082810360608401526153f58186614fa1565b91505060018060a01b03831660808301529695505050505050565b6060815260006154236060830186614ee8565b6020838203818501526154368287614fd1565b915083820360408501528185518084528284019150828160051b85010183880160005b8381101561548757601f19878403018552615475838351614fd1565b94860194925090850190600101615459565b50909a9950505050505050505050565b6060815260006154aa6060830186614f26565b82810360208401526154bc8186614f26565b905082810360408401526124b88185614f26565b6020808252825182820181905260009190848201906040850190845b81811015615508578351835292840192918401916001016154ec565b50909695505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561558357888303603f19018552815180516001600160a01b0316845287015187840187905261557087850182614fd1565b958801959350509086019060010161553b565b509098975050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156155e657603f198886030184526155d485835161509d565b945092850192908501906001016155b8565b5092979650505050505050565b8215158152604060208201526000613c896040830184614fd1565b600060608201858352602060608185015281865180845260808601915060808160051b870101935082880160005b8281101561568757878603607f19018452815180516001600160a01b03168752850151604086880181905261567381890183614fd1565b97505050928401929084019060010161563c565b505050506001600160a01b0385166040850152509050613c89565b85815260a0602082015260006156bb60a083018761509d565b6001600160a01b0395861660408401529390941660608201529015156080909101529392505050565b8481526080602082015260006156fd608083018661516f565b93151560408301525090151560609091015292915050565b6020815260006115926020830184614fd1565b602081526000825160e06020840152615745610100840182614eaf565b90506020840151601f19808584030160408601526157638383614fa1565b925060408601519150808584030160608601526157808383614fa1565b925060018060a01b036060870151166080860152608086015191506157b060a08601836001600160a01b03169052565b60a08601519150808584030160c08601526157cb8383614eaf565b925060c08601519150808584030160e086015250612cd38282614eaf565b8281526040602082015260006157ff8384615b57565b60e0604085015261581561012085018284614e66565b9150506158256020850185615b57565b603f198086850301606087015261583d848385614f6b565b935061584c6040880188615b57565b9350915080868503016080870152615865848484614f6b565b93506060870135925061587783615dc2565b6001600160a01b03831660a087015261589260808801614202565b6001600160a01b03811660c088015292506158b060a0880188615b57565b93509150808685030160e08701526158c9848484614e66565b93506158d860c0880188615b57565b935091508086850301610100870152506158f3838383614e66565b979650505050505050565b828152604060208201526000825160e06040840152615921610120840182614eaf565b90506020840151603f198085840301606086015261593f8383614fa1565b9250604086015191508085840301608086015261595c8383614fa1565b60608701516001600160a01b031660a08701526080870151909350915061598e60c08601836001600160a01b03169052565b60a08601519150808584030160e08601526159a98383614eaf565b925060c086015191508085840301610100860152506124b88282614eaf565b602081526000611592602083018461509d565b602081526000611592602083018461516f565b6000808335601e19843603018112615a0557600080fd5b8301803591506001600160401b03821115615a1f57600080fd5b6020019150600581901b360382131561425c57600080fd5b6000808335601e19843603018112615a4e57600080fd5b8301803591506001600160401b03821115615a6857600080fd5b60200191503681900382131561425c57600080fd5b60008235603e1983360301811261528c57600080fd5b60405160e081016001600160401b0381118282101715615ab557615ab5615dac565b60405290565b604080519081016001600160401b0381118282101715615ab557615ab5615dac565b604051601f8201601f191681016001600160401b0381118282101715615b0557615b05615dac565b604052919050565b60006001600160401b03821115615b2657615b26615dac565b5060051b60200190565b60006001600160401b03821115615b4957615b49615dac565b50601f01601f191660200190565b6000808335601e19843603018112615b6e57600080fd5b83016020810192503590506001600160401b03811115615b8d57600080fd5b8060051b360383131561425c57600080fd5b60008219821115615bb257615bb2615d80565b500190565b6000816000190483118215151615615bd157615bd1615d80565b500290565b600082821015615be857615be8615d80565b500390565b60006040808336031215615c0057600080fd5b615c08615abb565b83356001600160401b0380821115615c1f57600080fd5b9085019036601f830112615c3257600080fd5b81356020615c4261428483615b0d565b8281528181019085830136600586901b880185011115615c6157600080fd5b60005b85811015615cdf57813587811115615c7b57600080fd5b880136819003601f19018b1315615c9157600080fd5b615c99615abb565b86820135615ca681615dc2565b8152818c013589811115615cb957600080fd5b615cc7368983860101614493565b82890152508552509284019290840190600101615c64565b5050865250615cef88820161442f565b90850152509195945050505050565b60005b83811015615d19578181015183820152602001615d01565b8381111561275a5750506000910152565b600181811c90821680615d3e57607f821691505b60208210811415615d5f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615d7957615d79615d80565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146141ea57600080fd5b80151581146141ea57600080fdfea26469706673582212209a029d7fff6ca122242fdc548ecfa70a6ea9adaa0d6ef3916b3d9b7c38ef3e2964736f6c63430008060033

Libraries Used

ProposalsManagerLibrary : 0x985061f05da5284b985d156f29de9fbb91f26ea9Unverified

Deployed Bytecode Sourcemap

41676:20291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28631:629;;;;;;;;;;-1:-1:-1;28631:629:0;;;;;:::i;:::-;;:::i;:::-;;;40396:14:1;;40389:22;40371:41;;40359:2;40344:18;28631:629:0;;;;;;;;47082:974;;;;;;;;;;-1:-1:-1;47082:974:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;51370:1494::-;;;;;;;;;;-1:-1:-1;51370:1494:0;;;;;:::i;:::-;;:::i;:::-;;42584:57;;;;;;;;;;-1:-1:-1;42584:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41241:25:1;;;41229:2;41214:18;42584:57:0;41196:76:1;50261:1101:0;;;;;;;;;;-1:-1:-1;50261:1101:0;;;;;:::i;:::-;;:::i;46778:296::-;;;;;;;;;;-1:-1:-1;46778:296:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28462:161::-;;;;;;;;;;-1:-1:-1;28462:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53832:126::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42537:38::-;;;;;;;;;;;;;;;;48952:808;;;;;;:::i;:::-;;:::i;28233:35::-;;;;;;;;;;-1:-1:-1;28233:35:0;;;;-1:-1:-1;;;;;28233:35:0;;;;;;-1:-1:-1;;;;;30993:32:1;;;30975:51;;30963:2;30948:18;28233:35:0;30930:102:1;43414:3356:0;;;;;;;;;;-1:-1:-1;43414:3356:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48408:536::-;;;;;;;;;;-1:-1:-1;48408:536:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;44065:33:1;;;44047:52;;44035:2;44020:18;48408:536:0;44002:103:1;29268:194:0;;;;;;;;;;-1:-1:-1;29268:194:0;;;;;:::i;:::-;;:::i;29470:840::-;;;;;;;;;;-1:-1:-1;29470:840:0;;;;;:::i;:::-;;:::i;49768:485::-;;;;;;:::i;:::-;;:::i;41853:50::-;;;;;;;;;;-1:-1:-1;41853:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;52872:952;;;;;;;;;;-1:-1:-1;52872:952:0;;;;;:::i;:::-;;:::i;48064:336::-;;;;;;;;;;-1:-1:-1;48064:336:0;;;;;:::i;:::-;;:::i;28275:28::-;;;;;;;;;;-1:-1:-1;28275:28:0;;;;-1:-1:-1;;;;;28275:28:0;;;53966:239;;;;;;;;;;-1:-1:-1;53966:239:0;;;;;:::i;:::-;;:::i;28631:629::-;28709:4;-1:-1:-1;;;;;;28746:40:0;;-1:-1:-1;;;28746:40:0;;:103;;-1:-1:-1;;;;;;;28803:46:0;;-1:-1:-1;;;28803:46:0;28746:103;:176;;;-1:-1:-1;;;;;;;28866:56:0;;-1:-1:-1;;;28866:56:0;28746:176;:230;;;-1:-1:-1;;;;;;;28939:37:0;;-1:-1:-1;;;28939:37:0;28746:230;:287;;;-1:-1:-1;;;;;;;28993:40:0;;-1:-1:-1;;;28993:40:0;28746:287;:355;;;-1:-1:-1;;;;;;;29050:51:0;;-1:-1:-1;;;29050:51:0;28746:355;:405;;;-1:-1:-1;;;;;;;29118:33:0;;-1:-1:-1;;;29118:33:0;28746:405;:458;;;-1:-1:-1;;;;;;;29168:36:0;;-1:-1:-1;;;29168:36:0;28746:458;:506;;;;29221:31;29240:11;29221:18;:31::i;:::-;28726:526;28631:629;-1:-1:-1;;28631:629:0:o;47082:974::-;47215:26;;;47339:11;-1:-1:-1;;;;;47323:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47313:45:0;-1:-1:-1;47395:11:0;-1:-1:-1;;;;;47379:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47369:45:0;-1:-1:-1;47454:11:0;-1:-1:-1;;;;;47438:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47425:48;;47488:9;47484:565;47503:22;;;47484:565;;;47574:5;;47580:1;47574:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:15;;-1:-1:-1;;;;;47560:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47560:30:0;;47547:7;47555:1;47547:10;;;;;;;;:::i;:::-;;;;;;:43;;;;47632:5;;47638:1;47632:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:15;;-1:-1:-1;;;;;47618:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47618:30:0;;47605:7;47613:1;47605:10;;;;;;;;:::i;:::-;;;;;;:43;;;;47693:5;;47699:1;47693:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:15;;-1:-1:-1;;;;;47679:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47679:30:0;;47663:10;47674:1;47663:13;;;;;;;;:::i;:::-;;;;;;:46;;;;47728:9;47724:314;47747:5;;47753:1;47747:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:15;;47743:1;:19;47724:314;;;47804:7;:23;47812:11;;47824:1;47812:14;;;;;;;:::i;:::-;;;;;;;47804:23;;;;;;;;;;;:34;47828:6;;47835:1;47828:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47804:34:0;-1:-1:-1;;;;;47804:34:0;;;;;;;;;;;;:47;47839:5;;47845:1;47839:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;47848:1;47839:11;;;;;;;:::i;:::-;;;;;;;47804:47;;;;;;;;;;;;47788:7;47796:1;47788:10;;;;;;;;:::i;:::-;;;;;;;47799:1;47788:13;;;;;;;;:::i;:::-;;;;;;:63;;;;;47886:7;:23;47894:11;;47906:1;47894:14;;;;;;;:::i;:::-;;;;;;;47886:23;;;;;;;;;;;:34;47910:6;;47917:1;47910:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47886:34:0;-1:-1:-1;;;;;47886:34:0;;;;;;;;;;;;:47;47921:5;;47927:1;47921:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;47930:1;47921:11;;;;;;;:::i;:::-;;;;;;;47886:47;;;;;;;;;;;;47870:7;47878:1;47870:10;;;;;;;;:::i;:::-;;;;;;;47881:1;47870:13;;;;;;;;:::i;:::-;;;;;;:63;;;;;47971:11;:27;47983:11;;47995:1;47983:14;;;;;;;:::i;:::-;;;;;;;47971:27;;;;;;;;;;;:38;47999:6;;48006:1;47999:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47971:38:0;-1:-1:-1;;;;;47971:38:0;;;;;;;;;;;;:51;48010:5;;48016:1;48010:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;48019:1;48010:11;;;;;;;:::i;:::-;;;;;;;47971:51;;;;;;;;;;;;47952:10;47963:1;47952:13;;;;;;;;:::i;:::-;;;;;;;47966:1;47952:16;;;;;;;;:::i;:::-;;;;;;;;;;:70;47764:3;;;;:::i;:::-;;;;47724:314;;;-1:-1:-1;47527:3:0;;;;:::i;:::-;;;;47484:565;;;;47082:974;;;;;;;;;;:::o;51370:1494::-;51450:9;51446:1411;51469:11;:18;51465:1;:22;51446:1411;;;51509:25;51537:9;:25;51547:11;51559:1;51547:14;;;;;;;;:::i;:::-;;;;;;;51537:25;;;;;;;;;;;51509:53;;51585:8;:25;;;51614:1;51585:30;51577:53;;;;-1:-1:-1;;;51577:53:0;;49948:2:1;51577:53:0;;;49930:21:1;49987:2;49967:18;;;49960:30;-1:-1:-1;;;50006:18:1;;;49999:40;50056:18;;51577:53:0;;;;;;;;;51653:25;;;;;;;:123;;;51682:94;51699:4;51705:8;:30;;51682:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51682:94:0;;;;;;;;;;;;;;;;;;;;;51737:11;51749:1;51737:14;;;;;;;;:::i;:::-;;;;;;;51753:10;51765;51682:16;:94::i;:::-;51645:152;;;;-1:-1:-1;;;51645:152:0;;46217:2:1;51645:152:0;;;46199:21:1;46256:2;46236:18;;;46229:30;-1:-1:-1;;;46275:18:1;;;46268:46;46331:18;;51645:152:0;46189:166:1;51645:152:0;51816:25;;;;;;51812:370;;51865:93;51882:5;51889:8;:28;;51865:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51865:93:0;;;;;;;;;;;;;;;;;;;;51919:11;51931:1;51919:14;;;;;;;;:::i;51865:93::-;51862:305;;;51983:60;52004:11;52016:1;52004:14;;;;;;;;:::i;:::-;;;;;;;52020:8;52030:5;52037;51983:20;:60::i;:::-;52090:11;52102:1;52090:14;;;;;;;;:::i;:::-;;;;;;;52071:45;52106:5;52071:45;;;;40956:14:1;40949:22;40931:41;;41008:2;41003;40988:18;;40981:30;;;-1:-1:-1;41027:18:1;;;41020:29;41081:2;41066:18;;40921:169;52071:45:0;;;;;;;;52139:8;;;51862:305;52197:11;52210:22;52244:4;-1:-1:-1;;;;;52236:18:0;52278:24;;;52304:8;:21;;52350:10;52362:11;52374:1;52362:14;;;;;;;;:::i;:::-;;;;;;;52327:50;;;;;;41241:25:1;;41229:2;41214:18;;41196:76;52327:50:0;;;;-1:-1:-1;;52327:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52327:50:0;;;;;;;;;;;;;52379:14;;-1:-1:-1;52379:14:0;;;;;;;;;52327:50;;52379:14;;;;;;;;;;;;;;;;;;;;52255:139;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52255:139:0;;;;;;;;;;;;;;-1:-1:-1;;;;;52255:139:0;-1:-1:-1;;;;;;52255:139:0;;;;;;;;;;52236:159;;;;52255:139;52236:159;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52196:199;;;;52431:6;:31;;;;-1:-1:-1;52441:16:0;;:21;52431:31;52428:245;;;52511:24;;;;52537:14;;52496:90;;-1:-1:-1;;;;;52511:24:0;;52537:11;;52549:1;;52537:14;;;;;;:::i;:::-;;;;;;;52564:8;52553:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;52575:10;52496:14;:90::i;:::-;-1:-1:-1;52483:103:0;-1:-1:-1;52483:103:0;52617:40;;52638:19;;;;;;;;;;;;;-1:-1:-1;;;52638:19:0;;;52617:40;;;52626:9;52617:40;52605:52;;52428:245;52687:85;52708:11;52720:1;52708:14;;;;;;;;:::i;:::-;;;;;;;52724:8;52734:4;52740:6;:31;;;;-1:-1:-1;52750:16:0;;:21;52740:31;52687:20;:85::i;:::-;52811:11;52823:1;52811:14;;;;;;;;:::i;:::-;;;;;;;52792:53;52827:6;52835:9;52792:53;;;;;;;:::i;:::-;;;;;;;;51494:1363;;;51446:1411;51489:3;;;;:::i;:::-;;;;51446:1411;;;;51370:1494;:::o;50261:1101::-;50389:14;50438:10;50389:14;-1:-1:-1;;;;;50478:29:0;;:60;;50528:10;50478:60;;;50510:15;50478:60;50459:79;;50552:16;50549:178;;;-1:-1:-1;;;;;50593:29:0;;50585:51;;;;-1:-1:-1;;;50585:51:0;;47911:2:1;50585:51:0;;;47893:21:1;47950:1;47930:18;;;47923:29;-1:-1:-1;;;47968:18:1;;;47961:39;48017:18;;50585:51:0;47883:158:1;50585:51:0;-1:-1:-1;50659:15:0;;-1:-1:-1;50659:15:0;50549:178;50741:9;50737:573;50760:11;:18;50756:1;:22;50737:573;;;50800:18;50821:11;50833:1;50821:14;;;;;;;;:::i;:::-;;;;;;;50800:35;;50851:12;50865:28;50895:26;50923:24;50949;50977:70;50990:10;51002:16;:37;;51029:10;51002:37;;;51021:5;51002:37;51041:5;50977:12;:70::i;:::-;50850:197;;;;;;;;;;51070:7;:46;;51100:16;51070:46;;;51081:16;51080:17;51070:46;51062:77;;;;-1:-1:-1;;;51062:77:0;;45870:2:1;51062:77:0;;;45852:21:1;45909:2;45889:18;;;45882:30;-1:-1:-1;;;45928:18:1;;;45921:48;45986:18;;51062:77:0;45842:168:1;51062:77:0;51154:11;51168:23;:32;51201:11;51214:9;51225:7;51234;51243:8;51168:84;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51154:98;;51279:9;:19;;;;51292:6;51279:19;51267:31;;50785:525;;;;;;;50780:3;;;;;:::i;:::-;;;;50737:573;;;;51328:9;51320:34;;;;-1:-1:-1;;;51320:34:0;;50287:2:1;51320:34:0;;;50269:21:1;50326:2;50306:18;;;50299:30;-1:-1:-1;;;50345:18:1;;;50338:42;50397:18;;51320:34:0;50259:162:1;51320:34:0;50378:984;;;50261:1101;;;:::o;46778:296::-;46855:27;46922:11;-1:-1:-1;;;;;46907:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46907:34:0;;;;;;;;;;;;;;;;;46895:46;;46956:9;46952:115;46971:22;;;46952:115;;;47030:9;:25;47040:11;;47052:1;47040:14;;;;;;;:::i;:::-;;;;;;;;;;47030:25;;-1:-1:-1;47030:25:0;;;;;;;;;;;-1:-1:-1;47030:25:0;47015:40;;;;;;;;;-1:-1:-1;;;;;47015:40:0;;;;;;;;;;;;;;;;;;;;;;;;;47030:25;;47015:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47015:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47015:40:0;-1:-1:-1;;;;;47015:40:0;-1:-1:-1;;;;;47015:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47015:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47015:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;47015:40:0;;;-1:-1:-1;;47015:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;47025:1;47015:12;;;;;;;;:::i;:::-;;;;;;:40;;;;46995:3;;;;;:::i;:::-;;;;46952:115;;;;46778:296;;;;:::o;28462:161::-;28536:29;28585:30;28602:12;;28585:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28585:16:0;;-1:-1:-1;;;28585:30:0:i;:::-;28578:37;28462:161;-1:-1:-1;;;28462:161:0:o;53832:126::-;53888:28;;:::i;:::-;53929:21;;;53936:14;53929:21;;;;;;;;;;;;;;;;;;;;;53936:14;;53929:21;;;;53936:14;;53929:21;;53936:14;53929:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53929:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53929:21:0;;;-1:-1:-1;;53929:21:0;;;;-1:-1:-1;;;;;53929:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53929:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53929:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53832:126;:::o;48952:808::-;49148:22;;:26;49145:291;;49192:7;49201:9;49212;49223:16;49254:15;49243:63;;;;;;;;;;;;:::i;:::-;49191:115;;;;;;;;49334:17;-1:-1:-1;;;;;49321:38:0;;49360:10;49380:4;49397:6;49388;:15;;;;:::i;:::-;49321:103;;-1:-1:-1;;;;;;49321:103:0;;;;;;;-1:-1:-1;;;;;32637:15:1;;;49321:103:0;;;32619:34:1;32689:15;;;;32669:18;;;32662:43;32721:18;;;32714:34;32764:18;;;32757:34;;;32840:4;32828:17;;32807:19;;;32800:46;32862:19;;;32855:35;;;32906:19;;;32899:35;;;32553:19;;49321:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49176:260;;;;49145:291;49446:23;49472:55;49490:17;49510:15;49519:6;49510;:15;:::i;:::-;49472:17;:55::i;:::-;49446:81;-1:-1:-1;;;;;;49546:31:0;;;;;:63;;;49600:9;49581:15;:28;49546:63;49538:79;;;;-1:-1:-1;;;49538:79:0;;48940:2:1;49538:79:0;;;48922:21:1;48979:1;48959:18;;;48952:29;-1:-1:-1;;;48997:18:1;;;48990:33;49040:18;;49538:79:0;48912:152:1;49538:79:0;49628:124;49634:10;49654:1;49666:17;-1:-1:-1;;;;;49628:124:0;49686:15;49703:10;49715:6;49723;49731:5;49738:13;49628:5;:124::i;:::-;49134:626;48952:808;;;;;;;:::o;43414:3356::-;43506:35;43589:18;-1:-1:-1;;;;;43575:40:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43575:40:0;;43554:61;;43626:50;43679:14;43626:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43626:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43626:67:0;;;-1:-1:-1;;43626:67:0;;;;-1:-1:-1;;;;;43626:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43626:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43626:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;43708:9;43704:2889;43723:29;;;43704:2889;;;43774:34;43811:18;;43830:1;43811:21;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43774:58;;;:::i;:::-;;;43847:18;43909:12;:10;:12::i;:::-;43892:14;:29;;;43868:18;43887:1;43868:21;;;;;;;;:::i;:::-;;;;;;:53;;;;43847:74;;43939:13;:27;;;43936:96;;;43987:12;:29;;;;;;;-1:-1:-1;43987:29:0;;;;;;;;;43936:96;44142:22;;44047:29;;;;44142:22;;:240;;44338:19;;44295:63;;-1:-1:-1;;;44295:63:0;;:23;;:42;;:63;;44338:19;44295:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44295:63:0;;;;;;;;;;;;:::i;:::-;44360:21;44142:240;;;44201:4;;44246:19;;44167:111;;-1:-1:-1;;;44167:111:0;;-1:-1:-1;;;;;44201:4:0;;;;44167:66;;:111;;44234:10;;44246:19;44267:10;;44167:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44167:111:0;;;;;;;;;;;;:::i;:::-;44046:336;;;;44398:28;44428:26;44456:24;44543:1;44503:18;:30;;;:37;:41;:110;;44580:33;;44503:110;;;44547:30;;44503:110;44670:1;44632:18;:28;;;:35;:39;:104;;44705:21;:31;;;44632:104;;;44674:18;:28;;;44632:104;44791:1;44755:18;:26;;;:33;:37;:98;;44824:21;:29;;;44755:98;;;44795:18;:26;;;44755:98;44397:471;;;;;;44887:9;44883:277;44906:11;:18;44902:1;:22;44883:277;;;44950:11;44991:10;45003:11;45015:1;45003:14;;;;;;;;:::i;:::-;;;;;;;45019:9;45029:1;45019:12;;;;;;;;:::i;:::-;;;;;;;44974:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44964:69;;;;;;44950:83;;45100:9;45110:1;45100:12;;;;;;;;:::i;:::-;;;;;;;45084:11;45096:1;45084:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;45057:87:0;45072:10;45057:87;45114:3;45133:7;45141:1;45133:10;;;;;;;;:::i;:::-;;;;;;;;;;;;45119:11;;;;:6;:11;;;;;;;:24;;;45057:87;;43824:25:1;;;43865:18;;;43858:34;43797:18;45057:87:0;;;;;;;-1:-1:-1;44926:3:0;;;;:::i;:::-;;;;44883:277;;;;45175:11;45188:21;45213:913;45272:1;-1:-1:-1;;;;;45228:46:0;:18;:32;;;-1:-1:-1;;;;;45228:46:0;;;:119;;45312:21;:35;;;45228:119;;;45277:18;:32;;;45228:119;45349:10;45396:716;;;;;;;;45423:10;-1:-1:-1;;;;;45396:716:0;;;;;45452:12;45396:716;;;;45483:12;45396:716;;;;45514:1;45396:716;;;;45534:1;45396:716;;;;45600:1;-1:-1:-1;;;;;45554:48:0;:18;:34;;;-1:-1:-1;;;;;45554:48:0;;;:125;;45642:21;:37;;;45554:125;;;45605:18;:34;;;45554:125;-1:-1:-1;;;;;45396:716:0;;;;;45748:1;45698:18;:40;;;:47;:51;:140;;45795:21;:43;;;45698:140;;;45752:18;:40;;;45698:140;45396:716;;;;45905:1;45857:18;:38;;;:45;:49;:134;;45950:21;:41;;;45857:134;;;45909:18;:38;;;45857:134;45396:716;;;;46010:5;45396:716;;;;;;46034:1;45396:716;;;;46065:11;46078:9;46089:7;46054:43;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;46054:43:0;;;;;;45396:716;;45372:21;;;;:9;46054:43;45372:21;;;;;;:740;;;;-1:-1:-1;;;;;;45372:740:0;-1:-1:-1;;;;;45372:740:0;;;;;;;;;;;;:21;;:740;;-1:-1:-1;45372:740:0;;;;;;;;:::i;:::-;-1:-1:-1;45372:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45372:740:0;-1:-1:-1;;;;;45372:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;45372:740:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;45372:740:0;;;;;;;;;-1:-1:-1;;45372:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;45361:752:0;;;;-1:-1:-1;45361:752:0;;;:::i;45213:913::-;45174:952;;;;46145:6;46141:282;;46175:15;;:19;46172:236;;46289:8;46283:15;46276:4;46266:8;46262:19;46255:44;46172:236;46370:18;;-1:-1:-1;;;46370:18:0;;45198:2:1;46370:18:0;;;45180:21:1;45237:1;45217:18;;;45210:29;-1:-1:-1;;;45255:18:1;;;45248:38;45303:18;;46370::0;45170:157:1;46172:236:0;46441:9;46437:145;46460:12;:19;46456:1;:23;46437:145;;;46555:10;46538:12;46551:1;46538:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;46510:56:0;46526:10;-1:-1:-1;;;;;46510:56:0;;;;;;;;;;;46481:3;;;;:::i;:::-;;;;46437:145;;;;43759:2834;;;;;;;;;43754:3;;;;;:::i;:::-;;;;43704:2889;;;;46603:28;46634:12;46603:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46664:12;;46657:19;;;;:::i;:::-;46690:18;;:22;46687:76;;46729:22;46739:11;46729:9;:22::i;:::-;43543:3227;;43414:3356;;;;:::o;48408:536::-;48578:6;-1:-1:-1;;;;;48600:25:0;;48620:4;48600:25;;;:44;;-1:-1:-1;48629:15:0;;;48600:44;48597:286;;;48661:24;48688:27;;;;48699:4;48688:27;:::i;:::-;48661:54;;48734:9;48730:142;48749:20;;;48730:142;;;48795:61;48811:4;48817:9;;48827:1;48817:12;;;;;;;:::i;:::-;;;;;;;48831:7;;48839:1;48831:10;;;;;;;:::i;:::-;;;;;;;48843:9;48853:1;48843:12;;;;;;;;:::i;:::-;;;;;;;48795:15;:61::i;:::-;48771:3;;;;:::i;:::-;;;;48730:142;;;;48646:237;48597:286;-1:-1:-1;;;;48408:536:0;;;;;;;;;;:::o;29268:194::-;29344:16;31082:17;:15;:17::i;:::-;31074:42;;;;-1:-1:-1;;;31074:42:0;;47570:2:1;31074:42:0;;;47552:21:1;47609:2;47589:18;;;47582:30;-1:-1:-1;;;47628:18:1;;;47621:42;47680:18;;31074:42:0;47542:162:1;31074:42:0;-1:-1:-1;29384:4:0::1;::::0;;-1:-1:-1;;;;;29399:15:0;;::::1;-1:-1:-1::0;;;;;;29399:15:0;::::1;::::0;::::1;::::0;;;29430:24:::1;::::0;29384:4;::::1;::::0;29399:15;29384:4;;29430:24:::1;::::0;29384:4:::1;::::0;29430:24:::1;29268:194:::0;;;:::o;29470:840::-;29630:4;;;29930;;-1:-1:-1;;;;;29919:15:0;;;29930:4;;29919:15;29916:58;;;29958:4;29951:11;;;;;;29916:58;29988:4;;:17;;-1:-1:-1;;;;;29988:4:0;:15;:17::i;:::-;29984:62;;30029:5;30022:12;;;;;;29984:62;30097:4;;30113:130;;30057:11;;;;-1:-1:-1;;;;;30097:4:0;;;;-1:-1:-1;;;30136:61:0;30113:130;;30199:7;;30208:8;;30218;;30228:7;;;;30237:5;;30113:130;;;:::i;:::-;;;;-1:-1:-1;;30113:130:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30113:130:0;-1:-1:-1;;;;;;30113:130:0;;;;;;;;;;30097:147;;;;30113:130;30097:147;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30056:188;;;;30262:6;:40;;;;;30283:10;30272:30;;;;;;;;;;;;:::i;:::-;30255:47;;;;;;29470:840;;;;;;;;;:::o;49768:485::-;49851:9;49847:399;49866:15;;;49847:399;;;49904:25;49931:28;49961:18;49981:14;49997;50013:13;50028:18;50061:4;;50066:1;50061:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;50050:79;;;;;;;:::i;:::-;49903:226;;;;;;;;;;;;;;50144:90;50149:17;50168:15;50185:10;50197:6;50205;50213:5;50220:13;50144:4;:90::i;:::-;49888:358;;;;;;;49883:3;;;;;:::i;:::-;;;;49847:399;;;;49768:485;;:::o;52872:952::-;53001:10;53023:4;53001:27;52993:36;;;;;;53044:9;53040:777;53063:12;:19;53059:1;:23;53040:777;;;53104:20;53127:12;53140:1;53127:15;;;;;;;;:::i;:::-;;;;;;;53104:38;;53164:9;:16;53160:1;:20;:47;;;;;53206:1;53184:9;53194:1;53184:12;;;;;;;;:::i;:::-;;;;;;;:19;:23;53160:47;53157:544;;;53263:1;-1:-1:-1;;;;;53236:29:0;:12;53249:1;53236:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;53236:29:0;;53228:54;;;;-1:-1:-1;;;53228:54:0;;46895:2:1;53228:54:0;;;46877:21:1;46934:2;46914:18;;;46907:30;-1:-1:-1;;;46953:18:1;;;46946:42;47005:18;;53228:54:0;46867:162:1;53228:54:0;53301:21;53325:9;53335:1;53325:12;;;;;;;;:::i;:::-;;;;;;;53301:36;;53356:16;53476:8;53470:15;53463:4;53453:8;53449:19;53446:1;53439:47;53423:63;-1:-1:-1;;53520:25:0;;-1:-1:-1;;;;;53590:26:0;;53582:51;;;;-1:-1:-1;;;53582:51:0;;46895:2:1;53582:51:0;;;46877:21:1;46934:2;46914:18;;;46907:30;-1:-1:-1;;;46953:18:1;;;46946:42;47005:18;;53582:51:0;46867:162:1;53582:51:0;53671:1;53660:8;:12;53652:33;;;;-1:-1:-1;;;53652:33:0;;45534:2:1;53652:33:0;;;45516:21:1;45573:1;45553:18;;;45546:29;-1:-1:-1;;;45591:18:1;;;45584:38;45639:18;;53652:33:0;45506:157:1;53652:33:0;53209:492;;53157:544;53761:4;;53715:23;;:45;;-1:-1:-1;;;;;53761:4:0;53767:12;:10;:12::i;:::-;53781;53795:9;53715:90;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53089:728;53084:3;;;;;:::i;:::-;;;;53040:777;;;;52872:952;;;:::o;48064:336::-;48204:6;-1:-1:-1;;;;;48226:25:0;;48246:4;48226:25;;;:44;;-1:-1:-1;48255:15:0;;;48226:44;48223:121;;;48287:45;48303:4;48309:8;48319:6;48327:4;;48287:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48287:15:0;;-1:-1:-1;;;48287:45:0:i;:::-;-1:-1:-1;;;;48064:336:0;;;;;;;;:::o;53966:239::-;54074:37;;:::i;:::-;31082:17;:15;:17::i;:::-;31074:42;;;;-1:-1:-1;;;31074:42:0;;47570:2:1;31074:42:0;;;47552:21:1;47609:2;47589:18;;;47582:30;-1:-1:-1;;;47628:18:1;;;47621:42;47680:18;;31074:42:0;47542:162:1;31074:42:0;54131:66:::1;::::0;-1:-1:-1;;;54131:66:0;;:23:::1;::::0;:40:::1;::::0;:66:::1;::::0;54172:14:::1;::::0;54188:8;;54131:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;54131:66:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;31127:1::-;53966:239:::0;;;:::o;43127:240::-;43206:4;-1:-1:-1;;;;;;43243:50:0;;-1:-1:-1;;;43243:50:0;;:116;;-1:-1:-1;;;;;;;43310:49:0;;-1:-1:-1;;;43310:49:0;43223:136;43127:240;-1:-1:-1;;43127:240:0:o;57051:794::-;57186:4;57206:8;:15;57225:1;57206:20;:75;;;;57231:8;:15;57250:1;57231:20;:49;;;;;57278:1;-1:-1:-1;;;;;57255:25:0;:8;57264:1;57255:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;57255:25:0;;57231:49;57203:119;;;-1:-1:-1;57305:5:0;57298:12;;57203:119;57332:24;57359:21;;;:9;:21;;;;;;;;57332:48;;;;;;;;;-1:-1:-1;;;;;57332:48:0;;;;;;;;;;;;;;;;;;;;;;;;;57359:21;;57332:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57332:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57332:48:0;-1:-1:-1;;;;;57332:48:0;-1:-1:-1;;;;;57332:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57332:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57332:48:0;;;;;;;;;;;;;;;;-1:-1:-1;;;57332:48:0;;;-1:-1:-1;;57332:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57391:22;57439:43;;;57492:4;57499:10;57522:8;57511:20;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57511:20:0;;;;;;;;;;57416:129;;;;57533:4;;57539:5;;57416:129;;;:::i;:::-;;;;-1:-1:-1;;57416:129:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57416:129:0;-1:-1:-1;;;;;;57416:129:0;;;;;;;;;;;-1:-1:-1;;57556:259:0;57579:8;:15;57575:1;:19;57556:259;;;57617:11;57630:21;57655:8;57664:1;57655:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;57655:22:0;57678:9;57655:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57616:72;;;;57751:5;57706:50;;57708:6;57707:7;:39;;;;57729:8;57718:28;;;;;;;;;;;;:::i;:::-;57706:50;;;57703:101;;;57784:4;57777:11;;;;;;;;;57703:101;57601:214;;57596:3;;;;;:::i;:::-;;;;57556:259;;;;57832:5;57825:12;;;;57051:794;;;;;;;;:::o;58388:568::-;58529:25;;;:44;;-1:-1:-1;;58529:44:0;;;;;;;58587:22;;58529:44;58587:22;58584:256;;;58688:4;;58654:110;;-1:-1:-1;;;58654:110:0;;-1:-1:-1;;;;;58688:4:0;;;;58654:62;;:110;;58717:10;;58729:8;;58739:16;;58757:6;;58654:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:153;;58782:8;:25;;;58654:153;;;58767:12;58654:153;58626:25;;;:181;58822:7;;58584:256;58879:16;58878:17;:27;;;;58899:6;58878:27;:70;;58923:8;:25;;;58878:70;;;58908:12;58878:70;58850:25;;;:98;58388:568;;;;:::o;57853:527::-;57969:11;57982:21;-1:-1:-1;;;;;58019:29:0;;58016:78;;-1:-1:-1;;58065:17:0;;;;;;;;;-1:-1:-1;58065:17:0;;58073:4;;58065:17;;58016:78;58125:15;-1:-1:-1;;;;;58125:20:0;58169:43;;;58222:4;58229:3;58234:7;58243:6;58251;58146:112;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58146:112:0;;;;;;;;;;;;;;-1:-1:-1;;;;;58146:112:0;-1:-1:-1;;;;;;58146:112:0;;;;;;;;;;58125:134;;;;58146:112;58125:134;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58104:155:0;;-1:-1:-1;58104:155:0;-1:-1:-1;58270:103:0;;;;58316:8;58305:28;;;;;;;;;;;;:::i;:::-;58296:37;;58348:13;;;;;;;;;;;;;;58270:103;57853:527;;;;;;;:::o;59866:857::-;59955:12;59969:28;59999:26;60027:24;60053;60100:41;60108:10;60120:6;60128:5;60135;60100:7;:41::i;:::-;60152:25;60180:21;;;:9;:21;;;;;60090:51;;-1:-1:-1;60220:8:0;;;:49;;;60247:8;:22;;;60232:12;:37;60220:49;60212:93;;;;-1:-1:-1;;;60212:93:0;;48248:2:1;60212:93:0;;;48230:21:1;48287:2;48267:18;;;48260:30;48326:33;48306:18;;;48299:61;48377:18;;60212:93:0;48220:181:1;60212:93:0;60355:8;:21;;60344:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60447:18:0;;60316:96;;-1:-1:-1;60316:96:0;-1:-1:-1;;;;;;60433:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60433:33:0;;60423:43;;60501:11;:18;-1:-1:-1;;;;;60487:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60487:33:0;;60477:43;;60535:9;60531:185;60554:11;:18;60550:1;:22;60531:185;;;60621:83;60637:8;60647:10;60659:11;60671:1;60659:14;;;;;;;;:::i;:::-;;;;;;;60675:9;60685:1;60675:12;;;;;;;;:::i;:::-;;;;;;;60689:5;60696:7;60621:15;:83::i;:::-;60595:7;60603:1;60595:10;;;;;;;;:::i;:::-;;;;;;60607:7;60615:1;60607:10;;;;;;;;:::i;:::-;;;;;;;;;;60594:110;;;;;60574:3;;;;:::i;:::-;;;;60531:185;;;;60079:644;59866:857;;;;;;;;;:::o;30318:372::-;30461:1;30438:11;30388:29;;-1:-1:-1;;;;;30438:11:0;:25;30430:42;;;;-1:-1:-1;;;30430:42:0;;;;;;48608:2:1;48590:21;;;48647:1;48627:18;;;48620:29;-1:-1:-1;;;48680:2:1;48665:18;;48658:34;48724:2;48709:18;;48580:153;30430:42:0;30483:11;:24;;-1:-1:-1;;;;;;30483:24:0;30497:10;30483:24;;;30545:42;;;;;;;;;;;;;;:::i;:::-;30519:4;30518:69;;-1:-1:-1;;;;;30518:69:0;;;-1:-1:-1;;;;;;30518:69:0;;;;;;;30603:22;;30518:69;;-1:-1:-1;30519:4:0;;30603:22;;30519:4;;30603:22;30655:27;30665:16;30655:9;:27::i;58964:648::-;59049:7;-1:-1:-1;;;;;59072:31:0;;59069:75;;-1:-1:-1;59127:5:0;59120:12;;59069:75;59180:50;;-1:-1:-1;;;59180:50:0;;59224:4;59180:50;;;30975:51:1;59154:23:0;;-1:-1:-1;;;;;59180:35:0;;;;;30948:18:1;;59180:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59241:103;;-1:-1:-1;;;59241:103:0;;-1:-1:-1;;;;;31332:15:1;;59241:103:0;;;31314:34:1;59311:10:0;31364:18:1;;;31357:43;59331:4:0;31416:18:1;;;31409:43;31468:18;;;31461:34;;;59154:76:0;;-1:-1:-1;59241:23:0;;:50;;31248:19:1;;59241:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59379:50:0;;-1:-1:-1;;;59379:50:0;;59423:4;59379:50;;;30975:51:1;59355:21:0;;-1:-1:-1;;;;;;59379:35:0;;;-1:-1:-1;59379:35:0;;30948:18:1;;59379:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59355:74;;59464:15;59448:13;:31;59440:40;;;;;;59534:5;59499:31;59515:15;59499:13;:31;:::i;:::-;:40;59491:64;;;;-1:-1:-1;;;59491:64:0;;50628:2:1;59491:64:0;;;50610:21:1;50667:2;50647:18;;;50640:30;-1:-1:-1;;;50686:18:1;;;50679:41;50737:18;;59491:64:0;50600:161:1;59491:64:0;59573:31;59589:15;59573:13;:31;:::i;54594:1410::-;54792:11;54789:49;;54820:7;;54789:49;54867:15;54876:6;54867;:15;:::i;:::-;54856:6;:27;54848:46;;;;-1:-1:-1;;;54848:46:0;;47236:2:1;54848:46:0;;;47218:21:1;47275:1;47255:18;;;47248:29;-1:-1:-1;;;47293:18:1;;;47286:36;47339:18;;54848:46:0;47208:155:1;54848:46:0;54905:13;-1:-1:-1;;;;;54921:24:0;;;:44;;54955:10;54921:44;;;54948:4;54921:44;54905:60;;54976:38;54984:10;54996:4;55002:5;55009:4;54976:7;:38::i;:::-;;55025:12;55067:10;55079;55091:8;55050:50;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55050:50:0;;;;;;;;;55040:61;;55050:50;55040:61;;;;55112:22;55137:12;;;:6;:12;;;;;;55040:61;;-1:-1:-1;55168:18:0;55160:35;;;;-1:-1:-1;;;55160:35:0;;;;;;44866:2:1;44848:21;;;44905:1;44885:18;;;44878:29;-1:-1:-1;;;44938:2:1;44923:18;;44916:34;44982:2;44967:18;;44838:153;55160:35:0;55247:15;55256:6;55247;:15;:::i;:::-;55206:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55206:30:0;;;;;;;;;:36;;;;;;;;:57;;:36;;:23;:57;;;;;:::i;:::-;;;;-1:-1:-1;;55277:10:0;;55274:215;;55304:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;55304:26:0;;;;;;;;;:32;;;;;;;;:42;;55340:6;;55304:19;:42;;55340:6;;55304:42;:::i;:::-;;;;-1:-1:-1;55394:23:0;;-1:-1:-1;55403:14:0;55394:6;:23;:::i;:::-;55361:21;;;;:9;:21;;;;;:28;;:57;;:28;;:21;:57;;;;;:::i;:::-;;;;;;;;55464:4;55457:5;-1:-1:-1;;;;;55438:39:0;55445:10;55438:39;55470:6;55438:39;;;;41241:25:1;;41229:2;41214:18;;41196:76;55438:39:0;;;;;;;;55274:215;55502:10;;55499:215;;55529:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;55529:26:0;;;;;;;;;:32;;;;;;;;:42;;55565:6;;55529:19;:42;;55565:6;;55529:42;:::i;:::-;;;;-1:-1:-1;55619:23:0;;-1:-1:-1;55628:14:0;55619:6;:23;:::i;:::-;55586:21;;;;:9;:21;;;;;:28;;:57;;:28;;:21;:57;;;;;:::i;:::-;;;;;;;;55689:4;55682:5;-1:-1:-1;;;;;55663:39:0;55670:10;55663:39;55695:6;55663:39;;;;41241:25:1;;41229:2;41214:18;;41196:76;55663:39:0;;;;;;;;55499:215;55736:1;55727:6;:10;:24;;;;55750:1;55741:6;:10;55727:24;55724:91;;;-1:-1:-1;;;;;55768:20:0;;;;;;:13;:20;;;;;55791:12;55768:35;;55724:91;55828:14;55825:172;;;55890:16;;;55904:1;55890:16;;;;;;;;;55859:28;;55890:16;;;;;;;;;;;-1:-1:-1;55890:16:0;55859:47;;55938:10;55921:11;55933:1;55921:14;;;;;;;;:::i;:::-;;;;;;:27;;;;;55963:22;55973:11;55963:9;:22::i;:::-;55844:153;55825:172;54778:1226;;;54594:1410;;;;;;;;;;:::o;59620:238::-;59707:9;:11;;59659:7;;;59707:11;;;:::i;:::-;;;;-1:-1:-1;59720:15:0;59737:12;59751:9;59762:11;59775:14;59791:16;59809:10;59831:16;59846:1;59737:12;59831:16;:::i;:::-;59696:153;;;;;;57115:25:1;;;;57156:18;;57149:34;;;;57199:18;;;57192:34;;;;-1:-1:-1;;;;;57300:15:1;;;57280:18;;;57273:43;57332:19;;;57325:35;;;;57397:15;;57376:19;;;57369:44;57429:19;;;57422:35;57494:15;57473:19;;;57466:44;59821:27:0;57526:19:1;;;57519:35;57087:19;;59696:153:0;;;;;;;;;;;;59686:164;;;;;;59679:171;;59620:238;:::o;54213:373::-;54325:18;54345:14;54361;54377:13;54392:19;54426:4;54415:60;;;;;;;;;;;;:::i;:::-;54324:151;;;;;;;;;;54486:92;54492:4;54498:10;54510:8;54520:6;54528:10;54540:6;54548;54556:5;54563:14;54486:5;:92::i;31144:155::-;31188:4;31212:79;31235:10;31255:4;31262:7;;-1:-1:-1;;;;;;31262:7:0;31271:8;;31281:9;31212:22;:79::i;:::-;31205:86;;31144:155;:::o;6760:289::-;6820:4;-1:-1:-1;;;;;6840:21:0;;6837:65;;-1:-1:-1;6885:5:0;;6760:289;-1:-1:-1;6760:289:0:o;6837:65::-;-1:-1:-1;6979:20:0;7027:14;;;6760:289::o;56012:1031::-;56121:12;56173:21;;;:9;:21;;;;;;;;56146:48;;;;;;;;;-1:-1:-1;;;;;56146:48:0;;;;;;;;;;;;;;;;;;;;;;;56121:12;;56146:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56146:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56146:48:0;-1:-1:-1;;;;;56146:48:0;-1:-1:-1;;;;;56146:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56146:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56146:48:0;;;;;;;;;;;;;;;;-1:-1:-1;;;56146:48:0;;;-1:-1:-1;;56146:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56238:1;56213:8;:22;;;:26;56205:47;;;;-1:-1:-1;;;56205:47:0;;49271:2:1;56205:47:0;;;49253:21:1;49310:1;49290:18;;;49283:29;-1:-1:-1;;;49328:18:1;;;49321:38;49376:18;;56205:47:0;49243:157:1;56205:47:0;56266:22;;;;56263:286;;;56363:4;;56329:100;;-1:-1:-1;;;56329:100:0;;56305:21;;-1:-1:-1;;;;;56363:4:0;;56329:49;;:100;;56379:10;;56391:8;;56401:4;;56407:5;;56414:14;;56329:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56329:100:0;;;;;;;;;;;;:::i;:::-;56447:15;;56305:124;;-1:-1:-1;56447:19:0;56444:94;;56505:8;56494:28;;;;;;;;;;;;:::i;:::-;56487:35;;;;;;56444:94;56290:259;56263:286;56614:25;;;;:30;;;;;56597:78;;;56650:8;:25;;;56649:26;56597:78;:162;;;;;56680:79;56697:4;56703:8;:30;;;56735:10;56747:4;56753:5;56680:16;:79::i;:::-;56679:80;56597:162;56587:172;;56773:14;56770:266;;;56812:7;56804:24;;;;-1:-1:-1;;;56804:24:0;;;;;;44534:2:1;44516:21;;;44573:1;44553:18;;;44546:29;-1:-1:-1;;;44606:2:1;44591:18;;44584:34;44650:2;44635:18;;44506:153;56804:24:0;56770:266;;;-1:-1:-1;;;;;56884:20:0;;;;;;:13;:20;;;;;;56869:12;:35;56861:60;;;;-1:-1:-1;;;56861:60:0;;49607:2:1;56861:60:0;;;49589:21:1;49646:2;49626:18;;;49619:30;-1:-1:-1;;;49665:18:1;;;49658:42;49717:18;;56861:60:0;49579:162:1;56861:60:0;56945:12;56944:13;:70;;;-1:-1:-1;56961:21:0;;;;:9;:21;;;;;:38;;;57002:12;-1:-1:-1;56944:70:0;56936:88;;;;-1:-1:-1;;;56936:88:0;;46562:2:1;56936:88:0;;;46544:21:1;46601:1;46581:18;;;46574:29;-1:-1:-1;;;46619:18:1;;;46612:35;46664:18;;56936:88:0;46534:154:1;56936:88:0;56135:908;;56012:1031;;;;;;;:::o;60731:1233::-;60886:14;60902;60929:12;60971:10;60983;60995:8;60954:50;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60954:50:0;;;;;;;;;60944:61;;60954:50;60944:61;;;;61016:22;61041:12;;;:6;:12;;;;;;60944:61;;-1:-1:-1;61072:18:0;61064:35;;;;-1:-1:-1;;;61064:35:0;;;;;;44866:2:1;44848:21;;;44905:1;44885:18;;;44878:29;-1:-1:-1;;;44938:2:1;44923:18;;44916:34;44982:2;44967:18;;44838:153;61064:35:0;61119:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;61119:26:0;;;;;;;;;;;:32;;;;;;;;;61171:19;;;:7;:19;;;;;:26;;;;;;;;;:32;;;;;;;;;;61119;;-1:-1:-1;61171:32:0;-1:-1:-1;61263:15:0;61171:32;61119;61263:15;:::i;:::-;61222:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;61222:30:0;;;;;;;;;:36;;;;;;;;;:57;;61214:76;;;;-1:-1:-1;;;61214:76:0;;47236:2:1;61214:76:0;;;47218:21:1;47275:1;47255:18;;;47248:29;-1:-1:-1;;;47293:18:1;;;47286:36;47339:18;;61214:76:0;47208:155:1;61214:76:0;61304:10;;61301:323;;61331:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;61331:30:0;;;;;;;;;:36;;;;;;;;:46;;61371:6;;61331:23;:46;;61371:6;;61331:46;:::i;:::-;;;;-1:-1:-1;;61392:221:0;;;;61423:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;61423:26:0;;;;;;;;;:32;;;;;;;;:42;;61459:6;;61423:19;:42;;61459:6;;61423:42;:::i;:::-;;;;-1:-1:-1;61504:23:0;;-1:-1:-1;61513:14:0;61504:6;:23;:::i;:::-;61484:8;:15;;;:44;;;;;;;:::i;:::-;;;;;;;;61584:4;61577:5;-1:-1:-1;;;;;61552:45:0;61565:10;61552:45;61590:6;61552:45;;;;41241:25:1;;41229:2;41214:18;;41196:76;61552:45:0;;;;;;;;61392:221;61637:10;;61634:323;;61664:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;61664:30:0;;;;;;;;;:36;;;;;;;;:46;;61704:6;;61664:23;:46;;61704:6;;61664:46;:::i;:::-;;;;-1:-1:-1;;61725:221:0;;;;61756:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;61756:26:0;;;;;;;;;:32;;;;;;;;:42;;61792:6;;61756:19;:42;;61792:6;;61756:42;:::i;:::-;;;;-1:-1:-1;61837:23:0;;-1:-1:-1;61846:14:0;61837:6;:23;:::i;:::-;61817:8;:15;;;:44;;;;;;;:::i;:::-;;;;;;;;61917:4;61910:5;-1:-1:-1;;;;;61885:45:0;61898:10;61885:45;61923:6;61885:45;;;;41241:25:1;;41229:2;41214:18;;41196:76;61885:45:0;;;;;;;;61725:221;60918:1046;;60731:1233;;;;;;;;;:::o;42742:377::-;42814:12;42891;42880:39;;;;;;;;;;;;:::i;:::-;42840:22;42839:80;;-1:-1:-1;;42839:80:0;;;;;;;;;;;42933:19;;42839:80;;-1:-1:-1;42933:23:0;42930:162;;42973:23;:40;43014:14;43041:12;43030:49;;;;;;;;;;;;:::i;:::-;42973:107;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42973:107:0;;;;;;;;;;;;:::i;:::-;;42930:162;-1:-1:-1;;43102:9:0;;;;;;;;;-1:-1:-1;43102:9:0;;;42742:377::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:138::-;232:13;;254:31;232:13;254:31;:::i;296:367::-;359:8;369:6;423:3;416:4;408:6;404:17;400:27;390:2;;441:1;438;431:12;390:2;-1:-1:-1;464:20:1;;-1:-1:-1;;;;;496:30:1;;493:2;;;539:1;536;529:12;493:2;576:4;568:6;564:17;552:29;;636:3;629:4;619:6;616:1;612:14;604:6;600:27;596:38;593:47;590:2;;;653:1;650;643:12;590:2;380:283;;;;;:::o;668:745::-;733:5;786:3;779:4;771:6;767:17;763:27;753:2;;804:1;801;794:12;753:2;833:6;827:13;859:4;883:60;899:43;939:2;899:43;:::i;:::-;883:60;:::i;:::-;965:3;989:2;984:3;977:15;1017:2;1012:3;1008:12;1001:19;;1052:2;1044:6;1040:15;1104:3;1099:2;1093;1090:1;1086:10;1078:6;1074:23;1070:32;1067:41;1064:2;;;1121:1;1118;1111:12;1064:2;1143:1;1153:231;1167:2;1164:1;1161:9;1153:231;;;1231:3;1225:10;1248:31;1273:5;1248:31;:::i;:::-;1292:18;;1330:12;;;;1362;;;;1185:1;1178:9;1153:231;;;-1:-1:-1;1402:5:1;;743:670;-1:-1:-1;;;;;;;743:670:1:o;1418:673::-;1472:5;1525:3;1518:4;1510:6;1506:17;1502:27;1492:2;;1543:1;1540;1533:12;1492:2;1579:6;1566:20;1605:4;1629:60;1645:43;1685:2;1645:43;:::i;1629:60::-;1711:3;1735:2;1730:3;1723:15;1763:2;1758:3;1754:12;1747:19;;1798:2;1790:6;1786:15;1850:3;1845:2;1839;1836:1;1832:10;1824:6;1820:23;1816:32;1813:41;1810:2;;;1867:1;1864;1857:12;1810:2;1889:1;1899:163;1913:2;1910:1;1907:9;1899:163;;;1970:17;;1958:30;;2008:12;;;;2040;;;;1931:1;1924:9;1899:163;;2096:854;2148:5;2201:3;2194:4;2186:6;2182:17;2178:27;2168:2;;2219:1;2216;2209:12;2168:2;2255:6;2242:20;2281:4;2305:60;2321:43;2361:2;2321:43;:::i;2305:60::-;2387:3;2411:2;2406:3;2399:15;2439:2;2434:3;2430:12;2423:19;;2474:2;2466:6;2462:15;2526:3;2521:2;2515;2512:1;2508:10;2500:6;2496:23;2492:32;2489:41;2486:2;;;2543:1;2540;2533:12;2486:2;2565:1;2586;2596:325;2612:2;2607:3;2604:11;2596:325;;;2693:3;2680:17;-1:-1:-1;;;;;2716:11:1;2713:35;2710:2;;;2761:1;2758;2751:12;2710:2;2790:56;2842:3;2837:2;2823:11;2815:6;2811:24;2807:33;2790:56;:::i;:::-;2778:69;;-1:-1:-1;2867:12:1;;;;2899;;;;2634:1;2625:11;2596:325;;;-1:-1:-1;2939:5:1;;2158:792;-1:-1:-1;;;;;;;;2158:792:1:o;2955:670::-;3020:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:2;;3091:1;3088;3081:12;3040:2;3120:6;3114:13;3146:4;3170:60;3186:43;3226:2;3186:43;:::i;3170:60::-;3252:3;3276:2;3271:3;3264:15;3304:2;3299:3;3295:12;3288:19;;3339:2;3331:6;3327:15;3391:3;3386:2;3380;3377:1;3373:10;3365:6;3361:23;3357:32;3354:41;3351:2;;;3408:1;3405;3398:12;3351:2;3430:1;3440:156;3454:2;3451:1;3448:9;3440:156;;;3511:10;;3499:23;;3542:12;;;;3574;;;;3472:1;3465:9;3440:156;;3630:128;3695:20;;3724:28;3695:20;3724:28;:::i;3763:173::-;3830:20;;-1:-1:-1;;;;;;3879:32:1;;3869:43;;3859:2;;3926:1;3923;3916:12;3941:347;3992:8;4002:6;4056:3;4049:4;4041:6;4037:17;4033:27;4023:2;;4074:1;4071;4064:12;4023:2;-1:-1:-1;4097:20:1;;-1:-1:-1;;;;;4129:30:1;;4126:2;;;4172:1;4169;4162:12;4126:2;4209:4;4201:6;4197:17;4185:29;;4261:3;4254:4;4245:6;4237;4233:19;4229:30;4226:39;4223:2;;;4278:1;4275;4268:12;4293:462;4335:5;4388:3;4381:4;4373:6;4369:17;4365:27;4355:2;;4406:1;4403;4396:12;4355:2;4442:6;4429:20;4473:48;4489:31;4517:2;4489:31;:::i;4473:48::-;4546:2;4537:7;4530:19;4592:3;4585:4;4580:2;4572:6;4568:15;4564:26;4561:35;4558:2;;;4609:1;4606;4599:12;4558:2;4674;4667:4;4659:6;4655:17;4648:4;4639:7;4635:18;4622:55;4722:1;4697:16;;;4715:4;4693:27;4686:38;;;;4701:7;4345:410;-1:-1:-1;;;4345:410:1:o;4760:428::-;4813:5;4866:3;4859:4;4851:6;4847:17;4843:27;4833:2;;4884:1;4881;4874:12;4833:2;4913:6;4907:13;4944:48;4960:31;4988:2;4960:31;:::i;4944:48::-;5017:2;5008:7;5001:19;5063:3;5056:4;5051:2;5043:6;5039:15;5035:26;5032:35;5029:2;;;5080:1;5077;5070:12;5029:2;5093:64;5154:2;5147:4;5138:7;5134:18;5127:4;5119:6;5115:17;5093:64;:::i;5193:1368::-;5272:5;5320:4;5308:9;5303:3;5299:19;5295:30;5292:2;;;5338:1;5335;5328:12;5292:2;5360:22;;:::i;:::-;5351:31;;5411:9;5405:16;-1:-1:-1;;;;;5481:2:1;5473:6;5470:14;5467:2;;;5497:1;5494;5487:12;5467:2;5524:68;5588:3;5579:6;5568:9;5564:22;5524:68;:::i;:::-;5517:5;5510:83;5639:2;5628:9;5624:18;5618:25;5602:41;;5668:2;5658:8;5655:16;5652:2;;;5684:1;5681;5674:12;5652:2;5720:70;5786:3;5775:8;5764:9;5760:24;5720:70;:::i;:::-;5715:2;5708:5;5704:14;5697:94;5837:2;5826:9;5822:18;5816:25;5800:41;;5866:2;5856:8;5853:16;5850:2;;;5882:1;5879;5872:12;5850:2;5918:70;5984:3;5973:8;5962:9;5958:24;5918:70;:::i;:::-;5913:2;5906:5;5902:14;5895:94;6021:49;6066:2;6055:9;6051:18;6021:49;:::i;:::-;6016:2;6009:5;6005:14;5998:73;6104:50;6149:3;6138:9;6134:19;6104:50;:::i;:::-;6098:3;6091:5;6087:15;6080:75;6201:3;6190:9;6186:19;6180:26;6164:42;;6231:2;6221:8;6218:16;6215:2;;;6247:1;6244;6237:12;6215:2;6284:70;6350:3;6339:8;6328:9;6324:24;6284:70;:::i;:::-;6278:3;6271:5;6267:15;6260:95;6401:3;6390:9;6386:19;6380:26;6364:42;;6431:2;6421:8;6418:16;6415:2;;;6447:1;6444;6437:12;6415:2;;6484:70;6550:3;6539:8;6528:9;6524:24;6484:70;:::i;:::-;6478:3;6471:5;6467:15;6460:95;;5282:1279;;;;:::o;6566:247::-;6625:6;6678:2;6666:9;6657:7;6653:23;6649:32;6646:2;;;6694:1;6691;6684:12;6646:2;6733:9;6720:23;6752:31;6777:5;6752:31;:::i;6818:471::-;6914:6;6922;6975:2;6963:9;6954:7;6950:23;6946:32;6943:2;;;6991:1;6988;6981:12;6943:2;7023:9;7017:16;7042:31;7067:5;7042:31;:::i;:::-;7141:2;7126:18;;7120:25;7092:5;;-1:-1:-1;;;;;;7157:30:1;;7154:2;;;7200:1;7197;7190:12;7154:2;7223:60;7275:7;7266:6;7255:9;7251:22;7223:60;:::i;:::-;7213:70;;;6933:356;;;;;:::o;7294:955::-;7429:6;7437;7445;7453;7461;7469;7477;7530:3;7518:9;7509:7;7505:23;7501:33;7498:2;;;7547:1;7544;7537:12;7498:2;7586:9;7573:23;7605:31;7630:5;7605:31;:::i;:::-;7655:5;-1:-1:-1;7711:2:1;7696:18;;7683:32;-1:-1:-1;;;;;7727:30:1;;7724:2;;;7770:1;7767;7760:12;7724:2;7793:49;7834:7;7825:6;7814:9;7810:22;7793:49;:::i;:::-;7783:59;;;7889:2;7878:9;7874:18;7861:32;7851:42;;7940:2;7929:9;7925:18;7912:32;7902:42;;7991:3;7980:9;7976:19;7963:33;7953:43;;8048:3;8037:9;8033:19;8020:33;8062;8087:7;8062:33;:::i;:::-;8114:7;-1:-1:-1;8173:3:1;8158:19;;8145:33;8187:30;8145:33;8187:30;:::i;:::-;8236:7;8226:17;;;7488:761;;;;;;;;;;:::o;8254:1338::-;8414:6;8422;8430;8438;8446;8454;8462;8470;8523:3;8511:9;8502:7;8498:23;8494:33;8491:2;;;8540:1;8537;8530:12;8491:2;8579:9;8566:23;8598:31;8623:5;8598:31;:::i;:::-;8648:5;-1:-1:-1;8705:2:1;8690:18;;8677:32;8718:33;8677:32;8718:33;:::i;:::-;8770:7;-1:-1:-1;8828:2:1;8813:18;;8800:32;-1:-1:-1;;;;;8881:14:1;;;8878:2;;;8908:1;8905;8898:12;8878:2;8947:70;9009:7;9000:6;8989:9;8985:22;8947:70;:::i;:::-;9036:8;;-1:-1:-1;8921:96:1;-1:-1:-1;9124:2:1;9109:18;;9096:32;;-1:-1:-1;9140:16:1;;;9137:2;;;9169:1;9166;9159:12;9137:2;9208:72;9272:7;9261:8;9250:9;9246:24;9208:72;:::i;:::-;9299:8;;-1:-1:-1;9182:98:1;-1:-1:-1;9387:3:1;9372:19;;9359:33;;-1:-1:-1;9404:16:1;;;9401:2;;;9433:1;9430;9423:12;9401:2;;9472:60;9524:7;9513:8;9502:9;9498:24;9472:60;:::i;:::-;8481:1111;;;;-1:-1:-1;8481:1111:1;;-1:-1:-1;8481:1111:1;;;;;;9551:8;-1:-1:-1;;;8481:1111:1:o;9597:827::-;9702:6;9710;9718;9726;9734;9742;9795:3;9783:9;9774:7;9770:23;9766:33;9763:2;;;9812:1;9809;9802:12;9763:2;9851:9;9838:23;9870:31;9895:5;9870:31;:::i;:::-;9920:5;-1:-1:-1;9977:2:1;9962:18;;9949:32;9990:33;9949:32;9990:33;:::i;:::-;10042:7;-1:-1:-1;10068:37:1;10101:2;10086:18;;10068:37;:::i;:::-;10058:47;;10156:2;10145:9;10141:18;10128:32;-1:-1:-1;;;;;10175:6:1;10172:30;10169:2;;;10215:1;10212;10205:12;10169:2;10254:58;10304:7;10295:6;10284:9;10280:22;10254:58;:::i;:::-;9753:671;;;;-1:-1:-1;9753:671:1;;;;;10413:3;10398:19;;;10385:33;;9753:671;-1:-1:-1;;;;9753:671:1:o;10429:823::-;10535:6;10543;10551;10559;10567;10575;10628:3;10616:9;10607:7;10603:23;10599:33;10596:2;;;10645:1;10642;10635:12;10596:2;10684:9;10671:23;10703:31;10728:5;10703:31;:::i;:::-;10753:5;-1:-1:-1;10810:2:1;10795:18;;10782:32;10823:33;10782:32;10823:33;:::i;:::-;10875:7;-1:-1:-1;10929:2:1;10914:18;;10901:32;;-1:-1:-1;10980:2:1;10965:18;;10952:32;;-1:-1:-1;11035:3:1;11020:19;;11007:33;-1:-1:-1;;;;;11052:30:1;;11049:2;;;11095:1;11092;11085:12;11049:2;11134:58;11184:7;11175:6;11164:9;11160:22;11134:58;:::i;:::-;10586:666;;;;-1:-1:-1;10586:666:1;;-1:-1:-1;10586:666:1;;11211:8;;10586:666;-1:-1:-1;;;10586:666:1:o;12201:363::-;12296:6;12349:2;12337:9;12328:7;12324:23;12320:32;12317:2;;;12365:1;12362;12355:12;12317:2;12398:9;12392:16;-1:-1:-1;;;;;12423:6:1;12420:30;12417:2;;;12463:1;12460;12453:12;12417:2;12486:72;12550:7;12541:6;12530:9;12526:22;12486:72;:::i;12569:844::-;12732:6;12740;12748;12801:2;12789:9;12780:7;12776:23;12772:32;12769:2;;;12817:1;12814;12807:12;12769:2;12850:9;12844:16;-1:-1:-1;;;;;12920:2:1;12912:6;12909:14;12906:2;;;12936:1;12933;12926:12;12906:2;12959:72;13023:7;13014:6;13003:9;12999:22;12959:72;:::i;:::-;12949:82;;13077:2;13066:9;13062:18;13056:25;13040:41;;13106:2;13096:8;13093:16;13090:2;;;13122:1;13119;13112:12;13090:2;13145:74;13211:7;13200:8;13189:9;13185:24;13145:74;:::i;:::-;13135:84;;13265:2;13254:9;13250:18;13244:25;13228:41;;13294:2;13284:8;13281:16;13278:2;;;13310:1;13307;13300:12;13278:2;;13333:74;13399:7;13388:8;13377:9;13373:24;13333:74;:::i;:::-;13323:84;;;12759:654;;;;;:::o;13418:1431::-;13563:6;13571;13579;13632:2;13620:9;13611:7;13607:23;13603:32;13600:2;;;13648:1;13645;13638:12;13600:2;13688:9;13675:23;-1:-1:-1;;;;;13758:2:1;13750:6;13747:14;13744:2;;;13774:1;13771;13764:12;13744:2;13812:6;13801:9;13797:22;13787:32;;13857:7;13850:4;13846:2;13842:13;13838:27;13828:2;;13879:1;13876;13869:12;13828:2;13915;13902:16;13937:4;13961:60;13977:43;14017:2;13977:43;:::i;13961:60::-;14043:3;14067:2;14062:3;14055:15;14095:2;14090:3;14086:12;14079:19;;14126:2;14122;14118:11;14174:7;14169:2;14163;14160:1;14156:10;14152:2;14148:19;14144:28;14141:41;14138:2;;;14195:1;14192;14185:12;14138:2;14217:1;14208:10;;14227:238;14241:2;14238:1;14235:9;14227:238;;;14312:3;14299:17;14329:31;14354:5;14329:31;:::i;:::-;14373:18;;14259:1;14252:9;;;;;14411:12;;;;14443;;14227:238;;;-1:-1:-1;14484:5:1;-1:-1:-1;;14527:18:1;;14514:32;;-1:-1:-1;;14558:16:1;;;14555:2;;;14587:1;14584;14577:12;14555:2;14610:51;14653:7;14642:8;14631:9;14627:24;14610:51;:::i;:::-;14600:61;;14714:2;14703:9;14699:18;14686:32;14670:48;;14743:2;14733:8;14730:16;14727:2;;;14759:1;14756;14749:12;14727:2;;14782:61;14835:7;14824:8;14813:9;14809:24;14782:61;:::i;14854:639::-;14997:6;15005;15058:2;15046:9;15037:7;15033:23;15029:32;15026:2;;;15074:1;15071;15064:12;15026:2;15107:9;15101:16;-1:-1:-1;;;;;15177:2:1;15169:6;15166:14;15163:2;;;15193:1;15190;15183:12;15163:2;15216:72;15280:7;15271:6;15260:9;15256:22;15216:72;:::i;:::-;15206:82;;15334:2;15323:9;15319:18;15313:25;15297:41;;15363:2;15353:8;15350:16;15347:2;;;15379:1;15376;15369:12;15347:2;;15402:85;15479:7;15468:8;15457:9;15453:24;15402:85;:::i;15498:437::-;15584:6;15592;15645:2;15633:9;15624:7;15620:23;15616:32;15613:2;;;15661:1;15658;15651:12;15613:2;15701:9;15688:23;-1:-1:-1;;;;;15726:6:1;15723:30;15720:2;;;15766:1;15763;15756:12;15720:2;15805:70;15867:7;15858:6;15847:9;15843:22;15805:70;:::i;:::-;15894:8;;15779:96;;-1:-1:-1;15603:332:1;-1:-1:-1;;;;15603:332:1:o;15940:1115::-;16125:6;16133;16141;16149;16157;16165;16218:2;16206:9;16197:7;16193:23;16189:32;16186:2;;;16234:1;16231;16224:12;16186:2;16274:9;16261:23;-1:-1:-1;;;;;16344:2:1;16336:6;16333:14;16330:2;;;16360:1;16357;16350:12;16330:2;16399:70;16461:7;16452:6;16441:9;16437:22;16399:70;:::i;:::-;16488:8;;-1:-1:-1;16373:96:1;-1:-1:-1;16576:2:1;16561:18;;16548:32;;-1:-1:-1;16592:16:1;;;16589:2;;;16621:1;16618;16611:12;16589:2;16660:72;16724:7;16713:8;16702:9;16698:24;16660:72;:::i;:::-;16751:8;;-1:-1:-1;16634:98:1;-1:-1:-1;16839:2:1;16824:18;;16811:32;;-1:-1:-1;16855:16:1;;;16852:2;;;16884:1;16881;16874:12;16852:2;;16923:72;16987:7;16976:8;16965:9;16961:24;16923:72;:::i;17060:348::-;17144:6;17197:2;17185:9;17176:7;17172:23;17168:32;17165:2;;;17213:1;17210;17203:12;17165:2;17253:9;17240:23;-1:-1:-1;;;;;17278:6:1;17275:30;17272:2;;;17318:1;17315;17308:12;17272:2;17341:61;17394:7;17385:6;17374:9;17370:22;17341:61;:::i;17413:618::-;17512:6;17520;17528;17581:2;17569:9;17560:7;17556:23;17552:32;17549:2;;;17597:1;17594;17587:12;17549:2;17637:9;17624:23;-1:-1:-1;;;;;17662:6:1;17659:30;17656:2;;;17702:1;17699;17692:12;17656:2;17725:61;17778:7;17769:6;17758:9;17754:22;17725:61;:::i;:::-;17715:71;;;17836:2;17825:9;17821:18;17808:32;17849:31;17874:5;17849:31;:::i;:::-;17899:5;-1:-1:-1;17956:2:1;17941:18;;17928:32;17969:30;17928:32;17969:30;:::i;:::-;18018:7;18008:17;;;17539:492;;;;;:::o;18489:355::-;18582:6;18635:2;18623:9;18614:7;18610:23;18606:32;18603:2;;;18651:1;18648;18641:12;18603:2;18691:9;18678:23;-1:-1:-1;;;;;18716:6:1;18713:30;18710:2;;;18756:1;18753;18746:12;18710:2;18779:59;18830:7;18821:6;18810:9;18806:22;18779:59;:::i;19324:245::-;19391:6;19444:2;19432:9;19423:7;19419:23;19415:32;19412:2;;;19460:1;19457;19450:12;19412:2;19492:9;19486:16;19511:28;19533:5;19511:28;:::i;19574:457::-;19659:6;19667;19720:2;19708:9;19699:7;19695:23;19691:32;19688:2;;;19736:1;19733;19726:12;19688:2;19768:9;19762:16;19787:28;19809:5;19787:28;:::i;20036:180::-;20095:6;20148:2;20136:9;20127:7;20123:23;20119:32;20116:2;;;20164:1;20161;20154:12;20116:2;-1:-1:-1;20187:23:1;;20106:110;-1:-1:-1;20106:110:1:o;20221:572::-;20332:6;20340;20348;20356;20364;20417:3;20405:9;20396:7;20392:23;20388:33;20385:2;;;20434:1;20431;20424:12;20385:2;20463:9;20457:16;20447:26;;20513:2;20502:9;20498:18;20492:25;20482:35;;20557:2;20546:9;20542:18;20536:25;20526:35;;20604:2;20593:9;20589:18;20583:25;20617:31;20642:5;20617:31;:::i;:::-;20717:3;20702:19;;20696:26;20667:5;;-1:-1:-1;20731:30:1;20696:26;20731:30;:::i;:::-;20780:7;20770:17;;;20375:418;;;;;;;;:::o;20798:184::-;20856:6;20909:2;20897:9;20888:7;20884:23;20880:32;20877:2;;;20925:1;20922;20915:12;20877:2;20948:28;20966:9;20948:28;:::i;20987:409::-;21057:6;21065;21118:2;21106:9;21097:7;21093:23;21089:32;21086:2;;;21134:1;21131;21124:12;21086:2;21174:9;21161:23;-1:-1:-1;;;;;21199:6:1;21196:30;21193:2;;;21239:1;21236;21229:12;21193:2;21278:58;21328:7;21319:6;21308:9;21304:22;21278:58;:::i;21401:335::-;21480:6;21533:2;21521:9;21512:7;21508:23;21504:32;21501:2;;;21549:1;21546;21539:12;21501:2;21582:9;21576:16;-1:-1:-1;;;;;21607:6:1;21604:30;21601:2;;;21647:1;21644;21637:12;21601:2;21670:60;21722:7;21713:6;21702:9;21698:22;21670:60;:::i;21741:401::-;21841:6;21894:2;21882:9;21873:7;21869:23;21865:32;21862:2;;;21910:1;21907;21900:12;21862:2;21950:9;21937:23;-1:-1:-1;;;;;21975:6:1;21972:30;21969:2;;;22015:1;22012;22005:12;21969:2;22038:22;;22094:3;22076:16;;;22072:26;22069:2;;;22111:1;22108;22101:12;22147:388;22256:6;22309:2;22297:9;22288:7;22284:23;22280:32;22277:2;;;22325:1;22322;22315:12;22277:2;22358:9;22352:16;-1:-1:-1;;;;;22383:6:1;22380:30;22377:2;;;22423:1;22420;22413:12;22377:2;22446:83;22521:7;22512:6;22501:9;22497:22;22446:83;:::i;22540:184::-;22610:6;22663:2;22651:9;22642:7;22638:23;22634:32;22631:2;;;22679:1;22676;22669:12;22631:2;-1:-1:-1;22702:16:1;;22621:103;-1:-1:-1;22621:103:1:o;22729:457::-;22824:6;22832;22840;22848;22901:3;22889:9;22880:7;22876:23;22872:33;22869:2;;;22918:1;22915;22908:12;22869:2;22950:9;22944:16;23000:4;22993:5;22989:16;22982:5;22979:27;22969:2;;23020:1;23017;23010:12;22969:2;23088;23073:18;;23067:25;23132:2;23117:18;;23111:25;23176:2;23161:18;;;23155:25;23043:5;;23067:25;;-1:-1:-1;23155:25:1;;-1:-1:-1;22859:327:1;-1:-1:-1;;;22859:327:1:o;23308:522::-;23408:6;23403:3;23396:19;23378:3;23434:4;23463:2;23458:3;23454:12;23447:19;;23489:5;23512:1;23522:283;23536:6;23533:1;23530:13;23522:283;;;23613:6;23600:20;23633:33;23658:7;23633:33;:::i;:::-;-1:-1:-1;;;;;23691:33:1;23679:46;;23745:12;;;;23780:15;;;;23721:1;23551:9;23522:283;;;-1:-1:-1;23821:3:1;;23386:444;-1:-1:-1;;;;;23386:444:1:o;23835:461::-;23888:3;23926:5;23920:12;23953:6;23948:3;23941:19;23979:4;24008:2;24003:3;23999:12;23992:19;;24045:2;24038:5;24034:14;24066:1;24076:195;24090:6;24087:1;24084:13;24076:195;;;24155:13;;-1:-1:-1;;;;;24151:39:1;24139:52;;24211:12;;;;24246:15;;;;24187:1;24105:9;24076:195;;24301:495;24362:3;24400:5;24394:12;24427:6;24422:3;24415:19;24453:4;24482:2;24477:3;24473:12;24466:19;;24504:5;24501:1;24494:16;24546:2;24543:1;24533:16;24567:1;24577:194;24591:6;24588:1;24585:13;24577:194;;;24656:13;;-1:-1:-1;;;;;24652:39:1;24640:52;;24712:12;;;;24688:1;24747:14;;;;24606:9;24577:194;;24801:589;24864:3;24902:5;24896:12;24929:6;24924:3;24917:19;24955:4;24984:2;24979:3;24975:12;24968:19;;25009:3;25049:6;25046:1;25042:14;25037:3;25033:24;25091:2;25084:5;25080:14;25112:1;25122:242;25136:6;25133:1;25130:13;25122:242;;;25207:5;25201:4;25197:16;25192:3;25185:29;25235:49;25279:4;25270:6;25264:13;25235:49;:::i;:::-;25342:12;;;;25227:57;-1:-1:-1;25307:15:1;;;;25158:1;25151:9;25122:242;;25395:354;25483:19;;;25465:3;-1:-1:-1;;;;;25514:31:1;;25511:2;;;25558:1;25555;25548:12;25511:2;25594:6;25591:1;25587:14;25646:8;25639:5;25632:4;25627:3;25623:14;25610:45;25723:1;25678:18;;25698:4;25674:29;25712:13;;;-1:-1:-1;25674:29:1;;25473:276;-1:-1:-1;;25473:276:1:o;25754:435::-;25807:3;25845:5;25839:12;25872:6;25867:3;25860:19;25898:4;25927:2;25922:3;25918:12;25911:19;;25964:2;25957:5;25953:14;25985:1;25995:169;26009:6;26006:1;26003:13;25995:169;;;26070:13;;26058:26;;26104:12;;;;26139:15;;;;26031:1;26024:9;25995:169;;26290:257;26331:3;26369:5;26363:12;26396:6;26391:3;26384:19;26412:63;26468:6;26461:4;26456:3;26452:14;26445:4;26438:5;26434:16;26412:63;:::i;:::-;26529:2;26508:15;-1:-1:-1;;26504:29:1;26495:39;;;;26536:4;26491:50;;26339:208;-1:-1:-1;;26339:208:1:o;26552:1063::-;26636:12;;26601:3;;26691:1;26711:18;;;;26764;;;;26791:2;;26845:4;26837:6;26833:17;26823:27;;26791:2;26871;26919;26911:6;26908:14;26888:18;26885:38;26882:2;;;26965:10;26960:3;26956:20;26953:1;26946:31;27000:4;26997:1;26990:15;27028:4;27025:1;27018:15;26882:2;60390:19;;;60442:4;60433:14;;27140:18;27167:104;;;;27285:1;27280:329;;;;27133:476;;27167:104;-1:-1:-1;;27202:24:1;;27188:39;;27247:14;;;;-1:-1:-1;27167:104:1;;27280:329;60239:1;60232:14;;;60276:4;60263:18;;27385:1;27399:167;27413:6;27410:1;27407:13;27399:167;;;27493:14;;27478:13;;;27471:37;27536:16;;;;27428:10;;27399:167;;;27586:13;;;-1:-1:-1;;27133:476:1;;;;;;;;26609:1006;;;;:::o;27620:1338::-;27741:12;;-1:-1:-1;;;;;23265:31:1;23253:44;;27671:3;27699:6;27805:4;27798:5;27794:16;27788:23;27843:2;27836:4;27831:3;27827:14;27820:26;27867:56;27919:2;27914:3;27910:12;27896;27867:56;:::i;:::-;27855:68;;;27972:4;27965:5;27961:16;27955:23;27948:4;27943:3;27939:14;27932:47;28028:4;28021:5;28017:16;28011:23;28004:4;27999:3;27995:14;27988:47;28084:4;28077:5;28073:16;28067:23;28060:4;28055:3;28051:14;28044:47;28139:4;28132:5;28128:16;28122:23;28154:58;28206:4;28201:3;28197:14;28181;-1:-1:-1;;;;;23265:31:1;23253:44;;23243:60;28154:58;;28260:4;28253:5;28249:16;28243:23;28308:3;28302:4;28298:14;28291:4;28286:3;28282:14;28275:38;28336:50;28381:4;28365:14;28336:50;:::i;:::-;28322:64;;;28434:4;28427:5;28423:16;28417:23;28484:3;28476:6;28472:16;28465:4;28460:3;28456:14;28449:40;28512:52;28557:6;28541:14;28512:52;:::i;:::-;28498:66;;;28583:6;28637:2;28630:5;28626:14;28620:21;28650:45;28691:2;28686:3;28682:12;28666:14;26264:13;26257:21;26245:34;;26235:50;28650:45;-1:-1:-1;;28714:6:1;28756:14;;;28750:21;28736:12;;;28729:43;28791:6;28834:14;;;28828:21;28879:16;;;28865:12;;;28858:38;28912:40;28883:6;28828:21;28912:40;:::i;28963:1218::-;29026:3;29054:6;29069:75;29140:3;29096:42;29131:5;29125:12;-1:-1:-1;;;;;61503:31:1;;61482:58;29096:42;-1:-1:-1;;;;;23265:31:1;23253:44;;23243:60;29069:75;29176:2;29169:4;29164:3;29160:14;29153:26;29200:68;29264:2;29259:3;29255:12;29248:4;29241:5;29237:16;29200:68;:::i;:::-;29188:80;;29317:4;29310:5;29306:16;29300:23;29293:4;29288:3;29284:14;29277:47;29373:4;29366:5;29362:16;29356:23;29349:4;29344:3;29340:14;29333:47;29429:4;29422:5;29418:16;29412:23;29405:4;29400:3;29396:14;29389:47;29465:53;29511:4;29504:5;29500:16;29494:23;-1:-1:-1;;;;;61503:31:1;;61482:58;29465:53;-1:-1:-1;;;;;23265:31:1;29577:4;29568:14;;23253:44;29615:14;;;29608:4;29599:14;;29592:38;29653:60;29619:4;29701;29690:16;;29653:60;:::i;:::-;29639:74;;29757:3;29749:6;29745:16;29738:4;29733:3;29729:14;29722:40;29785:62;29840:6;29833:4;29826:5;29822:16;29785:62;:::i;:::-;29771:76;;29878:64;29935:4;29928:5;29924:16;29918:23;64046:4;64030:21;;64011:46;29878:64;26264:13;26257:21;29992:6;29983:16;;26245:34;30051:4;30040:16;;30034:23;30025:6;30016:16;;30009:49;30092:16;;;30083:6;30074:16;;30067:42;30125:50;30096:6;30161:4;30150:16;;30125:50;:::i;30186:359::-;30371:19;;;30428:2;30424:15;;;;-1:-1:-1;;30420:53:1;30415:2;30406:12;;30399:75;30499:2;30490:12;;30483:28;30536:2;30527:12;;30361:184::o;30550:274::-;30679:3;30717:6;30711:13;30733:53;30779:6;30774:3;30767:4;30759:6;30755:17;30733:53;:::i;:::-;30802:16;;;;;30687:137;-1:-1:-1;;30687:137:1:o;31506:759::-;-1:-1:-1;;;;;31811:15:1;;;31793:34;;31863:15;;31858:2;31843:18;;31836:43;-1:-1:-1;;;;;;31915:33:1;;31910:2;31895:18;;31888:61;31773:3;31980:2;31965:18;;31958:31;;;32005:19;;31998:35;;;31736:4;32026:6;32076;32070:3;32055:19;;32042:49;32141:1;32135:3;32126:6;32115:9;32111:22;32107:32;32100:43;32211:3;32204:2;32200:7;32195:2;32187:6;32183:15;32179:29;32168:9;32164:45;32160:55;32152:63;;32252:6;32246:3;32235:9;32231:19;32224:35;31745:520;;;;;;;;;:::o;32945:496::-;-1:-1:-1;;;;;33222:15:1;;;33204:34;;33269:2;33254:18;;33247:34;;;33317:15;;33312:2;33297:18;;33290:43;33369:3;33364:2;33349:18;;33342:31;;;33147:4;;33390:45;;33415:19;;33407:6;33390:45;:::i;33446:569::-;33668:4;33714:1;33710;33705:3;33701:11;33697:19;33755:2;33747:6;33743:15;33732:9;33725:34;33795:6;33790:2;33779:9;33775:18;33768:34;33838:3;33833:2;33822:9;33818:18;33811:31;33859:45;33899:3;33888:9;33884:19;33876:6;33859:45;:::i;:::-;33940:15;;;33935:2;33920:18;;33913:43;33993:15;;;;33987:3;33972:19;;;33965:44;-1:-1:-1;33851:53:1;33677:338;-1:-1:-1;;;33677:338:1:o;34020:669::-;34355:2;34344:9;34337:21;34318:4;34381:56;34433:2;34422:9;34418:18;34410:6;34381:56;:::i;:::-;34485:9;34477:6;34473:22;34468:2;34457:9;34453:18;34446:50;34519:44;34556:6;34548;34519:44;:::i;:::-;34505:58;;34611:9;34603:6;34599:22;34594:2;34583:9;34579:18;34572:50;34639:44;34676:6;34668;34639:44;:::i;34694:981::-;35143:3;35132:9;35125:22;35106:4;35170:57;35222:3;35211:9;35207:19;35199:6;35170:57;:::i;:::-;35275:9;35267:6;35263:22;35258:2;35247:9;35243:18;35236:50;35309:44;35346:6;35338;35309:44;:::i;:::-;35295:58;;35401:9;35393:6;35389:22;35384:2;35373:9;35369:18;35362:50;35435:44;35472:6;35464;35435:44;:::i;:::-;35421:58;;35527:9;35519:6;35515:22;35510:2;35499:9;35495:18;35488:50;35555:44;35592:6;35584;35555:44;:::i;:::-;35547:52;;;35665:1;35661;35656:3;35652:11;35648:19;35640:6;35636:32;35630:3;35619:9;35615:19;35608:61;35115:560;;;;;;;;:::o;35680:1131::-;35998:2;35987:9;35980:21;35961:4;36024:64;36084:2;36073:9;36069:18;36061:6;36024:64;:::i;:::-;36107:2;36157:9;36149:6;36145:22;36140:2;36129:9;36125:18;36118:50;36191:32;36216:6;36208;36191:32;:::i;:::-;36177:46;;36271:9;36263:6;36259:22;36254:2;36243:9;36239:18;36232:50;36302:6;36337;36331:13;36368:6;36360;36353:22;36403:2;36395:6;36391:15;36384:22;;36462:2;36452:6;36449:1;36445:14;36437:6;36433:27;36429:36;36500:2;36492:6;36488:15;36521:1;36531:251;36545:6;36542:1;36539:13;36531:251;;;36635:2;36631:7;36622:6;36614;36610:19;36606:33;36601:3;36594:46;36663:39;36695:6;36686;36680:13;36663:39;:::i;:::-;36760:12;;;;36653:49;-1:-1:-1;36725:15:1;;;;36567:1;36560:9;36531:251;;;-1:-1:-1;36799:6:1;;35970:841;-1:-1:-1;;;;;;;;;;35970:841:1:o;36816:849::-;37301:2;37290:9;37283:21;37264:4;37327:66;37389:2;37378:9;37374:18;37366:6;37327:66;:::i;:::-;37441:9;37433:6;37429:22;37424:2;37413:9;37409:18;37402:50;37475:54;37522:6;37514;37475:54;:::i;:::-;37461:68;;37577:9;37569:6;37565:22;37560:2;37549:9;37545:18;37538:50;37605:54;37652:6;37644;37605:54;:::i;37670:632::-;37841:2;37893:21;;;37963:13;;37866:18;;;37985:22;;;37812:4;;37841:2;38064:15;;;;38038:2;38023:18;;;37812:4;38107:169;38121:6;38118:1;38115:13;38107:169;;;38182:13;;38170:26;;38251:15;;;;38216:12;;;;38143:1;38136:9;38107:169;;;-1:-1:-1;38293:3:1;;37821:481;-1:-1:-1;;;;;;37821:481:1:o;38307:1070::-;38517:4;38546:2;38586;38575:9;38571:18;38616:2;38605:9;38598:21;38639:6;38674;38668:13;38705:6;38697;38690:22;38731:2;38721:12;;38764:2;38753:9;38749:18;38742:25;;38826:2;38816:6;38813:1;38809:14;38798:9;38794:30;38790:39;38864:2;38856:6;38852:15;38885:1;38895:453;38909:6;38906:1;38903:13;38895:453;;;38974:22;;;-1:-1:-1;;38970:36:1;38958:49;;39030:13;;39075:9;;-1:-1:-1;;;;;39071:35:1;39056:51;;39146:11;;39140:18;39178:15;;;39171:27;;;39221:47;39252:15;;;39140:18;39221:47;:::i;:::-;39326:12;;;;39211:57;-1:-1:-1;;39291:15:1;;;;38931:1;38924:9;38895:453;;;-1:-1:-1;39365:6:1;;38526:851;-1:-1:-1;;;;;;;;38526:851:1:o;39382:844::-;39576:4;39605:2;39645;39634:9;39630:18;39675:2;39664:9;39657:21;39698:6;39733;39727:13;39764:6;39756;39749:22;39802:2;39791:9;39787:18;39780:25;;39864:2;39854:6;39851:1;39847:14;39836:9;39832:30;39828:39;39814:53;;39902:2;39894:6;39890:15;39923:1;39933:264;39947:6;39944:1;39941:13;39933:264;;;40040:2;40036:7;40024:9;40016:6;40012:22;40008:36;40003:3;39996:49;40068;40110:6;40101;40095:13;40068:49;:::i;:::-;40058:59;-1:-1:-1;40175:12:1;;;;40140:15;;;;39969:1;39962:9;39933:264;;;-1:-1:-1;40214:6:1;;39585:641;-1:-1:-1;;;;;;;39585:641:1:o;40423:298::-;40606:6;40599:14;40592:22;40581:9;40574:41;40651:2;40646;40635:9;40631:18;40624:30;40555:4;40671:44;40711:2;40700:9;40696:18;40688:6;40671:44;:::i;41277:1235::-;41535:4;41583:2;41572:9;41568:18;41613:6;41602:9;41595:25;41639:2;41677;41672;41661:9;41657:18;41650:30;41700:6;41735;41729:13;41766:6;41758;41751:22;41804:3;41793:9;41789:19;41782:26;;41867:3;41857:6;41854:1;41850:14;41839:9;41835:30;41831:40;41817:54;;41906:2;41898:6;41894:15;41927:1;41937:481;41951:6;41948:1;41945:13;41937:481;;;42016:22;;;-1:-1:-1;;42012:37:1;42000:50;;42073:13;;42145:9;;-1:-1:-1;;;;;42141:35:1;42126:51;;42216:11;;42210:18;42109:4;42248:15;;;42241:27;;;42291:47;42322:15;;;42210:18;42291:47;:::i;:::-;42281:57;-1:-1:-1;;;42396:12:1;;;;42361:15;;;;41973:1;41966:9;41937:481;;;-1:-1:-1;;;;;;;;;23265:31:1;;42500:4;42485:20;;23253:44;-1:-1:-1;42435:6:1;-1:-1:-1;42450:56:1;23243:60;42517:614;42804:6;42793:9;42786:25;42847:3;42842:2;42831:9;42827:18;42820:31;42767:4;42868:55;42918:3;42907:9;42903:19;42895:6;42868:55;:::i;:::-;-1:-1:-1;;;;;42997:15:1;;;42992:2;42977:18;;42970:43;43049:15;;;;43044:2;43029:18;;43022:43;43109:14;;43102:22;43096:3;43081:19;;;43074:51;42860:63;42776:355;-1:-1:-1;;;42776:355:1:o;43136:509::-;43390:6;43379:9;43372:25;43433:3;43428:2;43417:9;43413:18;43406:31;43353:4;43454:67;43516:3;43505:9;43501:19;43493:6;43454:67;:::i;:::-;43564:14;;43557:22;43552:2;43537:18;;43530:50;-1:-1:-1;43623:14:1;;43616:22;43611:2;43596:18;;;43589:50;43446:75;43362:283;-1:-1:-1;;43362:283:1:o;44110:217::-;44257:2;44246:9;44239:21;44220:4;44277:44;44317:2;44306:9;44302:18;44294:6;44277:44;:::i;50766:1406::-;50973:2;50962:9;50955:21;50936:4;51011:6;51005:13;51054:4;51049:2;51038:9;51034:18;51027:32;51082:63;51140:3;51129:9;51125:19;51111:12;51082:63;:::i;:::-;51068:77;;51194:2;51186:6;51182:15;51176:22;51221:2;51217:7;51288:2;51276:9;51268:6;51264:22;51260:31;51255:2;51244:9;51240:18;51233:59;51315:52;51360:6;51344:14;51315:52;:::i;:::-;51301:66;;51416:2;51408:6;51404:15;51398:22;51376:44;;51484:2;51472:9;51464:6;51460:22;51456:31;51451:2;51440:9;51436:18;51429:59;51511:52;51556:6;51540:14;51511:52;:::i;:::-;51497:66;;51645:1;51641;51636:3;51632:11;51628:19;51622:2;51614:6;51610:15;51604:22;51600:48;51594:3;51583:9;51579:19;51572:77;51698:3;51690:6;51686:16;51680:23;51658:45;;51712:63;51770:3;51759:9;51755:19;51739:14;-1:-1:-1;;;;;23265:31:1;23253:44;;23243:60;51712:63;51824:3;51816:6;51812:16;51806:23;51784:45;;51894:2;51882:9;51874:6;51870:22;51866:31;51860:3;51849:9;51845:19;51838:60;51921:52;51966:6;51950:14;51921:52;:::i;:::-;51907:66;;52022:3;52014:6;52010:16;52004:23;51982:45;;52093:2;52081:9;52073:6;52069:22;52065:31;52058:4;52047:9;52043:20;52036:61;;52114:52;52159:6;52143:14;52114:52;:::i;52177:2017::-;52458:6;52447:9;52440:25;52501:2;52496;52485:9;52481:18;52474:30;52421:4;52547:58;52598:6;52590;52547:58;:::i;:::-;52641:4;52636:2;52625:9;52621:18;52614:32;52669:86;52750:3;52739:9;52735:19;52721:12;52707;52669:86;:::i;:::-;52655:100;;;52802:67;52865:2;52857:6;52853:15;52845:6;52802:67;:::i;:::-;52892:2;52888:7;52959:2;52947:9;52939:6;52935:22;52931:31;52926:2;52915:9;52911:18;52904:59;52986:77;53056:6;53040:14;53024;52986:77;:::i;:::-;52972:91;;53110:67;53173:2;53165:6;53161:15;53153:6;53110:67;:::i;:::-;53072:105;;;;53242:2;53230:9;53222:6;53218:22;53214:31;53208:3;53197:9;53193:19;53186:60;53269:77;53339:6;53323:14;53307;53269:77;:::i;:::-;53255:91;;53393:2;53385:6;53381:15;53368:29;53355:42;;53406:31;53431:5;53406:31;:::i;:::-;-1:-1:-1;;;;;23265:31:1;;53495:3;53480:19;;23253:44;53524:36;53555:3;53547:6;53543:16;53524:36;:::i;:::-;-1:-1:-1;;;;;23265:31:1;;53620:3;53605:19;;23253:44;53509:51;-1:-1:-1;53672:68:1;53735:3;53727:6;53723:16;53715:6;53672:68;:::i;:::-;53634:106;;;;53806:2;53794:9;53786:6;53782:22;53778:31;53771:4;53760:9;53756:20;53749:61;53833:77;53903:6;53887:14;53871;53833:77;:::i;:::-;53819:91;;53957:68;54020:3;54012:6;54008:16;54000:6;53957:68;:::i;:::-;53919:106;;;;54090:2;54078:9;54070:6;54066:22;54062:31;54056:3;54045:9;54041:19;54034:60;;54111:77;54181:6;54165:14;54149;54111:77;:::i;:::-;54103:85;52430:1764;-1:-1:-1;;;;;;;52430:1764:1:o;54199:1522::-;54478:6;54467:9;54460:25;54521:2;54516;54505:9;54501:18;54494:30;54441:4;54559:6;54553:13;54602:4;54597:2;54586:9;54582:18;54575:32;54630:63;54688:3;54677:9;54673:19;54659:12;54630:63;:::i;:::-;54616:77;;54742:2;54734:6;54730:15;54724:22;54769:2;54765:7;54836:2;54824:9;54816:6;54812:22;54808:31;54803:2;54792:9;54788:18;54781:59;54863:52;54908:6;54892:14;54863:52;:::i;:::-;54849:66;;54964:2;54956:6;54952:15;54946:22;54924:44;;55033:2;55021:9;55013:6;55009:22;55005:31;54999:3;54988:9;54984:19;54977:60;55060:52;55105:6;55089:14;55060:52;:::i;:::-;55171:2;55159:15;;55153:22;-1:-1:-1;;;;;55149:48:1;55185:3;55128:19;;55121:77;55247:3;55235:16;;55229:23;55046:66;;-1:-1:-1;55229:23:1;-1:-1:-1;55261:63:1;55319:3;55304:19;;55229:23;-1:-1:-1;;;;;23265:31:1;23253:44;;23243:60;55261:63;55373:3;55365:6;55361:16;55355:23;55333:45;;55444:2;55432:9;55424:6;55420:22;55416:31;55409:4;55398:9;55394:20;55387:61;55471:52;55516:6;55500:14;55471:52;:::i;:::-;55457:66;;55572:3;55564:6;55560:16;55554:23;55532:45;;55642:2;55630:9;55622:6;55618:22;55614:31;55608:3;55597:9;55593:19;55586:60;;55663:52;55708:6;55692:14;55663:52;:::i;55726:261::-;55907:2;55896:9;55889:21;55870:4;55927:54;55977:2;55966:9;55962:18;55954:6;55927:54;:::i;55992:270::-;56170:2;56159:9;56152:21;56133:4;56190:66;56252:2;56241:9;56237:18;56229:6;56190:66;:::i;57565:545::-;57658:4;57664:6;57724:11;57711:25;57818:2;57814:7;57803:8;57787:14;57783:29;57779:43;57759:18;57755:68;57745:2;;57837:1;57834;57827:12;57745:2;57864:33;;57916:20;;;-1:-1:-1;;;;;;57948:30:1;;57945:2;;;57991:1;57988;57981:12;57945:2;58024:4;58012:17;;-1:-1:-1;58075:1:1;58071:14;;;58055;58051:35;58041:46;;58038:2;;;58100:1;58097;58090:12;58115:521;58192:4;58198:6;58258:11;58245:25;58352:2;58348:7;58337:8;58321:14;58317:29;58313:43;58293:18;58289:68;58279:2;;58371:1;58368;58361:12;58279:2;58398:33;;58450:20;;;-1:-1:-1;;;;;;58482:30:1;;58479:2;;;58525:1;58522;58515:12;58479:2;58558:4;58546:17;;-1:-1:-1;58589:14:1;58585:27;;;58575:38;;58572:2;;;58626:1;58623;58616:12;58641:330;58740:4;58798:11;58785:25;58892:2;58888:7;58877:8;58861:14;58857:29;58853:43;58833:18;58829:68;58819:2;;58911:1;58908;58901:12;58976:253;59048:2;59042:9;59090:4;59078:17;;-1:-1:-1;;;;;59110:34:1;;59146:22;;;59107:62;59104:2;;;59172:18;;:::i;:::-;59208:2;59201:22;59022:207;:::o;59234:257::-;59306:4;59300:11;;;59338:17;;-1:-1:-1;;;;;59370:34:1;;59406:22;;;59367:62;59364:2;;;59432:18;;:::i;59496:275::-;59567:2;59561:9;59632:2;59613:13;;-1:-1:-1;;59609:27:1;59597:40;;-1:-1:-1;;;;;59652:34:1;;59688:22;;;59649:62;59646:2;;;59714:18;;:::i;:::-;59750:2;59743:22;59541:230;;-1:-1:-1;59541:230:1:o;59776:183::-;59836:4;-1:-1:-1;;;;;59861:6:1;59858:30;59855:2;;;59891:18;;:::i;:::-;-1:-1:-1;59936:1:1;59932:14;59948:4;59928:25;;59845:114::o;59964:186::-;60012:4;-1:-1:-1;;;;;60037:6:1;60034:30;60031:2;;;60067:18;;:::i;:::-;-1:-1:-1;60133:2:1;60112:15;-1:-1:-1;;60108:29:1;60139:4;60104:40;;60021:129::o;60458:523::-;60528:5;60535:6;60595:3;60582:17;60681:2;60677:7;60666:8;60650:14;60646:29;60642:43;60622:18;60618:68;60608:2;;60700:1;60697;60690:12;60608:2;60728:33;;60832:4;60819:18;;;-1:-1:-1;60780:21:1;;-1:-1:-1;;;;;;60849:30:1;;60846:2;;;60892:1;60889;60882:12;60846:2;60949:6;60946:1;60942:14;60926;60922:35;60912:8;60908:50;60905:2;;;60971:1;60968;60961:12;60986:128;61026:3;61057:1;61053:6;61050:1;61047:13;61044:2;;;61063:18;;:::i;:::-;-1:-1:-1;61099:9:1;;61034:80::o;61119:168::-;61159:7;61225:1;61221;61217:6;61213:14;61210:1;61207:21;61202:1;61195:9;61188:17;61184:45;61181:2;;;61232:18;;:::i;:::-;-1:-1:-1;61272:9:1;;61171:116::o;61292:125::-;61332:4;61360:1;61357;61354:8;61351:2;;;61365:18;;:::i;:::-;-1:-1:-1;61402:9:1;;61341:76::o;61545:1739::-;61659:9;61693:4;61741:2;61733:5;61717:14;61713:26;61709:35;61706:2;;;61757:1;61754;61747:12;61706:2;61785:22;;:::i;:::-;61843:5;61830:19;-1:-1:-1;;;;;61909:2:1;61901:6;61898:14;61895:2;;;61925:1;61922;61915:12;61895:2;61948:18;;;;62004:14;61997:4;61989:13;;61985:34;61975:2;;62033:1;62030;62023:12;61975:2;62069;62056:16;62091:4;62115:60;62131:43;62171:2;62131:43;:::i;62115:60::-;62209:15;;;62240:12;;;;62272:11;;;62328:14;62314:1;62310:10;;;62302:19;;62298:28;;62295:48;62292:2;;;62356:1;62353;62346:12;62292:2;62378:1;62388:764;62402:2;62399:1;62396:9;62388:764;;;62479:3;62466:17;62515:2;62502:11;62499:19;62496:2;;;62531:1;62528;62521:12;62496:2;62558:20;;62606:14;62602:23;;;-1:-1:-1;;62598:37:1;62594:46;-1:-1:-1;62591:2:1;;;62653:1;62650;62643:12;62591:2;62685:22;;:::i;:::-;62756:2;62752;62748:11;62735:25;62773:33;62798:7;62773:33;:::i;:::-;62819:24;;62885:11;;;62872:25;62913:16;;;62910:2;;;62942:1;62939;62932:12;62910:2;62984:60;63029:14;63024:2;63013:8;63009:2;63005:17;63001:26;62984:60;:::i;:::-;62966:16;;;62959:86;-1:-1:-1;63058:20:1;;-1:-1:-1;63098:12:1;;;;63130;;;;62420:1;62413:9;62388:764;;;-1:-1:-1;;63161:22:1;;-1:-1:-1;63217:31:1;63233:14;;;63217:31;:::i;:::-;63199:16;;;63192:57;-1:-1:-1;63203:7:1;;61673:1611;-1:-1:-1;;;;;61673:1611:1:o;63289:258::-;63361:1;63371:113;63385:6;63382:1;63379:13;63371:113;;;63461:11;;;63455:18;63442:11;;;63435:39;63407:2;63400:10;63371:113;;;63502:6;63499:1;63496:13;63493:2;;;-1:-1:-1;;63537:1:1;63519:16;;63512:27;63342:205::o;63552:380::-;63631:1;63627:12;;;;63674;;;63695:2;;63749:4;63741:6;63737:17;63727:27;;63695:2;63802;63794:6;63791:14;63771:18;63768:38;63765:2;;;63848:10;63843:3;63839:20;63836:1;63829:31;63883:4;63880:1;63873:15;63911:4;63908:1;63901:15;63765:2;;63607:325;;;:::o;64062:135::-;64101:3;-1:-1:-1;;64122:17:1;;64119:2;;;64142:18;;:::i;:::-;-1:-1:-1;64189:1:1;64178:13;;64109:88::o;64202:127::-;64263:10;64258:3;64254:20;64251:1;64244:31;64294:4;64291:1;64284:15;64318:4;64315:1;64308:15;64334:127;64395:10;64390:3;64386:20;64383:1;64376:31;64426:4;64423:1;64416:15;64450:4;64447:1;64440:15;64466:127;64527:10;64522:3;64518:20;64515:1;64508:31;64558:4;64555:1;64548:15;64582:4;64579:1;64572:15;64598:131;-1:-1:-1;;;;;64673:31:1;;64663:42;;64653:2;;64719:1;64716;64709:12;64734:118;64820:5;64813:13;64806:21;64799:5;64796:32;64786:2;;64842:1;64839;64832:12

Swarm Source

ipfs://9a029d7fff6ca122242fdc548ecfa70a6ea9adaa0d6ef3916b3d9b7c38ef3e29

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.