Contract 0xe95E3a9f1a45B5EDa71781448F6047d7B7e31cbF 1

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9467eaad332fbdf8534cc5654fec41267168d97478200f5efe8fe58919facb5fReset Signers105449002022-06-09 4:45:12112 days 6 hrs ago0x58b529f9084d7eaa598eb3477fe36064c5b7bbc1 IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001182402 26
0x941611311305e6f2c6e8900434ada11d12a1aa89331d03d239b06e8dd0333a47Notify Reset Sig...105448842022-06-09 4:44:35112 days 6 hrs ago0x58b529f9084d7eaa598eb3477fe36064c5b7bbc1 IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.000824226 26
0x69b13be93ad5a7336bcca1525517133f2f093ea25dc644059e938dfd59dde7d4Update Signers101064982022-05-26 8:45:36126 days 2 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.0018008 25
0xd8dfcc18cbfd6636f0cc0ae233bbc4249ea0a13da6ab9c8bdf24a27a741320b7Update Signers100275222022-05-24 3:06:43128 days 7 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.00180225 25
0x665659d6ddf35bcac68cf1d44363afb8ab24f3125a97ab04bb5bac0e261f98d5Update Signers98155592022-05-18 4:45:33134 days 6 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801825 25
0xd193eccef91f999a1152019bf7dd67ed2aec9bb8d5b420185059ce01bea14210Update Signers90938052022-04-29 6:35:42153 days 4 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.00180255 25
0xb192175508f68f4b4ff150f69726150cce116892097e4d12fdd4c4a0a3dd534bUpdate Signers90507672022-04-28 4:13:33154 days 6 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.00180255 25
0xcb97a5e88dfedf6ae1b76709bc60bc5d906a6731e99a916863f6e4ed80b7d550Update Signers89533832022-04-25 13:54:20156 days 20 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801275 25
0xa02894ac545e59e0ee380ef1d2eb49f67c90f437df667ef23d3ebe0a83abb198Update Signers88887052022-04-23 21:58:08158 days 12 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.00180255 25
0x5409ff5744506e0395ed0ff9da92e238128da73df8c058da18a69dd6d7deb0acUpdate Signers88229932022-04-22 6:49:07160 days 3 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001802125 25
0xb8f62363364fc8085f76dff54d769cab86334746ffcef1c42beadf22f00fbdedUpdate Signers87037492022-04-19 2:54:59163 days 7 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.0018017 25
0xdf332103c0eb311f4a2358bbeea438f846a0a10ddeae8dde539762aede6e9ca8Update Signers82669992022-04-07 4:36:02175 days 6 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801225 25
0x6af7d2b8d8703339fe80342618d3eb55bee60ebfa398979d2b97938b6a860dfcUpdate Signers81867032022-04-05 4:36:30177 days 6 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.0018014 25
0x39f23ed29fc257e0c2312906026fc4864c3b47fb56256816fa1c866dec6a714bUpdate Signers79685882022-03-30 14:13:31182 days 20 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801825 25
0x2d01e4350bf12ca425c6032cbf764d07832d1fc6aa26902cfeebc02c32a7fa7cUpdate Signers78666912022-03-28 3:54:42185 days 6 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.00180225 25
0x6d42016ee84716bffbce9111ce77ed6813e6a6472359236424702f4d8cedf9cbUpdate Signers77620942022-03-25 14:26:34187 days 20 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801225 25
0xa085f3bd2030731eab851553aeb23181df33914249dd6964480ba406e38c62a4Update Signers76635492022-03-23 6:19:06190 days 4 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001802125 25
0xbacabe159a0a722867f82d61d3bdbf2e72629dc8b76fbf9644a76a84b68c9ca4Update Signers75729952022-03-21 3:53:50192 days 6 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.0018014 25
0x6af9c46fe280c22b5f882c535131cf6fa24e8455a5a1d93145ae31959f31d617Update Signers73606382022-03-16 5:29:03197 days 5 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801825 25
0xfd5d315c0e33ad5499f136246a19e17e6b1b2292ce676597ebb4a714fc5b7288Update Signers72838402022-03-14 9:29:33199 days 1 hr ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001800675 25
0x4665d0da28e428ca5131dc041285602961905a47ff01afaee98f09b036ef380dUpdate Signers71159552022-03-10 9:48:21203 days 59 mins ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001800375 25
0x8ff0afb4126d4bf960e23daf75b0f49ac58df83a1edcdef0f1488b9d13c02c63Update Signers70730492022-03-09 9:44:18204 days 1 hr ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001801825 25
0x82ec99efd92dcf5e937ac348b89025ec4e0d6cb0b26dd377a10960ad77f39f6cUpdate Signers70302132022-03-08 9:41:41205 days 1 hr ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.001802125 25
0x78681bca7f211d4c06530d44e3bbb3c49b7b007214120014afbae0fa79cc3169Update Signers69870912022-03-07 9:17:41206 days 1 hr ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.0018017 25
0x6bc3de2333d331c671c76f4d4b084309006b168d01ea9b3e59ad953a7fd88d96Update Signers68621992022-03-04 9:58:44209 days 49 mins ago0xa500023551388763b720808c0b0cdf00a752b69f IN 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX0.0018115 25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7dac6309557b772591a11ee8fe2d875398bd82b687f009ad5157821b77a54576136856302022-09-19 20:59:479 days 13 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x7dac6309557b772591a11ee8fe2d875398bd82b687f009ad5157821b77a54576136856302022-09-19 20:59:479 days 13 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x7dac6309557b772591a11ee8fe2d875398bd82b687f009ad5157821b77a54576136856302022-09-19 20:59:479 days 13 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x7dac6309557b772591a11ee8fe2d875398bd82b687f009ad5157821b77a54576136856302022-09-19 20:59:479 days 13 hrs ago 0xe9533976c590200e32d95c53f06ae12d292cfc470xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX
0x21a79d6d0b396d953b0d310202d2e28153fa124ccab34b4c684266c9678f913f135756882022-09-16 15:13:5312 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x21a79d6d0b396d953b0d310202d2e28153fa124ccab34b4c684266c9678f913f135756882022-09-16 15:13:5312 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x21a79d6d0b396d953b0d310202d2e28153fa124ccab34b4c684266c9678f913f135756882022-09-16 15:13:5312 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x21a79d6d0b396d953b0d310202d2e28153fa124ccab34b4c684266c9678f913f135756882022-09-16 15:13:5312 days 19 hrs ago 0xe9533976c590200e32d95c53f06ae12d292cfc470xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX
0xdede74d73f2d2f0207c389f18438062a7361eef0bce02a0e1be67a88fd487a6a135753512022-09-16 15:01:2112 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xdede74d73f2d2f0207c389f18438062a7361eef0bce02a0e1be67a88fd487a6a135753512022-09-16 15:01:2112 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xdede74d73f2d2f0207c389f18438062a7361eef0bce02a0e1be67a88fd487a6a135753512022-09-16 15:01:2112 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xdede74d73f2d2f0207c389f18438062a7361eef0bce02a0e1be67a88fd487a6a135753512022-09-16 15:01:2112 days 19 hrs ago 0xe9533976c590200e32d95c53f06ae12d292cfc470xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX
0x16d512c22a4a00c5965afbb312f2d40792495f1cce55e4819e26bf77bfc9c2df135746282022-09-16 14:32:5712 days 20 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x16d512c22a4a00c5965afbb312f2d40792495f1cce55e4819e26bf77bfc9c2df135746282022-09-16 14:32:5712 days 20 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x16d512c22a4a00c5965afbb312f2d40792495f1cce55e4819e26bf77bfc9c2df135746282022-09-16 14:32:5712 days 20 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0x16d512c22a4a00c5965afbb312f2d40792495f1cce55e4819e26bf77bfc9c2df135746282022-09-16 14:32:5712 days 20 hrs ago 0xe9533976c590200e32d95c53f06ae12d292cfc470xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX
0xfa6e0caf701529c31b3f6c8a7f53262d621b15eacfcb1b5f89890eaefd1bb06e135639162022-09-16 6:48:4713 days 3 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xfa6e0caf701529c31b3f6c8a7f53262d621b15eacfcb1b5f89890eaefd1bb06e135639162022-09-16 6:48:4713 days 3 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xfa6e0caf701529c31b3f6c8a7f53262d621b15eacfcb1b5f89890eaefd1bb06e135639162022-09-16 6:48:4713 days 3 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xfa6e0caf701529c31b3f6c8a7f53262d621b15eacfcb1b5f89890eaefd1bb06e135639162022-09-16 6:48:4713 days 3 hrs ago 0xe9533976c590200e32d95c53f06ae12d292cfc470xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX
0xe780a2492af2079129a3e2802d130d4ad4cc0a430e614ecc4bf6fd761b80bab4135638442022-09-16 6:45:4013 days 4 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xe780a2492af2079129a3e2802d130d4ad4cc0a430e614ecc4bf6fd761b80bab4135638442022-09-16 6:45:4013 days 4 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xe780a2492af2079129a3e2802d130d4ad4cc0a430e614ecc4bf6fd761b80bab4135638442022-09-16 6:45:4013 days 4 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
0xe780a2492af2079129a3e2802d130d4ad4cc0a430e614ecc4bf6fd761b80bab4135638442022-09-16 6:45:4013 days 4 hrs ago 0xe9533976c590200e32d95c53f06ae12d292cfc470xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0 AVAX
0x5218aa827e06bc60e6eb380fb7450e20273f27312cf8f039867e6b6d3d691a9b135462692022-09-15 15:46:4413 days 19 hrs ago 0xe95e3a9f1a45b5eda71781448f6047d7b7e31cbf0x00000000000000000000000000000000000000010 AVAX
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x49BB7eA1Aa8f2F667aA317a1e6fDD8A44B988925

Contract Name:
Bridge

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 20 : Bridge.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./libraries/PbBridge.sol";
import "./Pool.sol";

contract Bridge is Pool {
    using SafeERC20 for IERC20;

    // liquidity events
    event Send(
        bytes32 transferId,
        address sender,
        address receiver,
        address token,
        uint256 amount,
        uint64 dstChainId,
        uint64 nonce,
        uint32 maxSlippage
    );
    event Relay(
        bytes32 transferId,
        address sender,
        address receiver,
        address token,
        uint256 amount,
        uint64 srcChainId,
        bytes32 srcTransferId
    );
    // gov events
    event MinSendUpdated(address token, uint256 amount);
    event MaxSendUpdated(address token, uint256 amount);

    mapping(bytes32 => bool) public transfers;
    mapping(address => uint256) public minSend; // send _amount must > minSend
    mapping(address => uint256) public maxSend;

    // min allowed max slippage uint32 value is slippage * 1M, eg. 0.5% -> 5000
    uint32 public minimalMaxSlippage;

    /**
     * @notice Send a cross-chain transfer via the liquidity pool-based bridge.
     * NOTE: This function DOES NOT SUPPORT fee-on-transfer / rebasing tokens.
     * @param _receiver The address of the receiver.
     * @param _token The address of the token.
     * @param _amount The amount of the transfer.
     * @param _dstChainId The destination chain ID.
     * @param _nonce A number input to guarantee uniqueness of transferId. Can be timestamp in practice.
     * @param _maxSlippage The max slippage accepted, given as percentage in point (pip). Eg. 5000 means 0.5%.
     * Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least (100% - max slippage percentage) * amount or the
     * transfer can be refunded.
     */
    function send(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage // slippage * 1M, eg. 0.5% -> 5000
    ) external nonReentrant whenNotPaused {
        bytes32 transferId = _send(_receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        emit Send(transferId, msg.sender, _receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
    }

    /**
     * @notice Send a cross-chain transfer via the liquidity pool-based bridge using the native token.
     * @param _receiver The address of the receiver.
     * @param _amount The amount of the transfer.
     * @param _dstChainId The destination chain ID.
     * @param _nonce A unique number. Can be timestamp in practice.
     * @param _maxSlippage The max slippage accepted, given as percentage in point (pip). Eg. 5000 means 0.5%.
     * Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least (100% - max slippage percentage) * amount or the
     * transfer can be refunded.
     */
    function sendNative(
        address _receiver,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage
    ) external payable nonReentrant whenNotPaused {
        require(msg.value == _amount, "Amount mismatch");
        require(nativeWrap != address(0), "Native wrap not set");
        bytes32 transferId = _send(_receiver, nativeWrap, _amount, _dstChainId, _nonce, _maxSlippage);
        IWETH(nativeWrap).deposit{value: _amount}();
        emit Send(transferId, msg.sender, _receiver, nativeWrap, _amount, _dstChainId, _nonce, _maxSlippage);
    }

    function _send(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage
    ) private returns (bytes32) {
        require(_amount > minSend[_token], "amount too small");
        require(maxSend[_token] == 0 || _amount <= maxSend[_token], "amount too large");
        require(_maxSlippage > minimalMaxSlippage, "max slippage too small");
        bytes32 transferId = keccak256(
            // uint64(block.chainid) for consistency as entire system uses uint64 for chain id
            // len = 20 + 20 + 20 + 32 + 8 + 8 + 8 = 116
            abi.encodePacked(msg.sender, _receiver, _token, _amount, _dstChainId, _nonce, uint64(block.chainid))
        );
        require(transfers[transferId] == false, "transfer exists");
        transfers[transferId] = true;
        return transferId;
    }

    /**
     * @notice Relay a cross-chain transfer sent from a liquidity pool-based bridge on another chain.
     * @param _relayRequest The serialized Relay protobuf.
     * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by
     * +2/3 of the bridge's current signing power to be delivered.
     * @param _signers The sorted list of signers.
     * @param _powers The signing powers of the signers.
     */
    function relay(
        bytes calldata _relayRequest,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external whenNotPaused {
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "Relay"));
        verifySigs(abi.encodePacked(domain, _relayRequest), _sigs, _signers, _powers);
        PbBridge.Relay memory request = PbBridge.decRelay(_relayRequest);
        // len = 20 + 20 + 20 + 32 + 8 + 8 + 32 = 140
        bytes32 transferId = keccak256(
            abi.encodePacked(
                request.sender,
                request.receiver,
                request.token,
                request.amount,
                request.srcChainId,
                request.dstChainId,
                request.srcTransferId
            )
        );
        require(transfers[transferId] == false, "transfer exists");
        transfers[transferId] = true;
        _updateVolume(request.token, request.amount);
        uint256 delayThreshold = delayThresholds[request.token];
        if (delayThreshold > 0 && request.amount > delayThreshold) {
            _addDelayedTransfer(transferId, request.receiver, request.token, request.amount);
        } else {
            _sendToken(request.receiver, request.token, request.amount);
        }

        emit Relay(
            transferId,
            request.sender,
            request.receiver,
            request.token,
            request.amount,
            request.srcChainId,
            request.srcTransferId
        );
    }

    function setMinSend(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
        require(_tokens.length == _amounts.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            minSend[_tokens[i]] = _amounts[i];
            emit MinSendUpdated(_tokens[i], _amounts[i]);
        }
    }

    function setMaxSend(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
        require(_tokens.length == _amounts.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            maxSend[_tokens[i]] = _amounts[i];
            emit MaxSendUpdated(_tokens[i], _amounts[i]);
        }
    }

    function setMinimalMaxSlippage(uint32 _minimalMaxSlippage) external onlyGovernor {
        minimalMaxSlippage = _minimalMaxSlippage;
    }

    // This is needed to receive ETH when calling `IWETH.withdraw`
    receive() external payable {}
}

File 2 of 20 : PbBridge.sol
// SPDX-License-Identifier: GPL-3.0-only

// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: bridge.proto
pragma solidity 0.8.9;
import "./Pb.sol";

library PbBridge {
    using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj

    struct Relay {
        address sender; // tag: 1
        address receiver; // tag: 2
        address token; // tag: 3
        uint256 amount; // tag: 4
        uint64 srcChainId; // tag: 5
        uint64 dstChainId; // tag: 6
        bytes32 srcTransferId; // tag: 7
    } // end struct Relay

    function decRelay(bytes memory raw) internal pure returns (Relay memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint256 tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {}
            // solidity has no switch/case
            else if (tag == 1) {
                m.sender = Pb._address(buf.decBytes());
            } else if (tag == 2) {
                m.receiver = Pb._address(buf.decBytes());
            } else if (tag == 3) {
                m.token = Pb._address(buf.decBytes());
            } else if (tag == 4) {
                m.amount = Pb._uint256(buf.decBytes());
            } else if (tag == 5) {
                m.srcChainId = uint64(buf.decVarint());
            } else if (tag == 6) {
                m.dstChainId = uint64(buf.decVarint());
            } else if (tag == 7) {
                m.srcTransferId = Pb._bytes32(buf.decBytes());
            } else {
                buf.skipValue(wire);
            } // skip value of unknown tag
        }
    } // end decoder Relay
}

File 3 of 20 : Pb.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

// runtime proto sol library
library Pb {
    enum WireType {
        Varint,
        Fixed64,
        LengthDelim,
        StartGroup,
        EndGroup,
        Fixed32
    }

    struct Buffer {
        uint256 idx; // the start index of next read. when idx=b.length, we're done
        bytes b; // hold serialized proto msg, readonly
    }

    // create a new in-memory Buffer object from raw msg bytes
    function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) {
        buf.b = raw;
        buf.idx = 0;
    }

    // whether there are unread bytes
    function hasMore(Buffer memory buf) internal pure returns (bool) {
        return buf.idx < buf.b.length;
    }

    // decode current field number and wiretype
    function decKey(Buffer memory buf) internal pure returns (uint256 tag, WireType wiretype) {
        uint256 v = decVarint(buf);
        tag = v / 8;
        wiretype = WireType(v & 7);
    }

    // count tag occurrences, return an array due to no memory map support
    // have to create array for (maxtag+1) size. cnts[tag] = occurrences
    // should keep buf.idx unchanged because this is only a count function
    function cntTags(Buffer memory buf, uint256 maxtag) internal pure returns (uint256[] memory cnts) {
        uint256 originalIdx = buf.idx;
        cnts = new uint256[](maxtag + 1); // protobuf's tags are from 1 rather than 0
        uint256 tag;
        WireType wire;
        while (hasMore(buf)) {
            (tag, wire) = decKey(buf);
            cnts[tag] += 1;
            skipValue(buf, wire);
        }
        buf.idx = originalIdx;
    }

    // read varint from current buf idx, move buf.idx to next read, return the int value
    function decVarint(Buffer memory buf) internal pure returns (uint256 v) {
        bytes10 tmp; // proto int is at most 10 bytes (7 bits can be used per byte)
        bytes memory bb = buf.b; // get buf.b mem addr to use in assembly
        v = buf.idx; // use v to save one additional uint variable
        assembly {
            tmp := mload(add(add(bb, 32), v)) // load 10 bytes from buf.b[buf.idx] to tmp
        }
        uint256 b; // store current byte content
        v = 0; // reset to 0 for return value
        for (uint256 i = 0; i < 10; i++) {
            assembly {
                b := byte(i, tmp) // don't use tmp[i] because it does bound check and costs extra
            }
            v |= (b & 0x7F) << (i * 7);
            if (b & 0x80 == 0) {
                buf.idx += i + 1;
                return v;
            }
        }
        revert(); // i=10, invalid varint stream
    }

    // read length delimited field and return bytes
    function decBytes(Buffer memory buf) internal pure returns (bytes memory b) {
        uint256 len = decVarint(buf);
        uint256 end = buf.idx + len;
        require(end <= buf.b.length); // avoid overflow
        b = new bytes(len);
        bytes memory bufB = buf.b; // get buf.b mem addr to use in assembly
        uint256 bStart;
        uint256 bufBStart = buf.idx;
        assembly {
            bStart := add(b, 32)
            bufBStart := add(add(bufB, 32), bufBStart)
        }
        for (uint256 i = 0; i < len; i += 32) {
            assembly {
                mstore(add(bStart, i), mload(add(bufBStart, i)))
            }
        }
        buf.idx = end;
    }

    // return packed ints
    function decPacked(Buffer memory buf) internal pure returns (uint256[] memory t) {
        uint256 len = decVarint(buf);
        uint256 end = buf.idx + len;
        require(end <= buf.b.length); // avoid overflow
        // array in memory must be init w/ known length
        // so we have to create a tmp array w/ max possible len first
        uint256[] memory tmp = new uint256[](len);
        uint256 i = 0; // count how many ints are there
        while (buf.idx < end) {
            tmp[i] = decVarint(buf);
            i++;
        }
        t = new uint256[](i); // init t with correct length
        for (uint256 j = 0; j < i; j++) {
            t[j] = tmp[j];
        }
        return t;
    }

    // move idx pass current value field, to beginning of next tag or msg end
    function skipValue(Buffer memory buf, WireType wire) internal pure {
        if (wire == WireType.Varint) {
            decVarint(buf);
        } else if (wire == WireType.LengthDelim) {
            uint256 len = decVarint(buf);
            buf.idx += len; // skip len bytes value data
            require(buf.idx <= buf.b.length); // avoid overflow
        } else {
            revert();
        } // unsupported wiretype
    }

    // type conversion help utils
    function _bool(uint256 x) internal pure returns (bool v) {
        return x != 0;
    }

    function _uint256(bytes memory b) internal pure returns (uint256 v) {
        require(b.length <= 32); // b's length must be smaller than or equal to 32
        assembly {
            v := mload(add(b, 32))
        } // load all 32bytes to v
        v = v >> (8 * (32 - b.length)); // only first b.length is valid
    }

    function _address(bytes memory b) internal pure returns (address v) {
        v = _addressPayable(b);
    }

    function _addressPayable(bytes memory b) internal pure returns (address payable v) {
        require(b.length == 20);
        //load 32bytes then shift right 12 bytes
        assembly {
            v := div(mload(add(b, 32)), 0x1000000000000000000000000)
        }
    }

    function _bytes32(bytes memory b) internal pure returns (bytes32 v) {
        require(b.length == 32);
        assembly {
            v := mload(add(b, 32))
        }
    }

    // uint[] to uint8[]
    function uint8s(uint256[] memory arr) internal pure returns (uint8[] memory t) {
        t = new uint8[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = uint8(arr[i]);
        }
    }

    function uint32s(uint256[] memory arr) internal pure returns (uint32[] memory t) {
        t = new uint32[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = uint32(arr[i]);
        }
    }

    function uint64s(uint256[] memory arr) internal pure returns (uint64[] memory t) {
        t = new uint64[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = uint64(arr[i]);
        }
    }

    function bools(uint256[] memory arr) internal pure returns (bool[] memory t) {
        t = new bool[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = arr[i] != 0;
        }
    }
}

File 4 of 20 : Pool.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./interfaces/IWETH.sol";
import "./libraries/PbPool.sol";
import "./safeguard/Pauser.sol";
import "./safeguard/VolumeControl.sol";
import "./safeguard/DelayedTransfer.sol";
import "./Signers.sol";

// add liquidity and withdraw
// withdraw can be used by user or liquidity provider

contract Pool is Signers, ReentrancyGuard, Pauser, VolumeControl, DelayedTransfer {
    using SafeERC20 for IERC20;

    uint64 public addseq; // ensure unique LiquidityAdded event, start from 1
    mapping(address => uint256) public minAdd; // add _amount must > minAdd

    // map of successful withdraws, if true means already withdrew money or added to delayedTransfers
    mapping(bytes32 => bool) public withdraws;

    // erc20 wrap of gas token of this chain, eg. WETH, when relay ie. pay out,
    // if request.token equals this, will withdraw and send native token to receiver
    // note we don't check whether it's zero address. when this isn't set, and request.token
    // is all 0 address, guarantee fail
    address public nativeWrap;

    // liquidity events
    event LiquidityAdded(
        uint64 seqnum,
        address provider,
        address token,
        uint256 amount // how many tokens were added
    );
    event WithdrawDone(
        bytes32 withdrawId,
        uint64 seqnum,
        address receiver,
        address token,
        uint256 amount,
        bytes32 refid
    );
    event MinAddUpdated(address token, uint256 amount);

    /**
     * @notice Add liquidity to the pool-based bridge.
     * NOTE: This function DOES NOT SUPPORT fee-on-transfer / rebasing tokens.
     * NOTE: ONLY call this from an EOA. DO NOT call from a contract address.
     * @param _token The address of the token.
     * @param _amount The amount to add.
     */
    function addLiquidity(address _token, uint256 _amount) external nonReentrant whenNotPaused {
        require(_amount > minAdd[_token], "amount too small");
        addseq += 1;
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        emit LiquidityAdded(addseq, msg.sender, _token, _amount);
    }

    /**
     * @notice Add native token liquidity to the pool-based bridge.
     * NOTE: ONLY call this from an EOA. DO NOT call from a contract address.
     * @param _amount The amount to add.
     */
    function addNativeLiquidity(uint256 _amount) external payable nonReentrant whenNotPaused {
        require(msg.value == _amount, "Amount mismatch");
        require(nativeWrap != address(0), "Native wrap not set");
        require(_amount > minAdd[nativeWrap], "amount too small");
        addseq += 1;
        IWETH(nativeWrap).deposit{value: _amount}();
        emit LiquidityAdded(addseq, msg.sender, nativeWrap, _amount);
    }

    /**
     * @notice Withdraw funds from the bridge pool.
     * @param _wdmsg The serialized Withdraw protobuf.
     * @param _sigs The list of signatures sorted by signing addresses in ascending order. A withdrawal must be
     * signed-off by +2/3 of the bridge's current signing power to be delivered.
     * @param _signers The sorted list of signers.
     * @param _powers The signing powers of the signers.
     */
    function withdraw(
        bytes calldata _wdmsg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external whenNotPaused {
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "WithdrawMsg"));
        verifySigs(abi.encodePacked(domain, _wdmsg), _sigs, _signers, _powers);
        // decode and check wdmsg
        PbPool.WithdrawMsg memory wdmsg = PbPool.decWithdrawMsg(_wdmsg);
        // len = 8 + 8 + 20 + 20 + 32 = 88
        bytes32 wdId = keccak256(
            abi.encodePacked(wdmsg.chainid, wdmsg.seqnum, wdmsg.receiver, wdmsg.token, wdmsg.amount)
        );
        require(withdraws[wdId] == false, "withdraw already succeeded");
        withdraws[wdId] = true;
        _updateVolume(wdmsg.token, wdmsg.amount);
        uint256 delayThreshold = delayThresholds[wdmsg.token];
        if (delayThreshold > 0 && wdmsg.amount > delayThreshold) {
            _addDelayedTransfer(wdId, wdmsg.receiver, wdmsg.token, wdmsg.amount);
        } else {
            _sendToken(wdmsg.receiver, wdmsg.token, wdmsg.amount);
        }
        emit WithdrawDone(wdId, wdmsg.seqnum, wdmsg.receiver, wdmsg.token, wdmsg.amount, wdmsg.refid);
    }

    function executeDelayedTransfer(bytes32 id) external whenNotPaused {
        delayedTransfer memory transfer = _executeDelayedTransfer(id);
        _sendToken(transfer.receiver, transfer.token, transfer.amount);
    }

    function setMinAdd(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
        require(_tokens.length == _amounts.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            minAdd[_tokens[i]] = _amounts[i];
            emit MinAddUpdated(_tokens[i], _amounts[i]);
        }
    }

    function _sendToken(
        address _receiver,
        address _token,
        uint256 _amount
    ) internal {
        if (_token == nativeWrap) {
            // withdraw then transfer native to receiver
            IWETH(nativeWrap).withdraw(_amount);
            (bool sent, ) = _receiver.call{value: _amount, gas: 50000}("");
            require(sent, "failed to send native token");
        } else {
            IERC20(_token).safeTransfer(_receiver, _amount);
        }
    }

    // set nativeWrap, for relay requests, if token == nativeWrap, will withdraw first then transfer native to receiver
    function setWrap(address _weth) external onlyOwner {
        nativeWrap = _weth;
    }
}

File 5 of 20 : IWETH.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface IWETH {
    function deposit() external payable;

    function withdraw(uint256) external;
}

File 6 of 20 : PbPool.sol
// SPDX-License-Identifier: GPL-3.0-only

// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: contracts/libraries/proto/pool.proto
pragma solidity 0.8.9;
import "./Pb.sol";

library PbPool {
    using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj

    struct WithdrawMsg {
        uint64 chainid; // tag: 1
        uint64 seqnum; // tag: 2
        address receiver; // tag: 3
        address token; // tag: 4
        uint256 amount; // tag: 5
        bytes32 refid; // tag: 6
    } // end struct WithdrawMsg

    function decWithdrawMsg(bytes memory raw) internal pure returns (WithdrawMsg memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint256 tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {}
            // solidity has no switch/case
            else if (tag == 1) {
                m.chainid = uint64(buf.decVarint());
            } else if (tag == 2) {
                m.seqnum = uint64(buf.decVarint());
            } else if (tag == 3) {
                m.receiver = Pb._address(buf.decBytes());
            } else if (tag == 4) {
                m.token = Pb._address(buf.decBytes());
            } else if (tag == 5) {
                m.amount = Pb._uint256(buf.decBytes());
            } else if (tag == 6) {
                m.refid = Pb._bytes32(buf.decBytes());
            } else {
                buf.skipValue(wire);
            } // skip value of unknown tag
        }
    } // end decoder WithdrawMsg
}

File 7 of 20 : Pauser.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

abstract contract Pauser is Ownable, Pausable {
    mapping(address => bool) public pausers;

    event PauserAdded(address account);
    event PauserRemoved(address account);

    constructor() {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender), "Caller is not pauser");
        _;
    }

    function pause() public onlyPauser {
        _pause();
    }

    function unpause() public onlyPauser {
        _unpause();
    }

    function isPauser(address account) public view returns (bool) {
        return pausers[account];
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function removePauser(address account) public onlyOwner {
        _removePauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) private {
        require(!isPauser(account), "Account is already pauser");
        pausers[account] = true;
        emit PauserAdded(account);
    }

    function _removePauser(address account) private {
        require(isPauser(account), "Account is not pauser");
        pausers[account] = false;
        emit PauserRemoved(account);
    }
}

File 8 of 20 : VolumeControl.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "./Governor.sol";

abstract contract VolumeControl is Governor {
    uint256 public epochLength; // seconds
    mapping(address => uint256) public epochVolumes; // key is token
    mapping(address => uint256) public epochVolumeCaps; // key is token
    mapping(address => uint256) public lastOpTimestamps; // key is token

    event EpochLengthUpdated(uint256 length);
    event EpochVolumeUpdated(address token, uint256 cap);

    function setEpochLength(uint256 _length) external onlyGovernor {
        epochLength = _length;
        emit EpochLengthUpdated(_length);
    }

    function setEpochVolumeCaps(address[] calldata _tokens, uint256[] calldata _caps) external onlyGovernor {
        require(_tokens.length == _caps.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            epochVolumeCaps[_tokens[i]] = _caps[i];
            emit EpochVolumeUpdated(_tokens[i], _caps[i]);
        }
    }

    function _updateVolume(address _token, uint256 _amount) internal {
        if (epochLength == 0) {
            return;
        }
        uint256 cap = epochVolumeCaps[_token];
        if (cap == 0) {
            return;
        }
        uint256 volume = epochVolumes[_token];
        uint256 timestamp = block.timestamp;
        uint256 epochStartTime = (timestamp / epochLength) * epochLength;
        if (lastOpTimestamps[_token] < epochStartTime) {
            volume = _amount;
        } else {
            volume += _amount;
        }
        require(volume <= cap, "volume exceeds cap");
        epochVolumes[_token] = volume;
        lastOpTimestamps[_token] = timestamp;
    }
}

File 9 of 20 : Governor.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";

abstract contract Governor is Ownable {
    mapping(address => bool) public governors;

    event GovernorAdded(address account);
    event GovernorRemoved(address account);

    modifier onlyGovernor() {
        require(isGovernor(msg.sender), "Caller is not governor");
        _;
    }

    constructor() {
        _addGovernor(msg.sender);
    }

    function isGovernor(address _account) public view returns (bool) {
        return governors[_account];
    }

    function addGovernor(address _account) public onlyOwner {
        _addGovernor(_account);
    }

    function removeGovernor(address _account) public onlyOwner {
        _removeGovernor(_account);
    }

    function renounceGovernor() public {
        _removeGovernor(msg.sender);
    }

    function _addGovernor(address _account) private {
        require(!isGovernor(_account), "Account is already governor");
        governors[_account] = true;
        emit GovernorAdded(_account);
    }

    function _removeGovernor(address _account) private {
        require(isGovernor(_account), "Account is not governor");
        governors[_account] = false;
        emit GovernorRemoved(_account);
    }
}

File 10 of 20 : DelayedTransfer.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "./Governor.sol";

abstract contract DelayedTransfer is Governor {
    struct delayedTransfer {
        address receiver;
        address token;
        uint256 amount;
        uint256 timestamp;
    }
    mapping(bytes32 => delayedTransfer) public delayedTransfers;
    mapping(address => uint256) public delayThresholds;
    uint256 public delayPeriod; // in seconds

    event DelayedTransferAdded(bytes32 id);
    event DelayedTransferExecuted(bytes32 id, address receiver, address token, uint256 amount);

    event DelayPeriodUpdated(uint256 period);
    event DelayThresholdUpdated(address token, uint256 threshold);

    function setDelayThresholds(address[] calldata _tokens, uint256[] calldata _thresholds) external onlyGovernor {
        require(_tokens.length == _thresholds.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            delayThresholds[_tokens[i]] = _thresholds[i];
            emit DelayThresholdUpdated(_tokens[i], _thresholds[i]);
        }
    }

    function setDelayPeriod(uint256 _period) external onlyGovernor {
        delayPeriod = _period;
        emit DelayPeriodUpdated(_period);
    }

    function _addDelayedTransfer(
        bytes32 id,
        address receiver,
        address token,
        uint256 amount
    ) internal {
        require(delayedTransfers[id].timestamp == 0, "delayed transfer already exists");
        delayedTransfers[id] = delayedTransfer({
            receiver: receiver,
            token: token,
            amount: amount,
            timestamp: block.timestamp
        });
        emit DelayedTransferAdded(id);
    }

    // caller needs to do the actual token transfer
    function _executeDelayedTransfer(bytes32 id) internal returns (delayedTransfer memory) {
        delayedTransfer memory transfer = delayedTransfers[id];
        require(transfer.timestamp > 0, "delayed transfer not exist");
        require(block.timestamp > transfer.timestamp + delayPeriod, "delayed transfer still locked");
        delete delayedTransfers[id];
        emit DelayedTransferExecuted(id, transfer.receiver, transfer.token, transfer.amount);
        return transfer;
    }
}

File 11 of 20 : Signers.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/ISigsVerifier.sol";

contract Signers is Ownable, ISigsVerifier {
    using ECDSA for bytes32;

    bytes32 public ssHash;
    uint256 public triggerTime; // timestamp when last update was triggered

    // reset can be called by the owner address for emergency recovery
    uint256 public resetTime;
    uint256 public noticePeriod; // advance notice period as seconds for reset
    uint256 constant MAX_INT = 2**256 - 1;

    event SignersUpdated(address[] _signers, uint256[] _powers);

    event ResetNotification(uint256 resetTime);

    /**
     * @notice Verifies that a message is signed by a quorum among the signers
     * The sigs must be sorted by signer addresses in ascending order.
     * @param _msg signed message
     * @param _sigs list of signatures sorted by signer addresses in ascending order
     * @param _signers sorted list of current signers
     * @param _powers powers of current signers
     */
    function verifySigs(
        bytes memory _msg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) public view override {
        bytes32 h = keccak256(abi.encodePacked(_signers, _powers));
        require(ssHash == h, "Mismatch current signers");
        _verifySignedPowers(keccak256(_msg).toEthSignedMessageHash(), _sigs, _signers, _powers);
    }

    /**
     * @notice Update new signers.
     * @param _newSigners sorted list of new signers
     * @param _curPowers powers of new signers
     * @param _sigs list of signatures sorted by signer addresses in ascending order
     * @param _curSigners sorted list of current signers
     * @param _curPowers powers of current signers
     */
    function updateSigners(
        uint256 _triggerTime,
        address[] calldata _newSigners,
        uint256[] calldata _newPowers,
        bytes[] calldata _sigs,
        address[] calldata _curSigners,
        uint256[] calldata _curPowers
    ) external {
        // use trigger time for nonce protection, must be ascending
        require(_triggerTime > triggerTime, "Trigger time is not increasing");
        // make sure triggerTime is not too large, as it cannot be decreased once set
        require(_triggerTime < block.timestamp + 3600, "Trigger time is too large");
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "UpdateSigners"));
        verifySigs(abi.encodePacked(domain, _triggerTime, _newSigners, _newPowers), _sigs, _curSigners, _curPowers);
        _updateSigners(_newSigners, _newPowers);
        triggerTime = _triggerTime;
    }

    /**
     * @notice reset signers, only used for init setup and emergency recovery
     */
    function resetSigners(address[] calldata _signers, uint256[] calldata _powers) external onlyOwner {
        require(block.timestamp > resetTime, "not reach reset time");
        resetTime = MAX_INT;
        _updateSigners(_signers, _powers);
    }

    function notifyResetSigners() external onlyOwner {
        resetTime = block.timestamp + noticePeriod;
        emit ResetNotification(resetTime);
    }

    function increaseNoticePeriod(uint256 period) external onlyOwner {
        require(period > noticePeriod, "notice period can only be increased");
        noticePeriod = period;
    }

    // separate from verifySigs func to avoid "stack too deep" issue
    function _verifySignedPowers(
        bytes32 _hash,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) private pure {
        require(_signers.length == _powers.length, "signers and powers length not match");
        uint256 totalPower; // sum of all signer.power
        for (uint256 i = 0; i < _signers.length; i++) {
            totalPower += _powers[i];
        }
        uint256 quorum = (totalPower * 2) / 3 + 1;

        uint256 signedPower; // sum of signer powers who are in sigs
        address prev = address(0);
        uint256 index = 0;
        for (uint256 i = 0; i < _sigs.length; i++) {
            address signer = _hash.recover(_sigs[i]);
            require(signer > prev, "signers not in ascending order");
            prev = signer;
            // now find match signer add its power
            while (signer > _signers[index]) {
                index += 1;
                require(index < _signers.length, "signer not found");
            }
            if (signer == _signers[index]) {
                signedPower += _powers[index];
            }
            if (signedPower >= quorum) {
                // return early to save gas
                return;
            }
        }
        revert("quorum not reached");
    }

    function _updateSigners(address[] calldata _signers, uint256[] calldata _powers) private {
        require(_signers.length == _powers.length, "signers and powers length not match");
        address prev = address(0);
        for (uint256 i = 0; i < _signers.length; i++) {
            require(_signers[i] > prev, "New signers not in ascending order");
            prev = _signers[i];
        }
        ssHash = keccak256(abi.encodePacked(_signers, _powers));
        emit SignersUpdated(_signers, _powers);
    }
}

File 12 of 20 : ISigsVerifier.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface ISigsVerifier {
    /**
     * @notice Verifies that a message is signed by a quorum among the signers.
     * @param _msg signed message
     * @param _sigs list of signatures sorted by signer addresses in ascending order
     * @param _signers sorted list of current signers
     * @param _powers powers of current signers
     */
    function verifySigs(
        bytes memory _msg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external view;
}

File 13 of 20 : IERC20.sol
// SPDX-License-Identifier: MIT

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 14 of 20 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 15 of 20 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 16 of 20 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 17 of 20 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 18 of 20 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 19 of 20 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 20 of 20 : ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return recover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return recover(hash, r, vs);
        } else {
            revert("ECDSA: invalid signature length");
        }
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(
            uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
            "ECDSA: invalid signature 's' value"
        );
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"DelayPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"DelayThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"DelayedTransferAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelayedTransferExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"EpochLengthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"EpochVolumeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"seqnum","type":"uint64"},{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxSendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinAddUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinSendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTransferId","type":"bytes32"}],"name":"Relay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"resetTime","type":"uint256"}],"name":"ResetNotification","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChainId","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"uint32","name":"maxSlippage","type":"uint32"}],"name":"Send","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_signers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"SignersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"withdrawId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"seqnum","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"refid","type":"bytes32"}],"name":"WithdrawDone","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addNativeLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addseq","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delayThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"delayedTransfers","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumeCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"executeDelayedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"increaseNoticePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastOpTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxSend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minSend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalMaxSlippage","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeWrap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifyResetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_relayRequest","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"relay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"resetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint32","name":"_maxSlippage","type":"uint32"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint32","name":"_maxSlippage","type":"uint32"}],"name":"sendNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setDelayPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_thresholds","type":"uint256[]"}],"name":"setDelayThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"setEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_caps","type":"uint256[]"}],"name":"setEpochVolumeCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMaxSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minimalMaxSlippage","type":"uint32"}],"name":"setMinimalMaxSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"name":"setWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ssHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_triggerTime","type":"uint256"},{"internalType":"address[]","name":"_newSigners","type":"address[]"},{"internalType":"uint256[]","name":"_newPowers","type":"uint256[]"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_curSigners","type":"address[]"},{"internalType":"uint256[]","name":"_curPowers","type":"uint256[]"}],"name":"updateSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_msg","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"verifySigs","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_wdmsg","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdraws","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506200001d3362000048565b60016005556006805460ff19169055620000373362000098565b620000423362000162565b62000222565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526007602052604090205460ff1615620001075760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064015b60405180910390fd5b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f891015b60405180910390a150565b6001600160a01b03811660009081526008602052604090205460ff1615620001cd5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f7200000000006044820152606401620000fe565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b5910162000157565b61505e80620002326000396000f3fe60806040526004361061036f5760003560e01c806382dc1ec4116101c6578063ba2cb25c116100f7578063e43581b811610095578063f20c922a1161006f578063f20c922a14610acf578063f2fde38b14610aef578063f832138314610b0f578063f8b30d7d14610b3c57600080fd5b8063e43581b814610a56578063e999e5f414610a8f578063eecdac8814610aaf57600080fd5b8063d0790da9116100d1578063d0790da9146109cb578063e026049c146109e1578063e09ab428146109f6578063e3eece2614610a2657600080fd5b8063ba2cb25c1461095e578063ccde517a1461097e578063cdd1b25d146109ab57600080fd5b80639ff9001a11610164578063a7bdf45a1161013e578063a7bdf45a14610881578063adc0d57f146108a1578063b1c94d941461091b578063b5f2bc471461093157600080fd5b80639ff9001a14610821578063a21a928014610841578063a5977fbb1461086157600080fd5b806389e39127116101a057806389e39127146107935780638da5cb5b146107cd5780639b14d4c6146107eb5780639e25fc5c1461080157600080fd5b806382dc1ec41461073e5780638456cb591461075e578063878fe1ce1461077357600080fd5b806352532faa116102a057806365a114f11161023e5780636ef8d66d116102185780636ef8d66d146106d15780637044c89e146106e6578063715018a6146106f957806380f51c121461070e57600080fd5b806365a114f11461067b578063682dbc22146106915780636b2c0f55146106b157600080fd5b806357d775f81161027a57806357d775f8146105f35780635c975abb1461060957806360216b0014610621578063618ee0551461064e57600080fd5b806352532faa1461058657806354eea796146105b357806356688700146105d357600080fd5b80633d5721071161030d578063457bfa2f116102e7578063457bfa2f146104d557806346fbf68e1461050d57806347b16c6c14610546578063482341261461056657600080fd5b80633d5721071461048d5780633f2e5fc3146104ad5780633f4ba83a146104c057600080fd5b80632fd1b0a4116103495780632fd1b0a4146103d2578063370fb47b146104095780633c4a25d01461042d5780633c64f04b1461044d57600080fd5b8063089927411461037b57806317bdbae51461039d57806325c38b9f146103bd57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b6103963660046147b9565b610b69565b005b3480156103a957600080fd5b5061039b6103b83660046147b9565b610d0c565b3480156103c957600080fd5b5061039b610ea3565b3480156103de57600080fd5b506017546103ef9063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561041557600080fd5b5061041f60025481565b604051908152602001610400565b34801561043957600080fd5b5061039b610448366004614841565b610f33565b34801561045957600080fd5b5061047d61046836600461485c565b60146020526000908152604090205460ff1681565b6040519015158152602001610400565b34801561049957600080fd5b5061039b6104a836600461485c565b610f87565b61039b6104bb3660046148a1565b61101b565b3480156104cc57600080fd5b5061039b611271565b3480156104e157600080fd5b506013546104f5906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b34801561051957600080fd5b5061047d610528366004614841565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561055257600080fd5b5061039b6105613660046147b9565b6112da565b34801561057257600080fd5b5061039b6105813660046148ff565b611471565b34801561059257600080fd5b5061041f6105a1366004614841565b600e6020526000908152604090205481565b3480156105bf57600080fd5b5061039b6105ce36600461485c565b6114e5565b3480156105df57600080fd5b5061039b6105ee36600461491a565b611572565b3480156105ff57600080fd5b5061041f60095481565b34801561061557600080fd5b5060065460ff1661047d565b34801561062d57600080fd5b5061041f61063c366004614841565b600a6020526000908152604090205481565b34801561065a57600080fd5b5061041f610669366004614841565b60166020526000908152604090205481565b34801561068757600080fd5b5061041f60035481565b34801561069d57600080fd5b5061039b6106ac36600461495a565b611734565b3480156106bd57600080fd5b5061039b6106cc366004614841565b611820565b3480156106dd57600080fd5b5061039b611871565b61039b6106f436600461485c565b61187a565b34801561070557600080fd5b5061039b611b2c565b34801561071a57600080fd5b5061047d610729366004614841565b60076020526000908152604090205460ff1681565b34801561074a57600080fd5b5061039b610759366004614841565b611b7e565b34801561076a57600080fd5b5061039b611bcf565b34801561077f57600080fd5b5061039b61078e3660046147b9565b611c36565b34801561079f57600080fd5b506010546107b49067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610400565b3480156107d957600080fd5b506000546001600160a01b03166104f5565b3480156107f757600080fd5b5061041f60045481565b34801561080d57600080fd5b5061039b61081c36600461485c565b611dcd565b34801561082d57600080fd5b5061039b61083c366004614841565b611e3b565b34801561084d57600080fd5b5061039b61085c366004614a88565b611ea5565b34801561086d57600080fd5b5061039b61087c366004614b77565b6121ec565b34801561088d57600080fd5b5061039b61089c3660046147b9565b61233a565b3480156108ad57600080fd5b506108f06108bc36600461485c565b600d6020526000908152604090208054600182015460028301546003909301546001600160a01b0392831693919092169184565b604080516001600160a01b039586168152949093166020850152918301526060820152608001610400565b34801561092757600080fd5b5061041f600f5481565b34801561093d57600080fd5b5061041f61094c366004614841565b600b6020526000908152604090205481565b34801561096a57600080fd5b5061039b610979366004614be4565b6123eb565b34801561098a57600080fd5b5061041f610999366004614841565b60116020526000908152604090205481565b3480156109b757600080fd5b5061039b6109c6366004614a88565b612541565b3480156109d757600080fd5b5061041f60015481565b3480156109ed57600080fd5b5061039b612866565b348015610a0257600080fd5b5061047d610a1136600461485c565b60126020526000908152604090205460ff1681565b348015610a3257600080fd5b5061047d610a41366004614841565b60086020526000908152604090205460ff1681565b348015610a6257600080fd5b5061047d610a71366004614841565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610a9b57600080fd5b5061039b610aaa3660046147b9565b61286f565b348015610abb57600080fd5b5061039b610aca366004614841565b612a06565b348015610adb57600080fd5b5061039b610aea36600461485c565b612a57565b348015610afb57600080fd5b5061039b610b0a366004614841565b612b01565b348015610b1b57600080fd5b5061041f610b2a366004614841565b600c6020526000908152604090205481565b348015610b4857600080fd5b5061041f610b57366004614841565b60156020526000908152604090205481565b3360009081526008602052604090205460ff16610bc65760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b60448201526064015b60405180910390fd5b828114610c075760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110610c2457610c24614ce4565b9050602002013560156000878785818110610c4157610c41614ce4565b9050602002016020810190610c569190614841565b6001600160a01b031681526020810191909152604001600020557f8b59d386e660418a48d742213ad5ce7c4dd51ae81f30e4e2c387f17d907010c9858583818110610ca357610ca3614ce4565b9050602002016020810190610cb89190614841565b848484818110610cca57610cca614ce4565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610cfd81614d10565b915050610c0a565b5050505050565b3360009081526008602052604090205460ff16610d645760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b828114610da55760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110610dc257610dc2614ce4565b90506020020135600e6000878785818110610ddf57610ddf614ce4565b9050602002016020810190610df49190614841565b6001600160a01b031681526020810191909152604001600020557fceaad6533bfb481492fb3e08ef19297f46611b8fa9de5ef4cf8dc23a56ad09ce858583818110610e4157610e41614ce4565b9050602002016020810190610e569190614841565b848484818110610e6857610e68614ce4565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610e9b81614d10565b915050610da8565b6000546001600160a01b03163314610eeb5760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b600454610ef89042614d2b565b60038190556040519081527f68e825132f7d4bc837dea2d64ac9fc19912bf0224b67f9317d8f1a917f5304a1906020015b60405180910390a1565b6000546001600160a01b03163314610f7b5760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b610f8481612bce565b50565b3360009081526008602052604090205460ff16610fdf5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b600f8190556040518181527fc0a39f234199b125fb93713c4d067bdcebbf691087f87b79c0feb92b156ba8b6906020015b60405180910390a150565b6002600554141561106e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156110b95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b8334146110fa5760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610bbd565b6013546001600160a01b03166111525760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610bbd565b6013546000906111709087906001600160a01b031687878787612c8b565b9050601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111c257600080fd5b505af11580156111d6573d6000803e3d6000fd5b5050601354604080518681523360208201526001600160a01b03808d1692820192909252911660608201526080810189905267ffffffffffffffff80891660a0830152871660c082015263ffffffff861660e08201527f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f01935061010001915061125c9050565b60405180910390a15050600160055550505050565b3360009081526007602052604090205460ff166112d05760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610bbd565b6112d8612ebe565b565b3360009081526008602052604090205460ff166113325760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b8281146113735760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d055782828281811061139057611390614ce4565b90506020020135600b60008787858181106113ad576113ad614ce4565b90506020020160208101906113c29190614841565b6001600160a01b031681526020810191909152604001600020557f608e49c22994f20b5d3496dca088b88dfd81b4a3e8cc3809ea1e10a320107e8985858381811061140f5761140f614ce4565b90506020020160208101906114249190614841565b84848481811061143657611436614ce4565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a18061146981614d10565b915050611376565b3360009081526008602052604090205460ff166114c95760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b6017805463ffffffff191663ffffffff92909216919091179055565b3360009081526008602052604090205460ff1661153d5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b60098190556040518181527f2664fec2ff76486ac58ed087310855b648b15b9d19f3de8529e95f7c46b7d6b390602001611010565b600260055414156115c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156116105760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6001600160a01b038216600090815260116020526040902054811161166a5760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610bbd565b601080546001919060009061168a90849067ffffffffffffffff16614d43565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506116d0333083856001600160a01b0316612f55909392919063ffffffff16565b6010546040805167ffffffffffffffff90921682523360208301526001600160a01b0384168282015260608201839052517fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce7649181900360800190a150506001600555565b60008484848460405160200161174d9493929190614ddb565b60405160208183030381529060405280519060200120905080600154146117b65760405162461bcd60e51b815260206004820152601860248201527f4d69736d617463682063757272656e74207369676e65727300000000000000006044820152606401610bbd565b87516020808a0191909120604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082019390935281518082039093018352605c019052805191012061181690888888888888612fed565b5050505050505050565b6000546001600160a01b031633146118685760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b610f8481613323565b6112d833613323565b600260055414156118cd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156119185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b8034146119595760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610bbd565b6013546001600160a01b03166119b15760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610bbd565b6013546001600160a01b03166000908152601160205260409020548111611a0d5760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610bbd565b6010805460019190600090611a2d90849067ffffffffffffffff16614d43565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aa357600080fd5b505af1158015611ab7573d6000803e3d6000fd5b50506010546013546040805167ffffffffffffffff90931683523360208401526001600160a01b0390911690820152606081018590527fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce76493506080019150611b1c9050565b60405180910390a1506001600555565b6000546001600160a01b03163314611b745760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b6112d860006133dc565b6000546001600160a01b03163314611bc65760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b610f848161342c565b3360009081526007602052604090205460ff16611c2e5760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610bbd565b6112d86134e9565b3360009081526008602052604090205460ff16611c8e5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b828114611ccf5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110611cec57611cec614ce4565b9050602002013560166000878785818110611d0957611d09614ce4565b9050602002016020810190611d1e9190614841565b6001600160a01b031681526020810191909152604001600020557f4f12d1a5bfb3ccd3719255d4d299d808d50cdca9a0a5c2b3a5aaa7edde73052c858583818110611d6b57611d6b614ce4565b9050602002016020810190611d809190614841565b848484818110611d9257611d92614ce4565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180611dc581614d10565b915050611cd2565b60065460ff1615611e135760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6000611e1e82613564565b9050611e37816000015182602001518360400151613729565b5050565b6000546001600160a01b03163314611e835760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60065460ff1615611eeb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b60004630604051602001611f4192919091825260601b6bffffffffffffffffffffffff191660208201527f57697468647261774d73670000000000000000000000000000000000000000006034820152603f0190565b604051602081830303815290604052805190602001209050611f8b818a8a604051602001611f7193929190614df2565b604051602081830303815290604052888888888888611734565b6000611fcc8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385e92505050565b905060008160000151826020015183604001518460600151856080015160405160200161204595949392919060c095861b6001600160c01b031990811682529490951b9093166008850152606091821b6bffffffffffffffffffffffff199081166010860152911b166024830152603882015260580190565b60408051601f1981840301815291815281516020928301206000818152601290935291205490915060ff16156120bd5760405162461bcd60e51b815260206004820152601a60248201527f776974686472617720616c7265616479207375636365656465640000000000006044820152606401610bbd565b6000818152601260205260409020805460ff19166001179055606082015160808301516120ea91906139be565b60608201516001600160a01b03166000908152600e602052604090205480158015906121195750808360800151115b1561213b5761213682846040015185606001518660800151613ad6565b612152565b612152836040015184606001518560800151613729565b7f48a1ab26f3aa7b62bb6b6e8eed182f292b84eb7b006c0254386b268af20774be8284602001518560400151866060015187608001518860a001516040516121d69695949392919095865267ffffffffffffffff9490941660208601526001600160a01b03928316604086015291166060840152608083015260a082015260c00190565b60405180910390a1505050505050505050505050565b6002600554141561223f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff161561228a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b600061229a878787878787612c8b565b90506122b16001600160a01b038716333088612f55565b604080518281523360208201526001600160a01b0389811682840152881660608201526080810187905267ffffffffffffffff86811660a0830152851660c082015263ffffffff841660e082015290517f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f01918190036101000190a1505060016005555050505050565b6000546001600160a01b031633146123825760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b60035442116123d35760405162461bcd60e51b815260206004820152601460248201527f6e6f742072656163682072657365742074696d650000000000000000000000006044820152606401610bbd565b6000196003556123e584848484613be9565b50505050565b6002548b1161243c5760405162461bcd60e51b815260206004820152601e60248201527f547269676765722074696d65206973206e6f7420696e6372656173696e6700006044820152606401610bbd565b61244842610e10614d2b565b8b106124965760405162461bcd60e51b815260206004820152601960248201527f547269676765722074696d6520697320746f6f206c61726765000000000000006044820152606401610bbd565b600046306040516020016124ec92919091825260601b6bffffffffffffffffffffffff191660208201527f5570646174655369676e65727300000000000000000000000000000000000000603482015260410190565b604051602081830303815290604052805190602001209050612522818d8d8d8d8d604051602001611f7196959493929190614e0c565b61252e8b8b8b8b613be9565b5050506002989098555050505050505050565b60065460ff16156125875760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b600046306040516020016125dd92919091825260601b6bffffffffffffffffffffffff191660208201527f52656c6179000000000000000000000000000000000000000000000000000000603482015260390190565b60405160208183030381529060405280519060200120905061260d818a8a604051602001611f7193929190614df2565b600061264e8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d9392505050565b8051602080830151604080850151606080870151608088015160a089015160c0808b015187519a861b6bffffffffffffffffffffffff199081168c8c015298861b891660348c01529590941b9096166048890152605c880191909152811b6001600160c01b0319908116607c88015293901b9092166084850152608c808501929092528051808503909201825260ac909301835280519082012060008181526014909252919020549192509060ff161561273c5760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610bbd565b60008181526014602052604090819020805460ff19166001179055820151606083015161276991906139be565b6040808301516001600160a01b03166000908152600e602052205480158015906127965750808360600151115b156127b8576127b382846020015185604001518660600151613ad6565b6127cf565b6127cf836020015184604001518560600151613729565b7f79fa08de5149d912dce8e5e8da7a7c17ccdf23dd5d3bfe196802e6eb86347c7c82846000015185602001518660400151876060015188608001518960c001516040516121d697969594939291909687526001600160a01b0395861660208801529385166040870152919093166060850152608084019290925267ffffffffffffffff9190911660a083015260c082015260e00190565b6112d833613f0b565b3360009081526008602052604090205460ff166128c75760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b8281146129085760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d055782828281811061292557612925614ce4565b905060200201356011600087878581811061294257612942614ce4565b90506020020160208101906129579190614841565b6001600160a01b031681526020810191909152604001600020557fc56b0d14c4940515800d94ebbd0f3f5d8cc58ba1109c12536bd993b72e466e4f8585838181106129a4576129a4614ce4565b90506020020160208101906129b99190614841565b8484848181106129cb576129cb614ce4565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a1806129fe81614d10565b91505061290b565b6000546001600160a01b03163314612a4e5760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b610f8481613f0b565b6000546001600160a01b03163314612a9f5760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b6004548111612afc5760405162461bcd60e51b815260206004820152602360248201527f6e6f7469636520706572696f642063616e206f6e6c7920626520696e637265616044820152621cd95960ea1b6064820152608401610bbd565b600455565b6000546001600160a01b03163314612b495760405162461bcd60e51b815260206004820181905260248201526000805160206150098339815191526044820152606401610bbd565b6001600160a01b038116612bc55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bbd565b610f84816133dc565b6001600160a01b03811660009081526008602052604090205460ff1615612c375760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f7200000000006044820152606401610bbd565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b59101611010565b6001600160a01b0385166000908152601560205260408120548511612ce55760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610bbd565b6001600160a01b0386166000908152601660205260409020541580612d2257506001600160a01b0386166000908152601660205260409020548511155b612d6e5760405162461bcd60e51b815260206004820152601060248201527f616d6f756e7420746f6f206c61726765000000000000000000000000000000006044820152606401610bbd565b60175463ffffffff90811690831611612dc95760405162461bcd60e51b815260206004820152601660248201527f6d617820736c69707061676520746f6f20736d616c6c000000000000000000006044820152606401610bbd565b6040516bffffffffffffffffffffffff1933606090811b8216602084015289811b8216603484015288901b166048820152605c81018690526001600160c01b031960c086811b8216607c84015285811b8216608484015246901b16608c82015260009060940160408051601f1981840301815291815281516020928301206000818152601490935291205490915060ff1615612e995760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610bbd565b6000818152601460205260409020805460ff1916600117905590509695505050505050565b60065460ff16612f105760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610bbd565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610f29565b6040516001600160a01b03808516602483015283166044820152606481018290526123e59085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fc4565b8281146130485760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610bbd565b6000805b8481101561308c5783838281811061306657613066614ce4565b90506020020135826130789190614d2b565b91508061308481614d10565b91505061304c565b506000600361309c836002614e34565b6130a69190614e53565b6130b1906001614d2b565b905060008080805b8a8110156132d157600061313c8d8d848181106130d8576130d8614ce4565b90506020028101906130ea9190614e75565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508f6140a990919063ffffffff16565b9050836001600160a01b0316816001600160a01b03161161319f5760405162461bcd60e51b815260206004820152601e60248201527f7369676e657273206e6f7420696e20617363656e64696e67206f7264657200006044820152606401610bbd565b8093505b8a8a848181106131b5576131b5614ce4565b90506020020160208101906131ca9190614841565b6001600160a01b0316816001600160a01b03161115613244576131ee600184614d2b565b925089831061323f5760405162461bcd60e51b815260206004820152601060248201527f7369676e6572206e6f7420666f756e64000000000000000000000000000000006044820152606401610bbd565b6131a3565b8a8a8481811061325657613256614ce4565b905060200201602081019061326b9190614841565b6001600160a01b0316816001600160a01b031614156132ab5788888481811061329657613296614ce4565b90506020020135856132a89190614d2b565b94505b8585106132be575050505050505061331a565b50806132c981614d10565b9150506130b9565b5060405162461bcd60e51b815260206004820152601260248201527f71756f72756d206e6f74207265616368656400000000000000000000000000006044820152606401610bbd565b50505050505050565b6001600160a01b03811660009081526007602052604090205460ff1661338b5760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f742070617573657200000000000000000000006044820152606401610bbd565b6001600160a01b038116600081815260076020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101611010565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526007602052604090205460ff16156134955760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c726561647920706175736572000000000000006044820152606401610bbd565b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101611010565b60065460ff161561352f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f3d3390565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600d6020908152604091829020825160808101845281546001600160a01b03908116825260018301541692810192909252600281015492820192909252600390910154606082018190526136235760405162461bcd60e51b815260206004820152601a60248201527f64656c61796564207472616e73666572206e6f742065786973740000000000006044820152606401610bbd565b600f5481606001516136359190614d2b565b42116136835760405162461bcd60e51b815260206004820152601d60248201527f64656c61796564207472616e73666572207374696c6c206c6f636b65640000006044820152606401610bbd565b6000838152600d6020908152604080832080546001600160a01b03199081168255600182018054909116905560028101849055600301929092558251908301518383015192517f3b40e5089937425d14cdd96947e5661868357e224af59bd8b24a4b8a330d44269361371b93889390929091909384526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a192915050565b6013546001600160a01b038381169116141561384557601354604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561378557600080fd5b505af1158015613799573d6000803e3d6000fd5b505050506000836001600160a01b03168261c35090604051600060405180830381858888f193505050503d80600081146137ef576040519150601f19603f3d011682016040523d82523d6000602084013e6137f4565b606091505b50509050806123e55760405162461bcd60e51b815260206004820152601b60248201527f6661696c656420746f2073656e64206e617469766520746f6b656e00000000006044820152606401610bbd565b6138596001600160a01b0383168483614153565b505050565b6040805160c08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905283518085019094528184528301849052909190805b602083015151835110156139b6576138bc83614183565b909250905081600114156138e4576138d3836141bd565b67ffffffffffffffff1684526138a5565b816002141561390a576138f6836141bd565b67ffffffffffffffff1660208501526138a5565b81600314156139375761392461391f8461423f565b6142fc565b6001600160a01b031660408501526138a5565b816004141561395f5761394c61391f8461423f565b6001600160a01b031660608501526138a5565b8160051415613983576139796139748461423f565b614307565b60808501526138a5565b81600614156139a75761399d6139988461423f565b61433e565b60a08501526138a5565b6139b18382614356565b6138a5565b505050919050565b6009546139c9575050565b6001600160a01b0382166000908152600b6020526040902054806139ec57505050565b6001600160a01b0383166000908152600a602052604081205460095490914291613a168184614e53565b613a209190614e34565b6001600160a01b0387166000908152600c6020526040902054909150811115613a4b57849250613a58565b613a558584614d2b565b92505b83831115613aa85760405162461bcd60e51b815260206004820152601260248201527f766f6c756d6520657863656564732063617000000000000000000000000000006044820152606401610bbd565b506001600160a01b039094166000908152600a6020908152604080832093909355600c905220929092555050565b6000848152600d602052604090206003015415613b355760405162461bcd60e51b815260206004820152601f60248201527f64656c61796564207472616e7366657220616c726561647920657869737473006044820152606401610bbd565b604080516080810182526001600160a01b0380861682528481166020808401918252838501868152426060860190815260008b8152600d90935291869020945185549085166001600160a01b031991821617865592516001860180549190951693169290921790925551600283015551600390910155517fcbcfffe5102114216a85d3aceb14ad4b81a3935b1b5c468fadf3889eb9c5dce690613bdb9086815260200190565b60405180910390a150505050565b828114613c445760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610bbd565b6000805b84811015613d1d57816001600160a01b0316868683818110613c6c57613c6c614ce4565b9050602002016020810190613c819190614841565b6001600160a01b031611613ce25760405162461bcd60e51b815260206004820152602260248201527f4e6577207369676e657273206e6f7420696e20617363656e64696e67206f726460448201526132b960f11b6064820152608401610bbd565b858582818110613cf457613cf4614ce4565b9050602002016020810190613d099190614841565b915080613d1581614d10565b915050613c48565b5084848484604051602001613d359493929190614ddb565b60408051601f198184030181529082905280516020909101206001557ff126123539a68393c55697f617e7d1148e371988daed246c2f41da99965a23f890613d84908790879087908790614ebc565b60405180910390a15050505050565b6040805160e08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905283518085019094528184528301849052909190805b602083015151835110156139b657613df883614183565b90925090508160011415613e2257613e1261391f8461423f565b6001600160a01b03168452613de1565b8160021415613e4a57613e3761391f8461423f565b6001600160a01b03166020850152613de1565b8160031415613e7257613e5f61391f8461423f565b6001600160a01b03166040850152613de1565b8160041415613e9157613e876139748461423f565b6060850152613de1565b8160051415613eb757613ea3836141bd565b67ffffffffffffffff166080850152613de1565b8160061415613edd57613ec9836141bd565b67ffffffffffffffff1660a0850152613de1565b8160071415613efc57613ef26139988461423f565b60c0850152613de1565b613f068382614356565b613de1565b6001600160a01b03811660009081526008602052604090205460ff16613f735760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420676f7665726e6f720000000000000000006044820152606401610bbd565b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f1ebe834e73d60a5fec822c1e1727d34bc79f2ad977ed504581cc1822fe20fb5b9101611010565b6000614019826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166143c89092919063ffffffff16565b80519091501561385957808060200190518101906140379190614f3e565b6138595760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bbd565b60008151604114156140dd5760208201516040830151606084015160001a6140d3868285856143e1565b935050505061414d565b81516040141561410557602082015160408301516140fc85838361458a565b9250505061414d565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bbd565b92915050565b6040516001600160a01b03831660248201526044810182905261385990849063a9059cbb60e01b90606401612f89565b6000806000614191846141bd565b905061419e600882614e53565b92508060071660058111156141b5576141b5614f60565b915050915091565b602080820151825181019091015160009182805b600a8110156142395783811a91506141ea816007614e34565b82607f16901b8517945081608016600014156142275761420b816001614d2b565b8651879061421a908390614d2b565b9052509395945050505050565b8061423181614d10565b9150506141d1565b50600080fd5b6060600061424c836141bd565b905060008184600001516142609190614d2b565b905083602001515181111561427457600080fd5b8167ffffffffffffffff81111561428d5761428d614944565b6040519080825280601f01601f1916602001820160405280156142b7576020820181803683370190505b50602080860151865192955091818601919083010160005b858110156142f15781810151838201526142ea602082614d2b565b90506142cf565b505050935250919050565b600061414d826145cd565b600060208251111561431857600080fd5b602082015190508151602061432d9190614f76565b614338906008614e34565b1c919050565b6000815160201461434e57600080fd5b506020015190565b600081600581111561436a5761436a614f60565b141561437957613859826141bd565b600281600581111561438d5761438d614f60565b141561037657600061439e836141bd565b905080836000018181516143b29190614d2b565b9052506020830151518351111561385957600080fd5b60606143d784846000856145f5565b90505b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561445e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bbd565b8360ff16601b148061447357508360ff16601c145b6144ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bbd565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561451e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166145815760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bbd565b95945050505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821660ff83901c601b016145c3868287856143e1565b9695505050505050565b600081516014146145dd57600080fd5b50602001516c01000000000000000000000000900490565b60608247101561466d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bbd565b843b6146bb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bbd565b600080866001600160a01b031685876040516146d79190614fb9565b60006040518083038185875af1925050503d8060008114614714576040519150601f19603f3d011682016040523d82523d6000602084013e614719565b606091505b5091509150614729828286614734565b979650505050505050565b606083156147435750816143da565b8251156147535782518084602001fd5b8160405162461bcd60e51b8152600401610bbd9190614fd5565b60008083601f84011261477f57600080fd5b50813567ffffffffffffffff81111561479757600080fd5b6020830191508360208260051b85010111156147b257600080fd5b9250929050565b600080600080604085870312156147cf57600080fd5b843567ffffffffffffffff808211156147e757600080fd5b6147f38883890161476d565b9096509450602087013591508082111561480c57600080fd5b506148198782880161476d565b95989497509550505050565b80356001600160a01b038116811461483c57600080fd5b919050565b60006020828403121561485357600080fd5b6143da82614825565b60006020828403121561486e57600080fd5b5035919050565b803567ffffffffffffffff8116811461483c57600080fd5b803563ffffffff8116811461483c57600080fd5b600080600080600060a086880312156148b957600080fd5b6148c286614825565b9450602086013593506148d760408701614875565b92506148e560608701614875565b91506148f36080870161488d565b90509295509295909350565b60006020828403121561491157600080fd5b6143da8261488d565b6000806040838503121561492d57600080fd5b61493683614825565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060006080888a03121561497557600080fd5b873567ffffffffffffffff8082111561498d57600080fd5b818a0191508a601f8301126149a157600080fd5b8135818111156149b3576149b3614944565b604051601f8201601f19908116603f011681019083821181831017156149db576149db614944565b816040528281528d60208487010111156149f457600080fd5b82602086016020830137600094508460208483010152809b5050505060208a013581811115614a21578283fd5b614a2d8c828d0161476d565b90995097505060408a013581811115614a44578283fd5b614a508c828d0161476d565b90975095505060608a013581811115614a67578283fd5b614a738c828d0161476d565b9a9d999c50979a509598949794955050505050565b6000806000806000806000806080898b031215614aa457600080fd5b883567ffffffffffffffff80821115614abc57600080fd5b818b0191508b601f830112614ad057600080fd5b813581811115614adf57600080fd5b8c6020828501011115614af157600080fd5b60209283019a509850908a01359080821115614b0c57600080fd5b614b188c838d0161476d565b909850965060408b0135915080821115614b3157600080fd5b614b3d8c838d0161476d565b909650945060608b0135915080821115614b5657600080fd5b50614b638b828c0161476d565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614b9057600080fd5b614b9987614825565b9550614ba760208801614825565b945060408701359350614bbc60608801614875565b9250614bca60808801614875565b9150614bd860a0880161488d565b90509295509295509295565b600080600080600080600080600080600060c08c8e031215614c0557600080fd5b8b359a5067ffffffffffffffff8060208e01351115614c2357600080fd5b614c338e60208f01358f0161476d565b909b50995060408d0135811015614c4957600080fd5b614c598e60408f01358f0161476d565b909950975060608d0135811015614c6f57600080fd5b614c7f8e60608f01358f0161476d565b909750955060808d0135811015614c9557600080fd5b614ca58e60808f01358f0161476d565b909550935060a08d0135811015614cbb57600080fd5b50614ccc8d60a08e01358e0161476d565b81935080925050509295989b509295989b9093969950565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614d2457614d24614cfa565b5060010190565b60008219821115614d3e57614d3e614cfa565b500190565b600067ffffffffffffffff808316818516808303821115614d6657614d66614cfa565b01949350505050565b60008160005b84811015614da4576001600160a01b03614d8e83614825565b1686526020958601959190910190600101614d75565b5093949350505050565b60006001600160fb1b03831115614dc457600080fd5b8260051b8083863760009401938452509192915050565b60006145c3614deb838789614d6f565b8486614dae565b838152818360208301376000910160200190815292915050565b8681528560208201526000614e28614deb604084018789614d6f565b98975050505050505050565b6000816000190483118215151615614e4e57614e4e614cfa565b500290565b600082614e7057634e487b7160e01b600052601260045260246000fd5b500490565b6000808335601e19843603018112614e8c57600080fd5b83018035915067ffffffffffffffff821115614ea757600080fd5b6020019150368190038213156147b257600080fd5b6040808252810184905260008560608301825b87811015614efd576001600160a01b03614ee884614825565b16825260209283019290910190600101614ecf565b5083810360208501528481526001600160fb1b03851115614f1d57600080fd5b8460051b915081866020830137600091016020019081529695505050505050565b600060208284031215614f5057600080fd5b815180151581146143da57600080fd5b634e487b7160e01b600052602160045260246000fd5b600082821015614f8857614f88614cfa565b500390565b60005b83811015614fa8578181015183820152602001614f90565b838111156123e55750506000910152565b60008251614fcb818460208701614f8d565b9190910192915050565b6020815260008251806020840152614ff4816040850160208701614f8d565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212200d78a5548ff1ceef8f6921195cceda8dea34180a2495748efcb733ce9c144aa664736f6c63430008090033

Deployed ByteCode Sourcemap

246:7365:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6663:347;;;;;;;;;;-1:-1:-1;6663:347:0;;;;;:::i;:::-;;:::i;:::-;;702:382:8;;;;;;;;;;-1:-1:-1;702:382:8;;;;;:::i;:::-;;:::i;3131:151:2:-;;;;;;;;;;;;;:::i;1151:32:0:-;;;;;;;;;;-1:-1:-1;1151:32:0;;;;;;;;;;;1338:10:20;1326:23;;;1308:42;;1296:2;1281:18;1151:32:0;;;;;;;;330:26:2;;;;;;;;;;;;;;;;;;;1507:25:20;;;1495:2;1480:18;330:26:2;1361:177:20;589:95:9;;;;;;;;;;-1:-1:-1;589:95:9;;;;;:::i;:::-;;:::i;896:41:0:-;;;;;;;;;;-1:-1:-1;896:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2285:14:20;;2278:22;2260:41;;2248:2;2233:18;896:41:0;2120:187:20;1090:143:8;;;;;;;;;;-1:-1:-1;1090:143:8;;;;;:::i;:::-;;:::i;3124:599:0:-;;;;;;:::i;:::-;;:::i;591:64:10:-;;;;;;;;;;;;;:::i;1267:25:1:-;;;;;;;;;;-1:-1:-1;1267:25:1;;;;-1:-1:-1;;;;;1267:25:1;;;;;;-1:-1:-1;;;;;3482:55:20;;;3464:74;;3452:2;3437:18;1267:25:1;3318:226:20;661:102:10;;;;;;;;;;-1:-1:-1;661:102:10;;;;;:::i;:::-;-1:-1:-1;;;;;740:16:10;717:4;740:16;;;:7;:16;;;;;;;;;661:102;654:355:11;;;;;;;;;;-1:-1:-1;654:355:11;;;;;:::i;:::-;;:::i;7369:138:0:-;;;;;;;;;;-1:-1:-1;7369:138:0;;;;;:::i;:::-;;:::i;344:50:8:-;;;;;;;;;;-1:-1:-1;344:50:8;;;;;:::i;:::-;;;;;;;;;;;;;;505:143:11;;;;;;;;;;-1:-1:-1;505:143:11;;;;;:::i;:::-;;:::i;2031:325:1:-;;;;;;;;;;-1:-1:-1;2031:325:1;;;;;:::i;:::-;;:::i;142:26:11:-;;;;;;;;;;;;;;;;1041:84:13;;;;;;;;;;-1:-1:-1;1111:7:13;;;;1041:84;;185:47:11;;;;;;;;;;-1:-1:-1;185:47:11;;;;;:::i;:::-;;;;;;;;;;;;;;1022:42:0;;;;;;;;;;-1:-1:-1;1022:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;478:24:2;;;;;;;;;;;;;;;;1133:409;;;;;;;;;;-1:-1:-1;1133:409:2;;;;;:::i;:::-;;:::i;864:95:10:-;;;;;;;;;;-1:-1:-1;864:95:10;;;;;:::i;:::-;;:::i;965:75::-;;;;;;;;;;;;;:::i;2565:431:1:-;;;;;;:::i;:::-;;:::i;1605:92:12:-;;;;;;;;;;;;;:::i;228:39:10:-;;;;;;;;;;-1:-1:-1;228:39:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;769:89;;;;;;;;;;-1:-1:-1;769:89:10;;;;;:::i;:::-;;:::i;525:60::-;;;;;;;;;;;;;:::i;7016:347:0:-;;;;;;;;;;-1:-1:-1;7016:347:0;;;;;:::i;:::-;;:::i;664:20:1:-;;;;;;;;;;-1:-1:-1;664:20:1;;;;;;;;;;;6223:18:20;6211:31;;;6193:50;;6181:2;6166:18;664:20:1;6049:200:20;973:85:12;;;;;;;;;;-1:-1:-1;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;973:85;;508:27:2;;;;;;;;;;;;;;;;4661:217:1;;;;;;;;;;-1:-1:-1;4661:217:1;;;;;:::i;:::-;;:::i;5842:86::-;;;;;;;;;;-1:-1:-1;5842:86:1;;;;;:::i;:::-;;:::i;3426:1229::-;;;;;;;;;;-1:-1:-1;3426:1229:1;;;;;:::i;:::-;;:::i;1956:536:0:-;;;;;;;;;;-1:-1:-1;1956:536:0;;;;;:::i;:::-;;:::i;2878:247:2:-;;;;;;;;;;-1:-1:-1;2878:247:2;;;;;:::i;:::-;;:::i;279:59:8:-;;;;;;;;;;-1:-1:-1;279:59:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;279:59:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;8675:15:20;;;8657:34;;8727:15;;;;8722:2;8707:18;;8700:43;8759:18;;;8752:34;8817:2;8802:18;;8795:34;8583:3;8568:19;279:59:8;8365:470:20;400:26:8;;;;;;;;;;;;;;;;254:50:11;;;;;;;;;;-1:-1:-1;254:50:11;;;;;:::i;:::-;;;;;;;;;;;;;;1892:886:2;;;;;;;;;;-1:-1:-1;1892:886:2;;;;;:::i;:::-;;:::i;742:41:1:-;;;;;;;;;;-1:-1:-1;742:41:1;;;;;:::i;:::-;;;;;;;;;;;;;;5098:1559:0;;;;;;;;;;-1:-1:-1;5098:1559:0;;;;;:::i;:::-;;:::i;303:21:2:-;;;;;;;;;;;;;;;;797:79:9;;;;;;;;;;;;;:::i;921:41:1:-;;;;;;;;;;-1:-1:-1;921:41:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;164::9;;;;;;;;;;-1:-1:-1;164:41:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;475:108;;;;;;;;;;-1:-1:-1;475:108:9;;;;;:::i;:::-;-1:-1:-1;;;;;557:19:9;534:4;557:19;;;:9;:19;;;;;;;;;475:108;4884:344:1;;;;;;;;;;-1:-1:-1;4884:344:1;;;;;:::i;:::-;;:::i;690:101:9:-;;;;;;;;;;-1:-1:-1;690:101:9;;;;;:::i;:::-;;:::i;3288:182:2:-;;;;;;;;;;-1:-1:-1;3288:182:2;;;;;:::i;:::-;;:::i;1846:189:12:-;;;;;;;;;;-1:-1:-1;1846:189:12;;;;;:::i;:::-;;:::i;326:51:11:-;;;;;;;;;;-1:-1:-1;326:51:11;;;;;:::i;:::-;;;;;;;;;;;;;;943:42:0;;;;;;;;;;-1:-1:-1;943:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;6663:347;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;;;;;;;;;6780:33:0;;::::1;6772:61;;;::::0;-1:-1:-1;;;6772:61:0;;11347:2:20;6772:61:0::1;::::0;::::1;11329:21:20::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:20;;;11398:45;11460:18;;6772:61:0::1;11145:339:20::0;6772:61:0::1;6848:9;6843:161;6863:18:::0;;::::1;6843:161;;;6924:8;;6933:1;6924:11;;;;;;;:::i;:::-;;;;;;;6902:7;:19;6910:7;;6918:1;6910:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6902:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;6902:19:0;:33;6954:39:::1;6969:7:::0;;6977:1;6969:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6981:8;;6990:1;6981:11;;;;;;;:::i;:::-;6954:39;::::0;;-1:-1:-1;;;;;11813:55:20;;;11795:74;;6981:11:0::1;::::0;;::::1;::::0;;;::::1;;11885:18:20::0;;;11878:34;-1:-1:-1;11768:18:20;6954:39:0::1;;;;;;;6883:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6843:161;;;;6663:347:::0;;;;:::o;702:382:8:-;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;830:36:8;;::::1;822:64;;;::::0;-1:-1:-1;;;822:64:8;;11347:2:20;822:64:8::1;::::0;::::1;11329:21:20::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:20;;;11398:45;11460:18;;822:64:8::1;11145:339:20::0;822:64:8::1;901:9;896:182;916:18:::0;;::::1;896:182;;;985:11;;997:1;985:14;;;;;;;:::i;:::-;;;;;;;955:15;:27;971:7;;979:1;971:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;955:27:8::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;955:27:8;:44;1018:49:::1;1040:7:::0;;1048:1;1040:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1052:11;;1064:1;1052:14;;;;;;;:::i;:::-;1018:49;::::0;;-1:-1:-1;;;;;11813:55:20;;;11795:74;;1052:14:8::1;::::0;;::::1;::::0;;;::::1;;11885:18:20::0;;;11878:34;-1:-1:-1;11768:18:20;1018:49:8::1;;;;;;;936:3:::0;::::1;::::0;::::1;:::i;:::-;;;;896:182;;3131:151:2::0;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;3220:12:2::1;::::0;3202:30:::1;::::0;:15:::1;:30;:::i;:::-;3190:9;:42:::0;;;3247:28:::1;::::0;1507:25:20;;;3247:28:2::1;::::0;1495:2:20;1480:18;3247:28:2::1;;;;;;;;3131:151::o:0;589:95:9:-;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;655:22:9::1;668:8;655:12;:22::i;:::-;589:95:::0;:::o;1090:143:8:-;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;1163:11:8::1;:21:::0;;;1199:27:::1;::::0;1507:25:20;;;1199:27:8::1;::::0;1495:2:20;1480:18;1199:27:8::1;;;;;;;;1090:143:::0;:::o;3124:599:0:-;1680:1:14;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:14;;12891:2:20;2251:63:14;;;12873:21:20;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:14;12689:355:20;2251:63:14;1680:1;2389:7;:18;1111:7:13;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13::1;::::0;::::1;13233:21:20::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13::1;13049:340:20::0;1346:38:13::1;3357:7:0::2;3344:9;:20;3336:48;;;::::0;-1:-1:-1;;;3336:48:0;;13596:2:20;3336:48:0::2;::::0;::::2;13578:21:20::0;13635:2;13615:18;;;13608:30;-1:-1:-1;;;13654:18:20;;;13647:45;13709:18;;3336:48:0::2;13394:339:20::0;3336:48:0::2;3402:10;::::0;-1:-1:-1;;;;;3402:10:0::2;3394:56;;;::::0;-1:-1:-1;;;3394:56:0;;13940:2:20;3394:56:0::2;::::0;::::2;13922:21:20::0;13979:2;13959:18;;;13952:30;14018:21;13998:18;;;13991:49;14057:18;;3394:56:0::2;13738:343:20::0;3394:56:0::2;3498:10;::::0;3460:18:::2;::::0;3481:72:::2;::::0;3487:9;;-1:-1:-1;;;;;3498:10:0::2;3510:7:::0;3519:11;3532:6;3540:12;3481:5:::2;:72::i;:::-;3460:93;;3569:10;;;;;;;;;-1:-1:-1::0;;;;;3569:10:0::2;-1:-1:-1::0;;;;;3563:25:0::2;;3596:7;3563:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;3661:10:0::2;::::0;3621:95:::2;::::0;;14423:25:20;;;3638:10:0::2;14540:2:20::0;14525:18;;14518:43;-1:-1:-1;;;;;14597:15:20;;;14577:18;;;14570:43;;;;3661:10:0;::::2;14644:2:20::0;14629:18;;14622:43;14696:3;14681:19;;14674:35;;;14728:18;14783:15;;;14777:3;14762:19;;14755:44;14836:15;;14830:3;14815:19;;14808:44;14901:10;14889:23;;14883:3;14868:19;;14861:52;3621:95:0::2;::::0;-1:-1:-1;14410:3:20;14395:19;;-1:-1:-1;3621:95:0::2;::::0;-1:-1:-1;14086:833:20;3621:95:0::2;;;;;;;;-1:-1:-1::0;;1637:1:14;2562:7;:22;-1:-1:-1;;;;3124:599:0:o;591:64:10:-;465:10;717:4;740:16;;;:7;:16;;;;;;;;448:53;;;;-1:-1:-1;;;448:53:10;;15126:2:20;448:53:10;;;15108:21:20;15165:2;15145:18;;;15138:30;15204:22;15184:18;;;15177:50;15244:18;;448:53:10;14924:344:20;448:53:10;638:10:::1;:8;:10::i;:::-;591:64::o:0;654:355:11:-;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;776:30:11;;::::1;768:58;;;::::0;-1:-1:-1;;;768:58:11;;11347:2:20;768:58:11::1;::::0;::::1;11329:21:20::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:20;;;11398:45;11460:18;;768:58:11::1;11145:339:20::0;768:58:11::1;841:9;836:167;856:18:::0;;::::1;836:167;;;925:5;;931:1;925:8;;;;;;;:::i;:::-;;;;;;;895:15;:27;911:7;;919:1;911:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;895:27:11::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;895:27:11;:38;952:40:::1;971:7:::0;;979:1;971:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;983:5;;989:1;983:8;;;;;;;:::i;:::-;952:40;::::0;;-1:-1:-1;;;;;11813:55:20;;;11795:74;;983:8:11::1;::::0;;::::1;::::0;;;::::1;;11885:18:20::0;;;11878:34;-1:-1:-1;11768:18:20;952:40:11::1;;;;;;;876:3:::0;::::1;::::0;::::1;:::i;:::-;;;;836:167;;7369:138:0::0;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;7460:18:0::1;:40:::0;;-1:-1:-1;;7460:40:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;7369:138::o;505:143:11:-;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;578:11:11::1;:21:::0;;;614:27:::1;::::0;1507:25:20;;;614:27:11::1;::::0;1495:2:20;1480:18;614:27:11::1;1361:177:20::0;2031:325:1;1680:1:14;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:14;;12891:2:20;2251:63:14;;;12873:21:20;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:14;12689:355:20;2251:63:14;1680:1;2389:7;:18;1111:7:13;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13::1;::::0;::::1;13233:21:20::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13::1;13049:340:20::0;1346:38:13::1;-1:-1:-1::0;;;;;2150:14:1;::::2;;::::0;;;:6:::2;:14;::::0;;;;;2140:24;::::2;2132:53;;;::::0;-1:-1:-1;;;2132:53:1;;15475:2:20;2132:53:1::2;::::0;::::2;15457:21:20::0;15514:2;15494:18;;;15487:30;-1:-1:-1;;;15533:18:20;;;15526:46;15589:18;;2132:53:1::2;15273:340:20::0;2132:53:1::2;2195:6;:11:::0;;2205:1:::2;::::0;2195:6;::::2;::::0;:11:::2;::::0;2205:1;;2195:11:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2216:67;2248:10;2268:4;2275:7;2223:6;-1:-1:-1::0;;;;;2216:31:1::2;;;:67;;;;;;:::i;:::-;2313:6;::::0;2298:51:::2;::::0;;2313:6:::2;::::0;;::::2;16088:50:20::0;;2321:10:1::2;16230:2:20::0;16215:18;;16208:43;-1:-1:-1;;;;;16287:15:20;;16267:18;;;16260:43;16334:2;16319:18;;16312:34;;;2298:51:1;::::2;::::0;;;;16075:3:20;2298:51:1;;::::2;-1:-1:-1::0;;1637:1:14;2562:7;:22;2031:325:1:o;1133:409:2:-;1322:9;1361:8;;1371:7;;1344:35;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1334:46;;;;;;1322:58;;1408:1;1398:6;;:11;1390:48;;;;-1:-1:-1;;;1390:48:2;;17765:2:20;1390:48:2;;;17747:21:20;17804:2;17784:18;;;17777:30;17843:26;17823:18;;;17816:54;17887:18;;1390:48:2;17563:348:20;1390:48:2;1468:15;;;;;;;;;;5240:58:19;;;28389:66:20;5240:58:19;;;28377:79:20;28472:12;;;;28465:28;;;;5240:58:19;;;;;;;;;;28509:12:20;;5240:58:19;;5230:69;;;;;1448:87:2;;1510:5;;1517:8;;1527:7;;1448:19;:87::i;:::-;1312:230;1133:409;;;;;;;:::o;864:95:10:-;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;930:22:10::1;944:7;930:13;:22::i;965:75::-:0;1008:25;1022:10;1008:13;:25::i;2565:431:1:-;1680:1:14;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:14;;12891:2:20;2251:63:14;;;12873:21:20;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:14;12689:355:20;2251:63:14;1680:1;2389:7;:18;1111:7:13;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13::1;::::0;::::1;13233:21:20::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13::1;13049:340:20::0;1346:38:13::1;2685:7:1::2;2672:9;:20;2664:48;;;::::0;-1:-1:-1;;;2664:48:1;;13596:2:20;2664:48:1::2;::::0;::::2;13578:21:20::0;13635:2;13615:18;;;13608:30;-1:-1:-1;;;13654:18:20;;;13647:45;13709:18;;2664:48:1::2;13394:339:20::0;2664:48:1::2;2730:10;::::0;-1:-1:-1;;;;;2730:10:1::2;2722:56;;;::::0;-1:-1:-1;;;2722:56:1;;13940:2:20;2722:56:1::2;::::0;::::2;13922:21:20::0;13979:2;13959:18;;;13952:30;14018:21;13998:18;;;13991:49;14057:18;;2722:56:1::2;13738:343:20::0;2722:56:1::2;2813:10;::::0;-1:-1:-1;;;;;2813:10:1::2;2806:18;::::0;;;:6:::2;:18;::::0;;;;;2796:28;::::2;2788:57;;;::::0;-1:-1:-1;;;2788:57:1;;15475:2:20;2788:57:1::2;::::0;::::2;15457:21:20::0;15514:2;15494:18;;;15487:30;-1:-1:-1;;;15533:18:20;;;15526:46;15589:18;;2788:57:1::2;15273:340:20::0;2788:57:1::2;2855:6;:11:::0;;2865:1:::2;::::0;2855:6;::::2;::::0;:11:::2;::::0;2865:1;;2855:11:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2882:10;;;;;;;;;-1:-1:-1::0;;;;;2882:10:1::2;-1:-1:-1::0;;;;;2876:25:1::2;;2909:7;2876:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;2949:6:1::2;::::0;2969:10:::2;::::0;2934:55:::2;::::0;;2949:6:::2;::::0;;::::2;16088:50:20::0;;2957:10:1::2;16230:2:20::0;16215:18;;16208:43;-1:-1:-1;;;;;2969:10:1;;::::2;16267:18:20::0;;;16260:43;16334:2;16319:18;;16312:34;;;2934:55:1::2;::::0;-1:-1:-1;16075:3:20;16060:19;;-1:-1:-1;2934:55:1::2;::::0;-1:-1:-1;15859:493:20;2934:55:1::2;;;;;;;;-1:-1:-1::0;1637:1:14;2562:7;:22;2565:431:1:o;1605:92:12:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;1669:21:::1;1687:1;1669:9;:21::i;769:89:10:-:0;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;832:19:10::1;843:7;832:10;:19::i;525:60::-:0;465:10;717:4;740:16;;;:7;:16;;;;;;;;448:53;;;;-1:-1:-1;;;448:53:10;;15126:2:20;448:53:10;;;15108:21:20;15165:2;15145:18;;;15138:30;15204:22;15184:18;;;15177:50;15244:18;;448:53:10;14924:344:20;448:53:10;570:8:::1;:6;:8::i;7016:347:0:-:0;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;7133:33:0;;::::1;7125:61;;;::::0;-1:-1:-1;;;7125:61:0;;11347:2:20;7125:61:0::1;::::0;::::1;11329:21:20::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:20;;;11398:45;11460:18;;7125:61:0::1;11145:339:20::0;7125:61:0::1;7201:9;7196:161;7216:18:::0;;::::1;7196:161;;;7277:8;;7286:1;7277:11;;;;;;;:::i;:::-;;;;;;;7255:7;:19;7263:7;;7271:1;7263:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7255:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7255:19:0;:33;7307:39:::1;7322:7:::0;;7330:1;7322:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7334:8;;7343:1;7334:11;;;;;;;:::i;:::-;7307:39;::::0;;-1:-1:-1;;;;;11813:55:20;;;11795:74;;7334:11:0::1;::::0;;::::1;::::0;;;::::1;;11885:18:20::0;;;11878:34;-1:-1:-1;11768:18:20;7307:39:0::1;;;;;;;7236:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7196:161;;4661:217:1::0;1111:7:13;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13;;;13233:21:20;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13;13049:340:20;1346:38:13;4738:31:1::1;4772:27;4796:2;4772:23;:27::i;:::-;4738:61;;4809:62;4820:8;:17;;;4839:8;:14;;;4855:8;:15;;;4809:10;:62::i;:::-;4728:150;4661:217:::0;:::o;5842:86::-;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;5903:10:1::1;:18:::0;;-1:-1:-1;;;;;;5903:18:1::1;-1:-1:-1::0;;;;;5903:18:1;;;::::1;::::0;;;::::1;::::0;;5842:86::o;3426:1229::-;1111:7:13;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13;;;13233:21:20;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13;13049:340:20;1346:38:13;3619:14:1::1;3663:13;3686:4;3646:61;;;;;;;;18174:19:20::0;;;18231:2;18227:15;-1:-1:-1;;18223:53:20;18218:2;18209:12;;18202:75;18307:13;18302:2;18293:12;;18286:35;18346:2;18337:12;;17916:439;3646:61:1::1;;;;;;;;;;;;;3636:72;;;;;;3619:89;;3718:70;3746:6;3754;;3729:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3763:5;;3770:8;;3780:7;;3718:10;:70::i;:::-;3832:31;3866:29;3888:6;;3866:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;3866:21:1::1;::::0;-1:-1:-1;;;3866:29:1:i:1;:::-;3832:63;;3948:12;4003:5;:13;;;4018:5;:12;;;4032:5;:14;;;4048:5;:11;;;4061:5;:12;;;3986:88;;;;;;;;;;;19052:3:20::0;19048:16;;;-1:-1:-1;;;;;;19044:25:20;;;19032:38;;19103:16;;;;19099:25;;;19095:1;19086:11;;19079:46;19213:2;19209:15;;;-1:-1:-1;;19205:24:20;;;19200:2;19191:12;;19184:46;19264:15;;19260:24;19255:2;19246:12;;19239:46;19310:2;19301:12;;19294:28;19347:2;19338:12;;18710:646;3986:88:1::1;;::::0;;-1:-1:-1;;3986:88:1;;::::1;::::0;;;;;;3963:121;;3986:88:::1;3963:121:::0;;::::1;::::0;4102:15:::1;::::0;;;:9:::1;:15:::0;;;;;;3963:121;;-1:-1:-1;4102:15:1::1;;:24;4094:63;;;::::0;-1:-1:-1;;;4094:63:1;;19563:2:20;4094:63:1::1;::::0;::::1;19545:21:20::0;19602:2;19582:18;;;19575:30;19641:28;19621:18;;;19614:56;19687:18;;4094:63:1::1;19361:350:20::0;4094:63:1::1;4167:15;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;4167:22:1::1;4185:4;4167:22;::::0;;4213:11:::1;::::0;::::1;::::0;4226:12:::1;::::0;::::1;::::0;4199:40:::1;::::0;4213:11;4199:13:::1;:40::i;:::-;4290:11;::::0;::::1;::::0;-1:-1:-1;;;;;4274:28:1::1;4249:22;4274:28:::0;;;:15:::1;:28;::::0;;;;;4316:18;;;;;:51:::1;;;4353:14;4338:5;:12;;;:29;4316:51;4312:234;;;4383:68;4403:4;4409:5;:14;;;4425:5;:11;;;4438:5;:12;;;4383:19;:68::i;:::-;4312:234;;;4482:53;4493:5;:14;;;4509:5;:11;;;4522:5;:12;;;4482:10;:53::i;:::-;4560:88;4573:4;4579:5;:12;;;4593:5;:14;;;4609:5;:11;;;4622:5;:12;;;4636:5;:11;;;4560:88;;;;;;;;;;20001:25:20::0;;;20074:18;20062:31;;;;20057:2;20042:18;;20035:59;-1:-1:-1;;;;;20191:15:20;;;20186:2;20171:18;;20164:43;20243:15;;20238:2;20223:18;;20216:43;20290:3;20275:19;;20268:35;20334:3;20319:19;;20312:35;19988:3;19973:19;;19716:637;4560:88:1::1;;;;;;;;3609:1046;;;;3426:1229:::0;;;;;;;;:::o;1956:536:0:-;1680:1:14;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:14;;12891:2:20;2251:63:14;;;12873:21:20;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:14;12689:355:20;2251:63:14;1680:1;2389:7;:18;1111:7:13;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13::1;::::0;::::1;13233:21:20::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13::1;13049:340:20::0;1346:38:13::1;2213:18:0::2;2234:68;2240:9;2251:6;2259:7;2268:11;2281:6;2289:12;2234:5;:68::i;:::-;2213:89:::0;-1:-1:-1;2312:67:0::2;-1:-1:-1::0;;;;;2312:31:0;::::2;2344:10;2364:4;2371:7:::0;2312:31:::2;:67::i;:::-;2394:91;::::0;;14423:25:20;;;2411:10:0::2;14540:2:20::0;14525:18;;14518:43;-1:-1:-1;;;;;14597:15:20;;;14577:18;;;14570:43;14649:15;;14644:2;14629:18;;14622:43;14696:3;14681:19;;14674:35;;;14728:18;14783:15;;;14777:3;14762:19;;14755:44;14836:15;;14830:3;14815:19;;14808:44;14901:10;14889:23;;14883:3;14868:19;;14861:52;2394:91:0;;::::2;::::0;;;;14410:3:20;2394:91:0;;::::2;-1:-1:-1::0;;1637:1:14;2562:7;:22;-1:-1:-1;;;;;1956:536:0:o;2878:247:2:-;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;3012:9:2::1;;2994:15;:27;2986:60;;;::::0;-1:-1:-1;;;2986:60:2;;20560:2:20;2986:60:2::1;::::0;::::1;20542:21:20::0;20599:2;20579:18;;;20572:30;20638:22;20618:18;;;20611:50;20678:18;;2986:60:2::1;20358:344:20::0;2986:60:2::1;-1:-1:-1::0;;3056:9:2::1;:19:::0;3085:33:::1;3100:8:::0;;3110:7;;3085:14:::1;:33::i;:::-;2878:247:::0;;;;:::o;1892:886::-;2251:11;;2236:12;:26;2228:69;;;;-1:-1:-1;;;2228:69:2;;20909:2:20;2228:69:2;;;20891:21:20;20948:2;20928:18;;;20921:30;20987:32;20967:18;;;20960:60;21037:18;;2228:69:2;20707:354:20;2228:69:2;2416:22;:15;2434:4;2416:22;:::i;:::-;2401:12;:37;2393:75;;;;-1:-1:-1;;;2393:75:2;;21268:2:20;2393:75:2;;;21250:21:20;21307:2;21287:18;;;21280:30;21346:27;21326:18;;;21319:55;21391:18;;2393:75:2;21066:349:20;2393:75:2;2478:14;2522:13;2545:4;2505:63;;;;;;;;21678:19:20;;;21735:2;21731:15;-1:-1:-1;;21727:53:20;21722:2;21713:12;;21706:75;21811:15;21806:2;21797:12;;21790:37;21852:2;21843:12;;21420:441;2505:63:2;;;;;;;;;;;;;2495:74;;;;;;2478:91;;2579:107;2607:6;2615:12;2629:11;;2642:10;;2590:63;;;;;;;;;;;;;:::i;2579:107::-;2696:39;2711:11;;2724:10;;2696:14;:39::i;:::-;-1:-1:-1;;;2745:11:2;:26;;;;-1:-1:-1;;;;;;;;1892:886:2:o;5098:1559:0:-;1111:7:13;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13;;;13233:21:20;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13;13049:340:20;1346:38:13;5295:14:0::1;5339:13;5362:4;5322:55;;;;;;;;22662:19:20::0;;;22719:2;22715:15;-1:-1:-1;;22711:53:20;22706:2;22697:12;;22690:75;22795:7;22790:2;22781:12;;22774:29;22828:2;22819:12;;22404:433;5322:55:0::1;;;;;;;;;;;;;5312:66;;;;;;5295:83;;5388:77;5416:6;5424:13;;5399:39;;;;;;;;;;:::i;5388:77::-;5475:29;5507:32;5525:13;;5507:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5507:17:0::1;::::0;-1:-1:-1;;;5507:32:0:i:1;:::-;5681:14:::0;;5713:16:::1;::::0;;::::1;::::0;5747:13:::1;::::0;;::::1;::::0;5778:14:::1;::::0;;::::1;::::0;5810:18:::1;::::0;::::1;::::0;5846::::1;::::0;::::1;::::0;5882:21:::1;::::0;;::::1;::::0;5647:270;;23201:15:20;;;-1:-1:-1;;23197:24:20;;;5647:270:0;;::::1;23185:37:20::0;23256:15;;;23252:24;;23238:12;;;23231:46;23311:15;;;;23307:24;;;23293:12;;;23286:46;23348:12;;;23341:28;;;;23488:16;;-1:-1:-1;;;;;;23484:25:20;;;23470:12;;;23463:47;23545:16;;;23541:25;;;23526:13;;;23519:48;23583:13;;;;23576:29;;;;5647:270:0;;;;;;;;;;23621:13:20;;;;5647:270:0;;5624:303;;;;::::1;::::0;-1:-1:-1;5945:21:0;;;:9:::1;:21:::0;;;;;;;5681:14;;-1:-1:-1;5624:303:0;5945:21:::1;;:30;5937:58;;;::::0;-1:-1:-1;;;5937:58:0;;23847:2:20;5937:58:0::1;::::0;::::1;23829:21:20::0;23886:2;23866:18;;;23859:30;-1:-1:-1;;;23905:18:20;;;23898:45;23960:18;;5937:58:0::1;23645:339:20::0;5937:58:0::1;6005:21;::::0;;;:9:::1;:21;::::0;;;;;;:28;;-1:-1:-1;;6005:28:0::1;6029:4;6005:28;::::0;;6057:13;::::1;::::0;6072:14:::1;::::0;::::1;::::0;6043:44:::1;::::0;6057:13;6043::::1;:44::i;:::-;6138:13;::::0;;::::1;::::0;-1:-1:-1;;;;;6122:30:0::1;6097:22;6122:30:::0;;;:15:::1;:30;::::0;;;6166:18;;;;;:53:::1;;;6205:14;6188:7;:14;;;:31;6166:53;6162:254;;;6235:80;6255:10;6267:7;:16;;;6285:7;:13;;;6300:7;:14;;;6235:19;:80::i;:::-;6162:254;;;6346:59;6357:7;:16;;;6375:7;:13;;;6390:7;:14;;;6346:10;:59::i;:::-;6431:219;6450:10;6474:7;:14;;;6502:7;:16;;;6532:7;:13;;;6559:7;:14;;;6587:7;:18;;;6619:7;:21;;;6431:219;;;;;;;;;;;24302:25:20::0;;;-1:-1:-1;;;;;24424:15:20;;;24419:2;24404:18;;24397:43;24476:15;;;24471:2;24456:18;;24449:43;24528:15;;;;24523:2;24508:18;;24501:43;24575:3;24560:19;;24553:35;;;;24637:18;24625:31;;;;24619:3;24604:19;;24597:60;24688:3;24673:19;;24666:35;24289:3;24274:19;;23989:718;797:79:9;842:27;858:10;842:15;:27::i;4884:344:1:-;352:10:9;534:4;557:19;;;:9;:19;;;;;;;;333:57;;;;-1:-1:-1;;;333:57:9;;10996:2:20;333:57:9;;;10978:21:20;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:20;;;11047:52;11116:18;;333:57:9;10794:346:20;333:57:9;5000:33:1;;::::1;4992:61;;;::::0;-1:-1:-1;;;4992:61:1;;11347:2:20;4992:61:1::1;::::0;::::1;11329:21:20::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:20;;;11398:45;11460:18;;4992:61:1::1;11145:339:20::0;4992:61:1::1;5068:9;5063:159;5083:18:::0;;::::1;5063:159;;;5143:8;;5152:1;5143:11;;;;;;;:::i;:::-;;;;;;;5122:6;:18;5129:7;;5137:1;5129:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5122:18:1::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5122:18:1;:32;5173:38:::1;5187:7:::0;;5195:1;5187:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5199:8;;5208:1;5199:11;;;;;;;:::i;:::-;5173:38;::::0;;-1:-1:-1;;;;;11813:55:20;;;11795:74;;5199:11:1::1;::::0;;::::1;::::0;;;::::1;;11885:18:20::0;;;11878:34;-1:-1:-1;11768:18:20;5173:38:1::1;;;;;;;5103:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5063:159;;690:101:9::0;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;759:25:9::1;775:8;759:15;:25::i;3288:182:2:-:0;1019:7:12;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;3380:12:2::1;;3371:6;:21;3363:69;;;::::0;-1:-1:-1;;;3363:69:2;;24914:2:20;3363:69:2::1;::::0;::::1;24896:21:20::0;24953:2;24933:18;;;24926:30;24992:34;24972:18;;;24965:62;-1:-1:-1;;;25043:18:20;;;25036:33;25086:19;;3363:69:2::1;24712:399:20::0;3363:69:2::1;3442:12;:21:::0;3288:182::o;1846:189:12:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:12;665:10:18;1185:23:12;1177:68;;;;-1:-1:-1;;;1177:68:12;;12397:2:20;1177:68:12;;;12379:21:20;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:20;;;12448:62;12527:18;;1177:68:12;12195:356:20;1177:68:12;-1:-1:-1;;;;;1934:22:12;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:12;;25318:2:20;1926:73:12::1;::::0;::::1;25300:21:20::0;25357:2;25337:18;;;25330:30;25396:34;25376:18;;;25369:62;25467:8;25447:18;;;25440:36;25493:19;;1926:73:12::1;25116:402:20::0;1926:73:12::1;2009:19;2019:8;2009:9;:19::i;882:200:9:-:0;-1:-1:-1;;;;;557:19:9;;534:4;557:19;;;:9;:19;;;;;;;;948:21;940:61;;;;-1:-1:-1;;;940:61:9;;25725:2:20;940:61:9;;;25707:21:20;25764:2;25744:18;;;25737:30;25803:29;25783:18;;;25776:57;25850:18;;940:61:9;25523:351:20;940:61:9;-1:-1:-1;;;;;1011:19:9;;;;;;:9;:19;;;;;;;;;:26;;-1:-1:-1;;1011:26:9;1033:4;1011:26;;;1052:23;;3464:74:20;;;1052:23:9;;3437:18:20;1052:23:9;3318:226:20;3729:890:0;-1:-1:-1;;;;;3960:15:0;;3923:7;3960:15;;;:7;:15;;;;;;3950:25;;3942:54;;;;-1:-1:-1;;;3942:54:0;;15475:2:20;3942:54:0;;;15457:21:20;15514:2;15494:18;;;15487:30;-1:-1:-1;;;15533:18:20;;;15526:46;15589:18;;3942:54:0;15273:340:20;3942:54:0;-1:-1:-1;;;;;4014:15:0;;;;;;:7;:15;;;;;;:20;;:50;;-1:-1:-1;;;;;;4049:15:0;;;;;;:7;:15;;;;;;4038:26;;;4014:50;4006:79;;;;-1:-1:-1;;;4006:79:0;;26081:2:20;4006:79:0;;;26063:21:20;26120:2;26100:18;;;26093:30;26159:18;26139;;;26132:46;26195:18;;4006:79:0;25879:340:20;4006:79:0;4118:18;;;;;;4103:33;;;;4095:68;;;;-1:-1:-1;;;4095:68:0;;26426:2:20;4095:68:0;;;26408:21:20;26465:2;26445:18;;;26438:30;26504:24;26484:18;;;26477:52;26546:18;;4095:68:0;26224:346:20;4095:68:0;4369:100;;-1:-1:-1;;4386:10:0;26936:2:20;26932:15;;;26928:24;;4369:100:0;;;26916:37:20;26987:15;;;26983:24;;26969:12;;;26962:46;27042:15;;;27038:24;27024:12;;;27017:46;27079:12;;;27072:28;;;-1:-1:-1;;;;;;27223:3:20;27219:16;;;27215:25;;27201:12;;;27194:47;27276:16;;;27272:25;;27257:13;;;27250:48;4454:13:0;27333:16:20;;27329:25;27314:13;;;27307:48;4173:18:0;;27371:13:20;;4369:100:0;;;-1:-1:-1;;4369:100:0;;;;;;;;;4194:285;;4369:100;4194:285;;;;4497:21;;;;:9;:21;;;;;;4194:285;;-1:-1:-1;4497:21:0;;:30;4489:58;;;;-1:-1:-1;;;4489:58:0;;23847:2:20;4489:58:0;;;23829:21:20;23886:2;23866:18;;;23859:30;-1:-1:-1;;;23905:18:20;;;23898:45;23960:18;;4489:58:0;23645:339:20;4489:58:0;4557:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;4557:28:0;4581:4;4557:28;;;4567:10;-1:-1:-1;3729:890:0;;;;;;;;:::o;2053:117:13:-;1111:7;;;;1612:41;;;;-1:-1:-1;;;1612:41:13;;27597:2:20;1612:41:13;;;27579:21:20;27636:2;27616:18;;;27609:30;27675:22;27655:18;;;27648:50;27715:18;;1612:41:13;27395:344:20;1612:41:13;2111:7:::1;:15:::0;;-1:-1:-1;;2111:15:13::1;::::0;;2141:22:::1;665:10:18::0;2150:12:13::1;2141:22;::::0;-1:-1:-1;;;;;3482:55:20;;;3464:74;;3452:2;3437:18;2141:22:13::1;3318:226:20::0;845:241:16;1010:68;;-1:-1:-1;;;;;28025:15:20;;;1010:68:16;;;28007:34:20;28077:15;;28057:18;;;28050:43;28109:18;;;28102:34;;;983:96:16;;1003:5;;-1:-1:-1;;;1033:27:16;27919:18:20;;1010:68:16;;;;-1:-1:-1;;1010:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;983:19;:96::i;3545:1307:2:-;3739:33;;;3731:81;;;;-1:-1:-1;;;3731:81:2;;28734:2:20;3731:81:2;;;28716:21:20;28773:2;28753:18;;;28746:30;28812:34;28792:18;;;28785:62;-1:-1:-1;;;28863:18:20;;;28856:33;28906:19;;3731:81:2;28532:399:20;3731:81:2;3822:18;;3877:95;3897:19;;;3877:95;;;3951:7;;3959:1;3951:10;;;;;;;:::i;:::-;;;;;;;3937:24;;;;;:::i;:::-;;-1:-1:-1;3918:3:2;;;;:::i;:::-;;;;3877:95;;;-1:-1:-1;3981:14:2;4017:1;3999:14;:10;4012:1;3999:14;:::i;:::-;3998:20;;;;:::i;:::-;:24;;4021:1;3998:24;:::i;:::-;3981:41;-1:-1:-1;4033:19:2;;;;4164:644;4184:16;;;4164:644;;;4221:14;4238:23;4252:5;;4258:1;4252:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4238:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:13;;:23;;;;:::i;:::-;4221:40;;4292:4;-1:-1:-1;;;;;4283:13:2;:6;-1:-1:-1;;;;;4283:13:2;;4275:56;;;;-1:-1:-1;;;4275:56:2;;30059:2:20;4275:56:2;;;30041:21:20;30098:2;30078:18;;;30071:30;30137:32;30117:18;;;30110:60;30187:18;;4275:56:2;29857:354:20;4275:56:2;4352:6;4345:13;;4423:146;4439:8;;4448:5;4439:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4430:24:2;:6;-1:-1:-1;;;;;4430:24:2;;4423:146;;;4474:10;4483:1;4474:10;;:::i;:::-;;-1:-1:-1;4510:23:2;;;4502:52;;;;-1:-1:-1;;;4502:52:2;;30418:2:20;4502:52:2;;;30400:21:20;30457:2;30437:18;;;30430:30;30496:18;30476;;;30469:46;30532:18;;4502:52:2;30216:340:20;4502:52:2;4423:146;;;4596:8;;4605:5;4596:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4586:25:2;:6;-1:-1:-1;;;;;4586:25:2;;4582:93;;;4646:7;;4654:5;4646:14;;;;;;;:::i;:::-;;;;;;;4631:29;;;;;:::i;:::-;;;4582:93;4707:6;4692:11;:21;4688:110;;4777:7;;;;;;;;;4688:110;-1:-1:-1;4202:3:2;;;;:::i;:::-;;;;4164:644;;;-1:-1:-1;4817:28:2;;-1:-1:-1;;;4817:28:2;;30763:2:20;4817:28:2;;;30745:21:20;30802:2;30782:18;;;30775:30;30841:20;30821:18;;;30814:48;30879:18;;4817:28:2;30561:342:20;3545:1307:2;;;;;;;;:::o;1238:187:10:-;-1:-1:-1;;;;;740:16:10;;717:4;740:16;;;:7;:16;;;;;;;;1296:51;;;;-1:-1:-1;;;1296:51:10;;31110:2:20;1296:51:10;;;31092:21:20;31149:2;31129:18;;;31122:30;31188:23;31168:18;;;31161:51;31229:18;;1296:51:10;30908:345:20;1296:51:10;-1:-1:-1;;;;;1357:16:10;;1376:5;1357:16;;;:7;:16;;;;;;;;;:24;;-1:-1:-1;;1357:24:10;;;1396:22;;3464:74:20;;;1396:22:10;;3437:18:20;1396:22:10;3318:226:20;2041:169:12;2096:16;2115:6;;-1:-1:-1;;;;;2131:17:12;;;-1:-1:-1;;;;;;2131:17:12;;;;;;2163:40;;2115:6;;;;;;;2163:40;;2096:16;2163:40;2086:124;2041:169;:::o;1046:186:10:-;-1:-1:-1;;;;;740:16:10;;717:4;740:16;;;:7;:16;;;;;;;;1109:18;1101:56;;;;-1:-1:-1;;;1101:56:10;;31460:2:20;1101:56:10;;;31442:21:20;31499:2;31479:18;;;31472:30;31538:27;31518:18;;;31511:55;31583:18;;1101:56:10;31258:349:20;1101:56:10;-1:-1:-1;;;;;1167:16:10;;;;;;:7;:16;;;;;;;;;:23;;-1:-1:-1;;1167:23:10;1186:4;1167:23;;;1205:20;;3464:74:20;;;1205:20:10;;3437:18:20;1205:20:10;3318:226:20;1806:115:13;1111:7;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:13;;13251:2:20;1346:38:13;;;13233:21:20;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:20;;;13302:46;13365:18;;1346:38:13;13049:340:20;1346:38:13;1865:7:::1;:14:::0;;-1:-1:-1;;1865:14:13::1;1875:4;1865:14;::::0;;1894:20:::1;1901:12;665:10:18::0;;586:96;1755:487:8;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1852:31:8;1886:20;;;:16;:20;;;;;;;;;1852:54;;;;;;;;;-1:-1:-1;;;;;1852:54:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1916:61;;;;-1:-1:-1;;;1916:61:8;;31814:2:20;1916:61:8;;;31796:21:20;31853:2;31833:18;;;31826:30;31892:28;31872:18;;;31865:56;31938:18;;1916:61:8;31612:350:20;1916:61:8;2034:11;;2013:8;:18;;;:32;;;;:::i;:::-;1995:15;:50;1987:92;;;;-1:-1:-1;;;1987:92:8;;32169:2:20;1987:92:8;;;32151:21:20;32208:2;32188:18;;;32181:30;32247:31;32227:18;;;32220:59;32296:18;;1987:92:8;31967:353:20;1987:92:8;2096:20;;;;:16;:20;;;;;;;;2089:27;;-1:-1:-1;;;;;;2089:27:8;;;;;;;;;;;;;;;;;;;;;;;;;;;2159:17;;2178:14;;;;2194:15;;;;2131:79;;;;;;2113:2;;2159:17;;2178:14;;2194:15;32556:25:20;;;-1:-1:-1;;;;;32678:15:20;;;32673:2;32658:18;;32651:43;32730:15;;32725:2;32710:18;;32703:43;32777:2;32762:18;;32755:34;32543:3;32528:19;;32325:470;2131:79:8;;;;;;;;2227:8;1755:487;-1:-1:-1;;1755:487:8:o;5234:482:1:-;5369:10;;-1:-1:-1;;;;;5359:20:1;;;5369:10;;5359:20;5355:355;;;5458:10;;5452:35;;-1:-1:-1;;;5452:35:1;;;;;1507:25:20;;;-1:-1:-1;;;;;5458:10:1;;;;5452:26;;1480:18:20;;5452:35:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5502:9;5517;-1:-1:-1;;;;;5517:14:1;5539:7;5553:5;5517:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5501:62;;;5585:4;5577:44;;;;-1:-1:-1;;;5577:44:1;;33212:2:20;5577:44:1;;;33194:21:20;33251:2;33231:18;;;33224:30;33290:29;33270:18;;;33263:57;33337:18;;5577:44:1;33010:351:20;5355:355:1;5652:47;-1:-1:-1;;;;;5652:27:1;;5680:9;5691:7;5652:27;:47::i;:::-;5234:482;;;:::o;535:981:7:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;566:11:5;;;-1:-1:-1;;;;730:780:7;741:5:5;;;;:12;731:7;;:22;730:780:7;;;780:12;:3;:10;:12::i;:::-;766:26;;-1:-1:-1;766:26:7;-1:-1:-1;884:3:7;891:1;884:8;880:591;;;931:15;:3;:13;:15::i;:::-;912:35;;;;730:780;;880:591;972:3;979:1;972:8;968:503;;;1018:15;:3;:13;:15::i;:::-;1000:34;;:8;;;:34;730:780;;968:503;1059:3;1066:1;1059:8;1055:416;;;1100:27;1112:14;:3;:12;:14::i;:::-;1100:11;:27::i;:::-;-1:-1:-1;;;;;1087:40:7;:10;;;:40;730:780;;1055:416;1152:3;1159:1;1152:8;1148:323;;;1190:27;1202:14;:3;:12;:14::i;1190:27::-;-1:-1:-1;;;;;1180:37:7;:7;;;:37;730:780;;1148:323;1242:3;1249:1;1242:8;1238:233;;;1281:27;1293:14;:3;:12;:14::i;:::-;1281:11;:27::i;:::-;1270:8;;;:38;730:780;;1238:233;1333:3;1340:1;1333:8;1329:142;;;1371:27;1383:14;:3;:12;:14::i;:::-;1371:11;:27::i;:::-;1361:7;;;:37;730:780;;1329:142;1437:19;:3;1451:4;1437:13;:19::i;:::-;730:780;;;622:894;;;535:981;;;:::o;1015:685:11:-;1094:11;;1090:53;;1015:685;;:::o;1090:53::-;-1:-1:-1;;;;;1166:23:11;;1152:11;1166:23;;;:15;:23;;;;;;1203:8;1199:45;;1227:7;1015:685;;:::o;1199:45::-;-1:-1:-1;;;;;1270:20:11;;1253:14;1270:20;;;:12;:20;;;;;;1398:11;;1270:20;;1320:15;;1371:23;1398:11;1320:15;1371:23;:::i;:::-;1370:39;;;;:::i;:::-;-1:-1:-1;;;;;1423:24:11;;;;;;:16;:24;;;;;;1345:64;;-1:-1:-1;1423:41:11;-1:-1:-1;1419:136:11;;;1489:7;1480:16;;1419:136;;;1527:17;1537:7;1527:17;;:::i;:::-;;;1419:136;1582:3;1572:6;:13;;1564:44;;;;-1:-1:-1;;;1564:44:11;;33568:2:20;1564:44:11;;;33550:21:20;33607:2;33587:18;;;33580:30;33646:20;33626:18;;;33619:48;33684:18;;1564:44:11;33366:342:20;1564:44:11;-1:-1:-1;;;;;;1618:20:11;;;;;;;:12;:20;;;;;;;;:29;;;;1657:16;:24;;;:36;;;;-1:-1:-1;;1015:685:11:o;1239:458:8:-;1394:20;;;;:16;:20;;;;;:30;;;:35;1386:79;;;;-1:-1:-1;;;1386:79:8;;33915:2:20;1386:79:8;;;33897:21:20;33954:2;33934:18;;;33927:30;33993:33;33973:18;;;33966:61;34044:18;;1386:79:8;33713:355:20;1386:79:8;1498:153;;;;;;;;-1:-1:-1;;;;;1498:153:8;;;;;;;;;;;;;;;;;;;;;1625:15;1498:153;;;;;;-1:-1:-1;1475:20:8;;;:16;:20;;;;;;;:176;;;;;;;-1:-1:-1;;;;;;1475:176:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1666:24;;;;;1492:2;1507:25:20;;1495:2;1480:18;;1361:177;1666:24:8;;;;;;;;1239:458;;;;:::o;4858:512:2:-;4965:33;;;4957:81;;;;-1:-1:-1;;;4957:81:2;;28734:2:20;4957:81:2;;;28716:21:20;28773:2;28753:18;;;28746:30;28812:34;28792:18;;;28785:62;-1:-1:-1;;;28863:18:20;;;28856:33;28906:19;;4957:81:2;28532:399:20;4957:81:2;5048:12;5088:9;5083:168;5103:19;;;5083:168;;;5165:4;-1:-1:-1;;;;;5151:18:2;:8;;5160:1;5151:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5151:18:2;;5143:65;;;;-1:-1:-1;;;5143:65:2;;34275:2:20;5143:65:2;;;34257:21:20;34314:2;34294:18;;;34287:30;34353:34;34333:18;;;34326:62;-1:-1:-1;;;34404:18:20;;;34397:32;34446:19;;5143:65:2;34073:398:20;5143:65:2;5229:8;;5238:1;5229:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5222:18;-1:-1:-1;5124:3:2;;;;:::i;:::-;;;;5083:168;;;;5296:8;;5306:7;;5279:35;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5279:35:2;;;;;;;;;;5269:46;;5279:35;5269:46;;;;5260:6;:55;5330:33;;;;5345:8;;;;5355:7;;;;5330:33;:::i;:::-;;;;;;;;4947:423;4858:512;;;;:::o;550:1075:6:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;566:11:5;;;-1:-1:-1;;;;733:886:6;741:5:5;;;;:12;731:7;;:22;733:886:6;;;783:12;:3;:10;:12::i;:::-;769:26;;-1:-1:-1;769:26:6;-1:-1:-1;887:3:6;894:1;887:8;883:697;;;926:27;938:14;:3;:12;:14::i;926:27::-;-1:-1:-1;;;;;915:38:6;;;733:886;;883:697;978:3;985:1;978:8;974:606;;;1019:27;1031:14;:3;:12;:14::i;1019:27::-;-1:-1:-1;;;;;1006:40:6;:10;;;:40;733:886;;974:606;1071:3;1078:1;1071:8;1067:513;;;1109:27;1121:14;:3;:12;:14::i;1109:27::-;-1:-1:-1;;;;;1099:37:6;:7;;;:37;733:886;;1067:513;1161:3;1168:1;1161:8;1157:423;;;1200:27;1212:14;:3;:12;:14::i;1200:27::-;1189:8;;;:38;733:886;;1157:423;1252:3;1259:1;1252:8;1248:332;;;1302:15;:3;:13;:15::i;:::-;1280:38;;:12;;;:38;733:886;;1248:332;1343:3;1350:1;1343:8;1339:241;;;1393:15;:3;:13;:15::i;:::-;1371:38;;:12;;;:38;733:886;;1339:241;1434:3;1441:1;1434:8;1430:150;;;1480:27;1492:14;:3;:12;:14::i;1480:27::-;1462:15;;;:45;733:886;;1430:150;1546:19;:3;1560:4;1546:13;:19::i;:::-;733:886;;1088:201:9;-1:-1:-1;;;;;557:19:9;;534:4;557:19;;;:9;:19;;;;;;;;1149:56;;;;-1:-1:-1;;;1149:56:9;;35786:2:20;1149:56:9;;;35768:21:20;35825:2;35805:18;;;35798:30;35864:25;35844:18;;;35837:53;35907:18;;1149:56:9;35584:347:20;1149:56:9;-1:-1:-1;;;;;1215:19:9;;1237:5;1215:19;;;:9;:19;;;;;;;;;:27;;-1:-1:-1;;1215:27:9;;;1257:25;;3464:74:20;;;1257:25:9;;3437:18:20;1257:25:9;3318:226:20;3140:706:16;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:16;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:16;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:16;;36420:2:20;3744:85:16;;;36402:21:20;36459:2;36439:18;;;36432:30;36498:34;36478:18;;;36471:62;36569:12;36549:18;;;36542:40;36599:19;;3744:85:16;36218:406:20;1288:1241:19;1366:7;1582:9;:16;1602:2;1582:22;1578:945;;;1871:4;1856:20;;1850:27;1920:4;1905:20;;1899:27;1977:4;1962:20;;1956:27;1620:9;1948:36;2018:22;2026:4;1948:36;1850:27;1899;2018:7;:22::i;:::-;2011:29;;;;;;;1578:945;2061:9;:16;2081:2;2061:22;2057:466;;;2330:4;2315:20;;2309:27;2380:4;2365:20;;2359:27;2420:20;2428:4;2309:27;2359;2420:7;:20::i;:::-;2413:27;;;;;;2057:466;2471:41;;-1:-1:-1;;;2471:41:19;;36831:2:20;2471:41:19;;;36813:21:20;36870:2;36850:18;;;36843:30;36909:33;36889:18;;;36882:61;36960:18;;2471:41:19;36629:355:20;2057:466:19;1288:1241;;;;:::o;634:205:16:-;773:58;;-1:-1:-1;;;;;11813:55:20;;773:58:16;;;11795:74:20;11885:18;;;11878:34;;;746:86:16;;766:5;;-1:-1:-1;;;796:23:16;11768:18:20;;773:58:16;11621:297:20;814:190:5;872:11;885:17;914:9;926:14;936:3;926:9;:14::i;:::-;914:26;-1:-1:-1;956:5:5;960:1;914:26;956:5;:::i;:::-;950:11;;991:1;995;991:5;982:15;;;;;;;;:::i;:::-;971:26;;904:100;814:190;;;:::o;1775:902::-;1959:5;;;;;2019:7;;2118:19;;;;;2112:26;1836:9;;;;2296:326;2320:2;2316:1;:6;2296:326;;;2375:12;;;;-1:-1:-1;2498:5:5;2380:1;2502;2498:5;:::i;:::-;2484:1;2488:4;2484:8;2483:21;;2478:26;;;;2522:1;2526:4;2522:8;2534:1;2522:13;2518:94;;;2566:5;:1;2570;2566:5;:::i;:::-;2555:16;;:3;;:16;;;;;:::i;:::-;;;-1:-1:-1;1775:902:5;;;-1:-1:-1;;;;;1775:902:5:o;2518:94::-;2324:3;;;;:::i;:::-;;;;2296:326;;;;2631:8;;;2735:679;2795:14;2821:11;2835:14;2845:3;2835:9;:14::i;:::-;2821:28;;2859:11;2883:3;2873;:7;;;:13;;;;:::i;:::-;2859:27;;2911:3;:5;;;:12;2904:3;:19;;2896:28;;;;;;2966:3;2956:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2956:14:5;-1:-1:-1;3000:5:5;;;;;3100:7;;2952:18;;-1:-1:-1;3000:5:5;3150:10;;;;3186:29;;;;2980:17;3234:151;3258:3;3254:1;:7;3234:151;;;3342:17;;;3336:24;3320:14;;;3313:48;3263:7;3268:2;3357:1;3263:7;:::i;:::-;;;3234:151;;;-1:-1:-1;;;3394:13:5;;-1:-1:-1;2735:679:5;;-1:-1:-1;2735:679:5:o;5121:107::-;5178:9;5203:18;5219:1;5203:15;:18::i;4796:319::-;4853:9;4894:2;4882:1;:8;:14;;4874:23;;;;;;4998:2;4995:1;4991:10;4985:17;4980:22;;5066:1;:8;5061:2;:13;;;;:::i;:::-;5056:19;;:1;:19;:::i;:::-;5050:26;;4796:319;-1:-1:-1;4796:319:5:o;5510:172::-;5567:9;5596:1;:8;5608:2;5596:14;5588:23;;;;;;-1:-1:-1;5662:2:5;5655:10;5649:17;;5510:172::o;4235:428::-;4324:15;4316:4;:23;;;;;;;;:::i;:::-;;4312:321;;;4355:14;4365:3;4355:9;:14::i;4312:321::-;4398:20;4390:4;:28;;;;;;;;:::i;:::-;;4386:247;;;4434:11;4448:14;4458:3;4448:9;:14::i;:::-;4434:28;;4487:3;4476;:7;;:14;;;;;;;:::i;:::-;;;-1:-1:-1;4552:5:5;;;;:12;4541:7;;:23;;4533:32;;;;;3461:223:17;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;;3461:223;;;;;;:::o;3265:1486:19:-;3388:7;4316:66;4302:80;;;4281:161;;;;-1:-1:-1;;;4281:161:19;;37453:2:20;4281:161:19;;;37435:21:20;37492:2;37472:18;;;37465:30;37531:34;37511:18;;;37504:62;-1:-1:-1;;;37582:18:20;;;37575:32;37624:19;;4281:161:19;37251:398:20;4281:161:19;4460:1;:7;;4465:2;4460:7;:18;;;;4471:1;:7;;4476:2;4471:7;4460:18;4452:65;;;;-1:-1:-1;;;4452:65:19;;37856:2:20;4452:65:19;;;37838:21:20;37895:2;37875:18;;;37868:30;37934:34;37914:18;;;37907:62;-1:-1:-1;;;37985:18:20;;;37978:32;38027:19;;4452:65:19;37654:398:20;4452:65:19;4629:24;;;4612:14;4629:24;;;;;;;;;38284:25:20;;;38357:4;38345:17;;38325:18;;;38318:45;;;;38379:18;;;38372:34;;;38422:18;;;38415:34;;;4629:24:19;;38256:19:20;;4629:24:19;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4629:24:19;;-1:-1:-1;;4629:24:19;;;-1:-1:-1;;;;;;;4671:20:19;;4663:57;;;;-1:-1:-1;;;4663:57:19;;38662:2:20;4663:57:19;;;38644:21:20;38701:2;38681:18;;;38674:30;38740:26;38720:18;;;38713:54;38784:18;;4663:57:19;38460:348:20;4663:57:19;4738:6;3265:1486;-1:-1:-1;;;;;3265:1486:19:o;2780:359::-;2887:7;2978:66;2970:75;;3071:3;3067:12;;;3081:2;3063:21;3110:22;3118:4;3063:21;3127:1;2970:75;3110:7;:22::i;:::-;3103:29;2780:359;-1:-1:-1;;;;;;2780:359:19:o;5234:270:5:-;5298:17;5335:1;:8;5347:2;5335:14;5327:23;;;;;;-1:-1:-1;5454:2:5;5447:10;5441:17;5460:27;5437:51;;;5234:270::o;4548:500:17:-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:17;;39015:2:20;4737:81:17;;;38997:21:20;39054:2;39034:18;;;39027:30;39093:34;39073:18;;;39066:62;39164:8;39144:18;;;39137:36;39190:19;;4737:81:17;38813:402:20;4737:81:17;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:17;;39422:2:20;4828:60:17;;;39404:21:20;39461:2;39441:18;;;39434:30;39500:31;39480:18;;;39473:59;39549:18;;4828:60:17;39220:353:20;4828:60:17;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:17;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:52;5007:7;5016:10;5028:12;4989:17;:52::i;:::-;4982:59;4548:500;-1:-1:-1;;;;;;;4548:500:17:o;6950:692::-;7096:12;7124:7;7120:516;;;-1:-1:-1;7154:10:17;7147:17;;7120:516;7265:17;;:21;7261:365;;7459:10;7453:17;7519:15;7506:10;7502:2;7498:19;7491:44;7261:365;7598:12;7591:20;;-1:-1:-1;;;7591:20:17;;;;;;;;:::i;14:367:20:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:20;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:773::-;508:6;516;524;532;585:2;573:9;564:7;560:23;556:32;553:52;;;601:1;598;591:12;553:52;641:9;628:23;670:18;711:2;703:6;700:14;697:34;;;727:1;724;717:12;697:34;766:70;828:7;819:6;808:9;804:22;766:70;:::i;:::-;855:8;;-1:-1:-1;740:96:20;-1:-1:-1;943:2:20;928:18;;915:32;;-1:-1:-1;959:16:20;;;956:36;;;988:1;985;978:12;956:36;;1027:72;1091:7;1080:8;1069:9;1065:24;1027:72;:::i;:::-;386:773;;;;-1:-1:-1;1118:8:20;-1:-1:-1;;;;386:773:20:o;1543:196::-;1611:20;;-1:-1:-1;;;;;1660:54:20;;1650:65;;1640:93;;1729:1;1726;1719:12;1640:93;1543:196;;;:::o;1744:186::-;1803:6;1856:2;1844:9;1835:7;1831:23;1827:32;1824:52;;;1872:1;1869;1862:12;1824:52;1895:29;1914:9;1895:29;:::i;1935:180::-;1994:6;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;-1:-1:-1;2086:23:20;;1935:180;-1:-1:-1;1935:180:20:o;2497:171::-;2564:20;;2624:18;2613:30;;2603:41;;2593:69;;2658:1;2655;2648:12;2673:163;2740:20;;2800:10;2789:22;;2779:33;;2769:61;;2826:1;2823;2816:12;2841:472;2933:6;2941;2949;2957;2965;3018:3;3006:9;2997:7;2993:23;2989:33;2986:53;;;3035:1;3032;3025:12;2986:53;3058:29;3077:9;3058:29;:::i;:::-;3048:39;;3134:2;3123:9;3119:18;3106:32;3096:42;;3157:37;3190:2;3179:9;3175:18;3157:37;:::i;:::-;3147:47;;3213:37;3246:2;3235:9;3231:18;3213:37;:::i;:::-;3203:47;;3269:38;3302:3;3291:9;3287:19;3269:38;:::i;:::-;3259:48;;2841:472;;;;;;;;:::o;3549:184::-;3607:6;3660:2;3648:9;3639:7;3635:23;3631:32;3628:52;;;3676:1;3673;3666:12;3628:52;3699:28;3717:9;3699:28;:::i;3738:254::-;3806:6;3814;3867:2;3855:9;3846:7;3842:23;3838:32;3835:52;;;3883:1;3880;3873:12;3835:52;3906:29;3925:9;3906:29;:::i;:::-;3896:39;3982:2;3967:18;;;;3954:32;;-1:-1:-1;;;3738:254:20:o;3997:127::-;4058:10;4053:3;4049:20;4046:1;4039:31;4089:4;4086:1;4079:15;4113:4;4110:1;4103:15;4129:1915;4316:6;4324;4332;4340;4348;4356;4364;4417:3;4405:9;4396:7;4392:23;4388:33;4385:53;;;4434:1;4431;4424:12;4385:53;4474:9;4461:23;4503:18;4544:2;4536:6;4533:14;4530:34;;;4560:1;4557;4550:12;4530:34;4598:6;4587:9;4583:22;4573:32;;4643:7;4636:4;4632:2;4628:13;4624:27;4614:55;;4665:1;4662;4655:12;4614:55;4701:2;4688:16;4723:2;4719;4716:10;4713:36;;;4729:18;;:::i;:::-;4804:2;4798:9;4772:2;4858:13;;-1:-1:-1;;4854:22:20;;;4878:2;4850:31;4846:40;4834:53;;;4902:18;;;4922:22;;;4899:46;4896:72;;;4948:18;;:::i;:::-;4988:10;4984:2;4977:22;5023:2;5015:6;5008:18;5065:7;5058:4;5053:2;5049;5045:11;5041:22;5038:35;5035:55;;;5086:1;5083;5076:12;5035:55;5146:2;5139:4;5135:2;5131:13;5124:4;5116:6;5112:17;5099:50;5168:1;5158:11;;5213:2;5206:4;5201:2;5193:6;5189:15;5185:26;5178:38;5235:6;5225:16;;;;;5294:4;5283:9;5279:20;5266:34;5325:2;5315:8;5312:16;5309:38;;;5342:2;5338;5331:14;5309:38;5382:72;5446:7;5435:8;5424:9;5420:24;5382:72;:::i;:::-;5473:8;;-1:-1:-1;5356:98:20;-1:-1:-1;;5561:2:20;5546:18;;5533:32;5577:16;;;5574:38;;;5607:2;5603;5596:14;5574:38;5647:72;5711:7;5700:8;5689:9;5685:24;5647:72;:::i;:::-;5738:8;;-1:-1:-1;5621:98:20;-1:-1:-1;;5826:2:20;5811:18;;5798:32;5842:16;;;5839:38;;;5872:2;5868;5861:14;5839:38;5912:72;5976:7;5965:8;5954:9;5950:24;5912:72;:::i;:::-;4129:1915;;;;-1:-1:-1;4129:1915:20;;-1:-1:-1;4129:1915:20;;;;5886:98;;-1:-1:-1;;;;;4129:1915:20:o;6254:1554::-;6443:6;6451;6459;6467;6475;6483;6491;6499;6552:3;6540:9;6531:7;6527:23;6523:33;6520:53;;;6569:1;6566;6559:12;6520:53;6609:9;6596:23;6638:18;6679:2;6671:6;6668:14;6665:34;;;6695:1;6692;6685:12;6665:34;6733:6;6722:9;6718:22;6708:32;;6778:7;6771:4;6767:2;6763:13;6759:27;6749:55;;6800:1;6797;6790:12;6749:55;6840:2;6827:16;6866:2;6858:6;6855:14;6852:34;;;6882:1;6879;6872:12;6852:34;6929:7;6922:4;6913:6;6909:2;6905:15;6901:26;6898:39;6895:59;;;6950:1;6947;6940:12;6895:59;6981:4;6973:13;;;;-1:-1:-1;7005:6:20;-1:-1:-1;7049:20:20;;;7036:34;;7082:16;;;7079:36;;;7111:1;7108;7101:12;7079:36;7150:72;7214:7;7203:8;7192:9;7188:24;7150:72;:::i;:::-;7241:8;;-1:-1:-1;7124:98:20;-1:-1:-1;7329:2:20;7314:18;;7301:32;;-1:-1:-1;7345:16:20;;;7342:36;;;7374:1;7371;7364:12;7342:36;7413:72;7477:7;7466:8;7455:9;7451:24;7413:72;:::i;:::-;7504:8;;-1:-1:-1;7387:98:20;-1:-1:-1;7592:2:20;7577:18;;7564:32;;-1:-1:-1;7608:16:20;;;7605:36;;;7637:1;7634;7627:12;7605:36;;7676:72;7740:7;7729:8;7718:9;7714:24;7676:72;:::i;:::-;6254:1554;;;;-1:-1:-1;6254:1554:20;;-1:-1:-1;6254:1554:20;;;;;;7767:8;-1:-1:-1;;;6254:1554:20:o;7813:547::-;7914:6;7922;7930;7938;7946;7954;8007:3;7995:9;7986:7;7982:23;7978:33;7975:53;;;8024:1;8021;8014:12;7975:53;8047:29;8066:9;8047:29;:::i;:::-;8037:39;;8095:38;8129:2;8118:9;8114:18;8095:38;:::i;:::-;8085:48;;8180:2;8169:9;8165:18;8152:32;8142:42;;8203:37;8236:2;8225:9;8221:18;8203:37;:::i;:::-;8193:47;;8259:38;8292:3;8281:9;8277:19;8259:38;:::i;:::-;8249:48;;8316:38;8349:3;8338:9;8334:19;8316:38;:::i;:::-;8306:48;;7813:547;;;;;;;;:::o;8840:1767::-;9090:6;9098;9106;9114;9122;9130;9138;9146;9154;9162;9170:7;9224:3;9212:9;9203:7;9199:23;9195:33;9192:53;;;9241:1;9238;9231:12;9192:53;9277:9;9264:23;9254:33;;9306:18;9373:2;9367;9356:9;9352:18;9339:32;9336:40;9333:60;;;9389:1;9386;9379:12;9333:60;9428:96;9516:7;9509:2;9498:9;9494:18;9481:32;9470:9;9466:48;9428:96;:::i;:::-;9543:8;;-1:-1:-1;9570:8:20;-1:-1:-1;9621:2:20;9606:18;;9593:32;9590:40;-1:-1:-1;9587:60:20;;;9643:1;9640;9633:12;9587:60;9682:96;9770:7;9763:2;9752:9;9748:18;9735:32;9724:9;9720:48;9682:96;:::i;:::-;9797:8;;-1:-1:-1;9824:8:20;-1:-1:-1;9875:2:20;9860:18;;9847:32;9844:40;-1:-1:-1;9841:60:20;;;9897:1;9894;9887:12;9841:60;9936:96;10024:7;10017:2;10006:9;10002:18;9989:32;9978:9;9974:48;9936:96;:::i;:::-;10051:8;;-1:-1:-1;10078:8:20;-1:-1:-1;10129:3:20;10114:19;;10101:33;10098:41;-1:-1:-1;10095:61:20;;;10152:1;10149;10142:12;10095:61;10191:97;10280:7;10272:3;10261:9;10257:19;10244:33;10233:9;10229:49;10191:97;:::i;:::-;10307:8;;-1:-1:-1;10334:8:20;-1:-1:-1;10385:3:20;10370:19;;10357:33;10354:41;-1:-1:-1;10351:61:20;;;10408:1;10405;10398:12;10351:61;;10448:97;10537:7;10529:3;10518:9;10514:19;10501:33;10490:9;10486:49;10448:97;:::i;:::-;10564:8;10554:18;;10592:9;10581:20;;;;8840:1767;;;;;;;;;;;;;;:::o;11489:127::-;11550:10;11545:3;11541:20;11538:1;11531:31;11581:4;11578:1;11571:15;11605:4;11602:1;11595:15;11923:127;11984:10;11979:3;11975:20;11972:1;11965:31;12015:4;12012:1;12005:15;12039:4;12036:1;12029:15;12055:135;12094:3;-1:-1:-1;;12115:17:20;;12112:43;;;12135:18;;:::i;:::-;-1:-1:-1;12182:1:20;12171:13;;12055:135::o;12556:128::-;12596:3;12627:1;12623:6;12620:1;12617:13;12614:39;;;12633:18;;:::i;:::-;-1:-1:-1;12669:9:20;;12556:128::o;15618:236::-;15657:3;15685:18;15730:2;15727:1;15723:10;15760:2;15757:1;15753:10;15791:3;15787:2;15783:12;15778:3;15775:21;15772:47;;;15799:18;;:::i;:::-;15835:13;;15618:236;-1:-1:-1;;;;15618:236:20:o;16357:437::-;16427:3;16478:5;16501:1;16511:258;16525:6;16522:1;16519:13;16511:258;;;-1:-1:-1;;;;;16590:26:20;16609:6;16590:26;:::i;:::-;16586:75;16574:88;;16685:4;16709:12;;;;16744:15;;;;;16547:1;16540:9;16511:258;;;-1:-1:-1;16785:3:20;;16357:437;-1:-1:-1;;;;16357:437:20:o;16799:351::-;16869:3;-1:-1:-1;;;;;16893:6:20;16890:78;16887:98;;;16981:1;16978;16971:12;16887:98;17017:6;17014:1;17010:14;17058:8;17051:5;17046:3;17033:34;17124:1;17086:18;;17113:13;;;-1:-1:-1;17086:18:20;;16799:351;-1:-1:-1;;16799:351:20:o;17155:403::-;17414:3;17439:113;17493:58;17547:3;17539:6;17531;17493:58;:::i;:::-;17485:6;17477;17439:113;:::i;18360:345::-;18557:6;18552:3;18545:19;18608:6;18600;18595:2;18590:3;18586:12;18573:42;18527:3;18638:16;;18656:2;18634:25;18668:13;;;18634:25;18360:345;-1:-1:-1;;18360:345:20:o;21866:533::-;22211:6;22206:3;22199:19;22248:6;22243:2;22238:3;22234:12;22227:28;22181:3;22271:122;22325:67;22388:2;22383:3;22379:12;22371:6;22363;22325:67;:::i;22271:122::-;22264:129;21866:533;-1:-1:-1;;;;;;;;21866:533:20:o;28936:168::-;28976:7;29042:1;29038;29034:6;29030:14;29027:1;29024:21;29019:1;29012:9;29005:17;29001:45;28998:71;;;29049:18;;:::i;:::-;-1:-1:-1;29089:9:20;;28936:168::o;29109:217::-;29149:1;29175;29165:132;;29219:10;29214:3;29210:20;29207:1;29200:31;29254:4;29251:1;29244:15;29282:4;29279:1;29272:15;29165:132;-1:-1:-1;29311:9:20;;29109:217::o;29331:521::-;29408:4;29414:6;29474:11;29461:25;29568:2;29564:7;29553:8;29537:14;29533:29;29529:43;29509:18;29505:68;29495:96;;29587:1;29584;29577:12;29495:96;29614:33;;29666:20;;;-1:-1:-1;29709:18:20;29698:30;;29695:50;;;29741:1;29738;29731:12;29695:50;29774:4;29762:17;;-1:-1:-1;29805:14:20;29801:27;;;29791:38;;29788:58;;;29842:1;29839;29832:12;34476:1103;34764:2;34776:21;;;34749:18;;34832:22;;;34716:4;34911:6;34885:2;34870:18;;34716:4;34945:258;34959:6;34956:1;34953:13;34945:258;;;-1:-1:-1;;;;;35024:26:20;35043:6;35024:26;:::i;:::-;35020:75;35008:88;;35119:4;35178:15;;;;35143:12;;;;34981:1;34974:9;34945:258;;;34949:3;35250:9;35245:3;35241:19;35234:4;35223:9;35219:20;35212:49;35282:6;35277:3;35270:19;-1:-1:-1;;;;;35304:6:20;35301:78;35298:98;;;35392:1;35389;35382:12;35298:98;35426:6;35423:1;35419:14;35405:28;;35479:6;35471;35464:4;35459:3;35455:14;35442:44;35552:1;35509:16;;35527:4;35505:27;35541:13;;;35505:27;34476:1103;-1:-1:-1;;;;;;34476:1103:20:o;35936:277::-;36003:6;36056:2;36044:9;36035:7;36031:23;36027:32;36024:52;;;36072:1;36069;36062:12;36024:52;36104:9;36098:16;36157:5;36150:13;36143:21;36136:5;36133:32;36123:60;;36179:1;36176;36169:12;36989:127;37050:10;37045:3;37041:20;37038:1;37031:31;37081:4;37078:1;37071:15;37105:4;37102:1;37095:15;37121:125;37161:4;37189:1;37186;37183:8;37180:34;;;37194:18;;:::i;:::-;-1:-1:-1;37231:9:20;;37121:125::o;39578:258::-;39650:1;39660:113;39674:6;39671:1;39668:13;39660:113;;;39750:11;;;39744:18;39731:11;;;39724:39;39696:2;39689:10;39660:113;;;39791:6;39788:1;39785:13;39782:48;;;-1:-1:-1;;39826:1:20;39808:16;;39801:27;39578:258::o;39841:274::-;39970:3;40008:6;40002:13;40024:53;40070:6;40065:3;40058:4;40050:6;40046:17;40024:53;:::i;:::-;40093:16;;;;;39841:274;-1:-1:-1;;39841:274:20:o;40120:383::-;40269:2;40258:9;40251:21;40232:4;40301:6;40295:13;40344:6;40339:2;40328:9;40324:18;40317:34;40360:66;40419:6;40414:2;40403:9;40399:18;40394:2;40386:6;40382:15;40360:66;:::i;:::-;40487:2;40466:15;-1:-1:-1;;40462:29:20;40447:45;;;;40494:2;40443:54;;40120:383;-1:-1:-1;;40120:383:20:o

Swarm Source

ipfs://0d78a5548ff1ceef8f6921195cceda8dea34180a2495748efcb733ce9c144aa6
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading