Contract Address Details

0x810059e1406dEDAFd1BdCa4E0137CbA306c0Ce36

Contract Name
GovernanceDAO
Creator
0xebe894–7a24f6 at 0x084f20–9947d1
Balance
19,177.326007326007326169 CLO ( )
Tokens
Fetching tokens...
Transactions
861 Transactions
Transfers
2 Transfers
Gas Used
73,894,008
Last Balance Update
15590616
Contract name:
GovernanceDAO




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2024-04-11T09:30:06.667348Z

Constructor Arguments

000000000000000000000000ebe894814554c8382ea6a24ccddf1527407a24f6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000055570617574000000000000000000000000000000000000000000000000000000

Arg [0] (address) : 0xebe894814554c8382ea6a24ccddf1527407a24f6
Arg [1] (string) : Upaut

              

Contract source code

// SPDX-License-Identifier: GPL-3.0-only
// Разработчик: Upaut

pragma solidity ^0.8.16;

contract GovernanceDAO {

    struct UserData { // структура описывающая данные каждого участника
        uint256 index; // индекс участника
        uint256 votes; // сколько раз всего голосовал участник
        uint256 entered; // после какого голосования добавился участник
        address userAddr; // адрес участника (упростит задачу frontend)
        string name; // имя участника
    }

    struct ProposalData { // структура описывающая данные каждого предложения для голосования
        uint256 id; // уникальный номер предложения (упростит задачу frontend)
        uint256 time; // Дата создания предложения
        uint256 reward; // награда для участников голосования
        uint256 deadLine; // крайний срок голосования
        address owner; // адрес инициатора предложения
        uint8 status; // текущий статус предложения (1 - голосование, 2 - завершено, 3 - исполнено)
        string comment; // комментарий к предложению
        address[] vocesYes; // сколько участников проголосовало за предложение
        address[] vocesNo; // сколько участников проголосовало против предложения

        address to; // вызываемый контракт при исполнении данного предложения
        bytes data; // данные транзакции
    }

    uint256 public total_voting; // всего голосований
    uint256 public total_close_voting; // всего завершенных голосований    
    uint256 public total_user; // всего пользователей в DAO
    uint256 public expire_period = 3 days; // сколько дней отведено на голосование (возможное значение от 3 до 14 дней)
    uint256 public min_payment_DAO = 100 * 1e18; // минимальная оплата за вынесение предложения на голосование для членов DAO.
    uint256 public min_payment_other = 10000 * 1e18; // минимальная оплата за вынесение предложения на голосование для не членов DAO.

    mapping(uint256 => address) private indexes; // адреса участников по индексу
    mapping(address => UserData) private users; // связь пользователей с их структурой данных
    mapping(uint256 => ProposalData) private proposals; // список всех предложений
    mapping(uint256 => mapping(address => bool)) private rewards; // награды за голосование

    event CreateProposal(uint indexed _id, uint _reward); // ID предложения и награда за голосование
    event Vote(address indexed _sender, uint indexed _id, bool _answer); // Участник, ID предложения, решение
    event ChangeStatus(uint indexed _id, uint8 _status); // ID предложения, новый статус
    event Claim(address indexed _sender, uint indexed _id, uint _pay); // Участник, ID предложения, сколько было выплачено

    modifier onlyThis() {
        require(address(this) == msg.sender, "Only GovernanceDAO");
        _;
    }

    constructor(address _firstUser, string memory _name)
    {
        ++total_user; // увеличиваем количество участников
        indexes[total_user] = _firstUser; // привязываем адрес участника к индексу
        users[_firstUser] = UserData(total_user, 0, 0, _firstUser, _name); // инициализация данных участника
    }


    function setExpirePeriod(uint256 _period) external onlyThis { // установить новый период голосования
        if((_period >= 3 days) && (_period <= 14 days)) expire_period = _period; // новый период должен быть в диапазоне от 3 до 14 дней (включительно)
    }

    function setMinPayments(uint256 _min_payment_DAO, uint256 _min_payment_other) external onlyThis { // установить новые минимальные сборы за вынесение предложения на голосование
        min_payment_DAO = _min_payment_DAO; // минимальная оплата за вынесение предложения на голосование для членов DAO.
        min_payment_other = _min_payment_other; // минимальная оплата за вынесение предложения на голосование для не членов DAO.
    }

    function addUserInDAO(address _user, string calldata _name) external onlyThis { // добавить нового участника
        if(_user == address(0)) return; // участник не может иметь нулевой адрес
        if (users[_user].index == 0){ // только новый участник 
            ++total_user; // увеличиваем количество участников
            indexes[total_user] = _user; // привязываем адрес участника к индексу
            users[_user] = UserData(total_user, 0, total_close_voting, _user, _name); // инициализация данных участника
        }
    }

    function delUserInDAO(address _user) external onlyThis { // удалить участника из DAO
        uint256 _ind = users[_user].index; // индекс удаляемого участника
        if (_ind > 0){ // только существующий участник 
            if(_ind != total_user){ // индекс участника непоследний
                indexes[_ind] = indexes[total_user]; // привязываем адрес последнего участника к новому индексу
                users[indexes[_ind]].index = _ind; // меняем индекс в данных последнего участника
            }
            delete indexes[total_user]; // обнуляем последний индекс
            delete users[_user]; // удаляем данные участника
            --total_user; // уменьшаем количество участников
        }
    }



    function createProposal(address _contract, bytes calldata _data, string calldata _comment) payable external { // создание предложения
        // _contract - адрес контракта, который будет вызван при принятии этого предложения
        // _data - данные вызова (функция и аргументы), закодированные через encodeABI()
        // _comment - краткий комментарий к предложению, возможно ссылка на github с proposal

        if(users[msg.sender].index > 0){ // адрес который выдвигает предложение состоит в DAO
            require(msg.value >= min_payment_DAO, "small payment"); // проверка оплаты предложения
        }
        else{ // адрес который выдвигает предложение не состоит в DAO
            require(msg.value >= min_payment_other, "small payment"); // проверка оплаты предложения
        }

        ++total_voting; // идентификатор нового голосования
        proposals[total_voting].id = total_voting; // уникальный номер предложения
        proposals[total_voting].time = block.timestamp; // Дата создания предложения
        proposals[total_voting].reward = msg.value; // награда для участников голосования
        proposals[total_voting].deadLine = block.timestamp + expire_period; // крайний срок голосования
        proposals[total_voting].owner = msg.sender; // адрес инициатора предложения
        proposals[total_voting].status = 1; // текущий статус предложения
        proposals[total_voting].comment = _comment; // комментарий к предложению
        proposals[total_voting].to = _contract; // вызываемый контракт при исполнении данного предложения
        proposals[total_voting].data = _data; // данные транзакции

        emit CreateProposal(total_voting, msg.value); // логируем ID предложения и награду за голосование
    }


    function vote(uint _id, bool _answer) external { // голосование
        // _id - идентификатор предложения
        // _answer - ваш ответ (0 - отклонить предложение, 1 - одобрить предложение)

        require(proposals[_id].time > 0, "proposal does not exist"); // проверяем что предложение существует
        if(proposals[_id].status > 1) return; // голосование по данному предложению завершено
        if(block.timestamp > proposals[_id].deadLine){ // время голосования истекло
            proposals[_id].status = 2; // голосование завершено
            ++total_close_voting; // увеличиваем количество завершенных голосований
            emit ChangeStatus(_id, 2); // ID предложения, новый статус
            return;
        }

        uint _index = users[msg.sender].index; // получим индекс голосующего в списке DAO
        require(_index > 0, "you are not a member"); // проверяем что голосующий состоит в DAO
        require(!rewards[_id][msg.sender], "you have already voted"); // проверяем что голосующий, ранее не голосовал за это предложение

        rewards[_id][msg.sender] = true; // подтверждаем принятие голоса c фиксацией выплаты за это голосование
        users[msg.sender].votes++; // увеличиваем количество всех голосований участника

        emit Vote(msg.sender, _id, _answer); // логируем участника, ID предложения, принятое решение

        if(_answer){ // голос отдан за принятие предложения
            proposals[_id].vocesYes.push(msg.sender);
        }
        else{ // голос отдан за отклонение предложения
            proposals[_id].vocesNo.push(msg.sender);
        }


        uint _amount_votes = proposals[_id].vocesYes.length + proposals[_id].vocesNo.length; // количество проголосовавших
        if(_amount_votes >= total_user){ // если все участники DAO проголосовали, то голосование досрочно завершаем
            proposals[_id].status = 2; // голосование завершено
            ++total_close_voting; // увеличиваем количество завершенных голосований
            emit ChangeStatus(_id, 2); // ID предложения, новый статус
        }
    }


    function execute(uint _id) external { // Исполнение предложения
        // _id - идентификатор предложения
        require(proposals[_id].status == 2, "proposal is not completed"); // только завершенное предложение можно привести к исполнению
        proposals[_id].status = 3; // меняем статус на состояние "Исполнено"
        if(proposals[_id].vocesYes.length > proposals[_id].vocesNo.length){ // если большинство проголосовало за принятия предложения, то приводим его в исполнение
            _execute(proposals[_id].to, proposals[_id].data);
        }
        emit ChangeStatus(_id, 3); // ID предложения, новый статус
    }

    function _execute(address _to, bytes memory _data) private {
        (bool success,) = _to.call(_data);
        require(success, "Execute error");
    }


    function claim(uint _id) external { // Получить вознаграждение за проведенное голосование
        // _id - идентификатор предложения
        require(proposals[_id].status > 1, "proposal is not completed"); // награду можно требовать только когда голосование завершено
        require(rewards[_id][msg.sender], "no payment"); // проверяем имеет ли отправитель право на выплату
        rewards[_id][msg.sender] = false; // фиксируем выплату отправителю

        uint _amount_votes = proposals[_id].vocesYes.length + proposals[_id].vocesNo.length; // количество проголосовавших
        uint _pay = proposals[_id].reward / _amount_votes; // расчет выплаты для каждого участника
        payable(msg.sender).transfer(_pay); // выплата
        emit Claim(msg.sender, _id, _pay); // Участник, ID предложения, сколько было выплачено
    }



    // ФУНКЦИИ ЧТЕНИЯ

    function getUser(address _user) public view returns (UserData memory) { // Возвращаем данные конкретного пользователя по его адресу
        return (users[_user]);
    }

    function getUsersList(uint _start_index, uint _amount) public view returns (UserData[] memory) { // Возвращаем данные нескольких пользователей из списка
        UserData[] memory _result = new UserData[](_amount);  
        for(uint i; i < _amount; i++) _result[i] = getUser(indexes[_start_index++]);
        return (_result);
    }

    function getProposal(uint _id) public view returns (ProposalData memory) { // Возвращаем данные конкретного предложения по его ID
        return (proposals[_id]);
    }

    function getProposalsList(uint _start_ID, uint _amount) public view returns (ProposalData[] memory) { // Возвращаем данные нескольких предложений из списка от _start_ID к более старым
        _start_ID = ((_start_ID == 0) || (_start_ID > total_voting)) ? total_voting : _start_ID; // если запрашивается индекс = 0 или индекс превышающий последнее предложение, то возврат предложений делается от последнего предложения
        ProposalData[] memory _result = new ProposalData[](_amount); 

        for(uint i; i < _amount; i++){
            if(_start_ID == 0) break; // выход, если все предложения обработаны досрочно
            _result[i] = getProposal(_start_ID--);
        } 
        return (_result);
    }

    function checkClaim(uint _id, address _user) public view returns (bool) { // Проверяет наличие вознаграждения для указанного адреса, в указанном предложении
        return (rewards[_id][_user]);
    }

    function getClaimList(address _user, uint _start_ID, uint _amount) public view returns (uint [] memory, bool [] memory) { // Возвращаем массив предложений и массив наград для указанного адреса (от _start_ID к более старым предложениям)
        // _user - адрес для которого смотрим награды
        // _start_ID - с какого предложения начинать вести поиск наград
        // _amount - количество просматриваемых предложений
         _start_ID = ((_start_ID == 0) || (_start_ID > total_voting)) ? total_voting : _start_ID; // если запрашивается индекс = 0 или индекс превышающий последнее предложение, то возврат предложений делается от последнего предложения
        uint[] memory _proposalID = new uint[](_amount);
        bool[] memory _claim = new bool[](_amount);

        for(uint i; i < _amount; i++){
            if(_start_ID == 0) break; // выход, если все предложения обработаны досрочно
            _proposalID[i] = _start_ID;
            _claim[i] = rewards[_start_ID][_user];
            --_start_ID;
        } 
        return (_proposalID, _claim);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_firstUser","internalType":"address"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"event","name":"ChangeStatus","inputs":[{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"uint8","name":"_status","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"Claim","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"uint256","name":"_pay","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"CreateProposal","inputs":[{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"uint256","name":"_reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Vote","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"bool","name":"_answer","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addUserInDAO","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkClaim","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"createProposal","inputs":[{"type":"address","name":"_contract","internalType":"address"},{"type":"bytes","name":"_data","internalType":"bytes"},{"type":"string","name":"_comment","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delUserInDAO","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"expire_period","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"bool[]","name":"","internalType":"bool[]"}],"name":"getClaimList","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_start_ID","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernanceDAO.ProposalData","components":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"time","internalType":"uint256"},{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"deadLine","internalType":"uint256"},{"type":"address","name":"owner","internalType":"address"},{"type":"uint8","name":"status","internalType":"uint8"},{"type":"string","name":"comment","internalType":"string"},{"type":"address[]","name":"vocesYes","internalType":"address[]"},{"type":"address[]","name":"vocesNo","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"}]}],"name":"getProposal","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct GovernanceDAO.ProposalData[]","components":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"time","internalType":"uint256"},{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"deadLine","internalType":"uint256"},{"type":"address","name":"owner","internalType":"address"},{"type":"uint8","name":"status","internalType":"uint8"},{"type":"string","name":"comment","internalType":"string"},{"type":"address[]","name":"vocesYes","internalType":"address[]"},{"type":"address[]","name":"vocesNo","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"}]}],"name":"getProposalsList","inputs":[{"type":"uint256","name":"_start_ID","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernanceDAO.UserData","components":[{"type":"uint256","name":"index","internalType":"uint256"},{"type":"uint256","name":"votes","internalType":"uint256"},{"type":"uint256","name":"entered","internalType":"uint256"},{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"name","internalType":"string"}]}],"name":"getUser","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct GovernanceDAO.UserData[]","components":[{"type":"uint256","name":"index","internalType":"uint256"},{"type":"uint256","name":"votes","internalType":"uint256"},{"type":"uint256","name":"entered","internalType":"uint256"},{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"name","internalType":"string"}]}],"name":"getUsersList","inputs":[{"type":"uint256","name":"_start_index","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"min_payment_DAO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"min_payment_other","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExpirePeriod","inputs":[{"type":"uint256","name":"_period","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinPayments","inputs":[{"type":"uint256","name":"_min_payment_DAO","internalType":"uint256"},{"type":"uint256","name":"_min_payment_other","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_close_voting","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_user","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_voting","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vote","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"},{"type":"bool","name":"_answer","internalType":"bool"}]}]
            

Contract Creation Code

0x60806040526203f48060035568056bc75e2d6310000060045569021e19e0c9bab24000006005553480156200003357600080fd5b50604051620041f6380380620041f68339818101604052810190620000599190620003c5565b6002600081546200006a9062000464565b919050819055508160066000600254815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a00160405280600254815260200160008152602001600081526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815250600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019081620001c19190620006f2565b509050505050620007d9565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200020e82620001e1565b9050919050565b620002208162000201565b81146200022c57600080fd5b50565b600081519050620002408162000215565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200029b8262000250565b810181811067ffffffffffffffff82111715620002bd57620002bc62000261565b5b80604052505050565b6000620002d2620001cd565b9050620002e0828262000290565b919050565b600067ffffffffffffffff82111562000303576200030262000261565b5b6200030e8262000250565b9050602081019050919050565b60005b838110156200033b5780820151818401526020810190506200031e565b60008484015250505050565b60006200035e6200035884620002e5565b620002c6565b9050828152602081018484840111156200037d576200037c6200024b565b5b6200038a8482856200031b565b509392505050565b600082601f830112620003aa57620003a962000246565b5b8151620003bc84826020860162000347565b91505092915050565b60008060408385031215620003df57620003de620001d7565b5b6000620003ef858286016200022f565b925050602083015167ffffffffffffffff811115620004135762000412620001dc565b5b620004218582860162000392565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000471826200045a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620004a657620004a56200042b565b5b600182019050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050457607f821691505b6020821081036200051a5762000519620004bc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000545565b62000590868362000545565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005d3620005cd620005c7846200045a565b620005a8565b6200045a565b9050919050565b6000819050919050565b620005ef83620005b2565b62000607620005fe82620005da565b84845462000552565b825550505050565b600090565b6200061e6200060f565b6200062b818484620005e4565b505050565b5b8181101562000653576200064760008262000614565b60018101905062000631565b5050565b601f821115620006a2576200066c8162000520565b620006778462000535565b8101602085101562000687578190505b6200069f620006968562000535565b83018262000630565b50505b505050565b600082821c905092915050565b6000620006c760001984600802620006a7565b1980831691505092915050565b6000620006e28383620006b4565b9150826002028217905092915050565b620006fd82620004b1565b67ffffffffffffffff81111562000719576200071862000261565b5b620007258254620004eb565b6200073282828562000657565b600060209050601f8311600181146200076a576000841562000755578287015190505b620007618582620006d4565b865550620007d1565b601f1984166200077a8662000520565b60005b82811015620007a4578489015182556001820191506020850194506020810190506200077d565b86831015620007c45784890151620007c0601f891682620006b4565b8355505b6001600288020188555050505b505050505050565b613a0d80620007e96000396000f3fe60806040526004361061011f5760003560e01c80636f77926b116100a0578063ce83ad9611610064578063ce83ad96146103ef578063d7a52fa914610418578063eb72d0c814610441578063ef81bf1b1461047e578063fe0d94c1146104a75761011f565b80636f77926b146102f6578063b029091414610333578063be8e4d191461035e578063c7f758a814610389578063c9d27afe146103c65761011f565b8063396e75cc116100e7578063396e75cc1461020957806340912990146102465780634dee3534146102715780635d003332146102af57806364bd0cb2146102da5761011f565b806301081fc31461012457806310a4a2dc1461014d57806323ddd0711461017857806331218954146101a3578063379607f5146101e0575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190612295565b6104d0565b005b34801561015957600080fd5b5061016261077d565b60405161016f91906122db565b60405180910390f35b34801561018457600080fd5b5061018d610783565b60405161019a91906122db565b60405180910390f35b3480156101af57600080fd5b506101ca60048036038101906101c59190612322565b610789565b6040516101d7919061237d565b60405180910390f35b3480156101ec57600080fd5b5061020760048036038101906102029190612398565b6107f1565b005b34801561021557600080fd5b50610230600480360381019061022b91906123c5565b610a63565b60405161023d9190612799565b60405180910390f35b34801561025257600080fd5b5061025b610b42565b60405161026891906122db565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906127bb565b610b48565b6040516102a692919061297b565b60405180910390f35b3480156102bb57600080fd5b506102c4610cec565b6040516102d191906122db565b60405180910390f35b6102f460048036038101906102ef9190612a6d565b610cf2565b005b34801561030257600080fd5b5061031d60048036038101906103189190612295565b610fcd565b60405161032a9190612b78565b60405180910390f35b34801561033f57600080fd5b5061034861112c565b60405161035591906122db565b60405180910390f35b34801561036a57600080fd5b50610373611132565b60405161038091906122db565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612398565b611138565b6040516103bd9190612c9e565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612cec565b611497565b005b3480156103fb57600080fd5b5061041660048036038101906104119190612d2c565b6119c4565b005b34801561042457600080fd5b5061043f600480360381019061043a9190612398565b611c65565b005b34801561044d57600080fd5b50610468600480360381019061046391906123c5565b611cf9565b6040516104759190612ec4565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a091906123c5565b611de2565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190612398565b611e62565b005b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461053e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053590612f43565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156107795760025481146106995760066000600254815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b60066000600254815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556004820160006107609190612102565b505060026000815461077190612f92565b919050819055505b5050565b60035481565b60015481565b60006009600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60016008600083815260200190815260200160002060040160149054906101000a900460ff1660ff161161085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190613007565b60405180910390fd5b6009600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90613073565b60405180910390fd5b60006009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600860008381526020019081526020016000206007018054905060086000848152602001908152602001600020600601805490506109a09190613093565b905060008160086000858152602001908152602001600020600201546109c691906130f6565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a0e573d6000803e3d6000fd5b50823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf783604051610a5691906122db565b60405180910390a3505050565b60606000831480610a75575060005483115b610a7f5782610a83565b6000545b925060008267ffffffffffffffff811115610aa157610aa0613127565b5b604051908082528060200260200182016040528015610ada57816020015b610ac7612142565b815260200190600190039081610abf5790505b50905060005b83811015610b37576000850315610b3757610b068580610aff90612f92565b9650611138565b828281518110610b1957610b18613156565b5b60200260200101819052508080610b2f90613185565b915050610ae0565b508091505092915050565b60025481565b6060806000841480610b5b575060005484115b610b655783610b69565b6000545b935060008367ffffffffffffffff811115610b8757610b86613127565b5b604051908082528060200260200182016040528015610bb55781602001602082028036833780820191505090505b50905060008467ffffffffffffffff811115610bd457610bd3613127565b5b604051908082528060200260200182016040528015610c025781602001602082028036833780820191505090505b50905060005b85811015610cdb576000870315610cdb5786838281518110610c2d57610c2c613156565b5b6020026020010181815250506009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16828281518110610caa57610ca9613156565b5b60200260200101901515908115158152505086610cc690612f92565b96508080610cd390613185565b915050610c08565b508181935093505050935093915050565b60045481565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610d8757600454341015610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613219565b60405180910390fd5b610dcd565b600554341015610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390613219565b60405180910390fd5b5b6000808154610ddb90613185565b91905081905550600054600860008054815260200190815260200160002060000181905550426008600080548152602001908152602001600020600101819055503460086000805481526020019081526020016000206002018190555060035442610e469190613093565b60086000805481526020019081526020016000206003018190555033600860008054815260200190815260200160002060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860008054815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550818160086000805481526020019081526020016000206005019182610f0e929190613450565b5084600860008054815260200190815260200160002060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838360086000805481526020019081526020016000206009019182610f8b929190613586565b506000547f6638d63c6abdbf0a059e322e8c8b9401488d94b95731a935ca9f76cde49fa48334604051610fbe91906122db565b60405180910390a25050505050565b610fd56121cb565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820180546110a390613273565b80601f01602080910402602001604051908101604052809291908181526020018280546110cf90613273565b801561111c5780601f106110f15761010080835404028352916020019161111c565b820191906000526020600020905b8154815290600101906020018083116110ff57829003601f168201915b5050505050815250509050919050565b60055481565b60005481565b611140612142565b6008600083815260200190815260200160002060405180610160016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160149054906101000a900460ff1660ff1660ff16815260200160058201805461120a90613273565b80601f016020809104026020016040519081016040528092919081815260200182805461123690613273565b80156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561131157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112c7575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561139f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611355575b505050505081526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160098201805461140e90613273565b80601f016020809104026020016040519081016040528092919081815260200182805461143a90613273565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050505050815250509050919050565b60006008600084815260200190815260200160002060010154116114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906136a2565b60405180910390fd5b60016008600084815260200190815260200160002060040160149054906101000a900460ff1660ff16116119c05760086000838152602001908152602001600020600301544211156115c05760026008600084815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461157b90613185565b91905081905550817f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e860026040516115b391906136fd565b60405180910390a26119c0565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811161164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613764565b60405180910390fd5b6009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906137d0565b60405180910390fd5b60016009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008154809291906117a490613185565b9190505550823373ffffffffffffffffffffffffffffffffffffffff167f8d85a70fd2c5d140a4a01143492d27ff82cfad4cead313e66c53f39b0feb5e0f846040516117f0919061237d565b60405180910390a3811561187a5760086000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118f2565b60086000848152602001908152602001600020600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600860008581526020019081526020016000206007018054905060086000868152602001908152602001600020600601805490506119329190613093565b905060025481106119bd5760026008600086815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461197c90613185565b91905081905550837f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e860026040516119b491906136fd565b60405180910390a25b50505b5050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990612f43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160315611c60576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611c5f57600260008154611ac090613185565b919050819055508260066000600254815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a0016040528060025481526020016000815260200160015481526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019081611c5a91906137f0565b509050505b5b505050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca90612f43565b60405180910390fd5b6203f4808110158015611ce95750621275008111155b15611cf657806003819055505b50565b606060008267ffffffffffffffff811115611d1757611d16613127565b5b604051908082528060200260200182016040528015611d5057816020015b611d3d6121cb565b815260200190600190039081611d355790505b50905060005b83811015611dd757611da6600660008780611d7090613185565b9850815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610fcd565b828281518110611db957611db8613156565b5b60200260200101819052508080611dcf90613185565b915050611d56565b508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4790612f43565b60405180910390fd5b81600481905550806005819055505050565b60026008600083815260200190815260200160002060040160149054906101000a900460ff1660ff1614611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec290613007565b60405180910390fd5b60036008600083815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550600860008281526020019081526020016000206007018054905060086000838152602001908152602001600020600601805490501115612014576120136008600083815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860008481526020019081526020016000206009018054611f9090613273565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbc90613273565b80156120095780601f10611fde57610100808354040283529160200191612009565b820191906000526020600020905b815481529060010190602001808311611fec57829003601f168201915b5050505050612050565b5b807f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e8600360405161204591906138fd565b60405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516120779190613954565b6000604051808303816000865af19150503d80600081146120b4576040519150601f19603f3d011682016040523d82523d6000602084013e6120b9565b606091505b50509050806120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f4906139b7565b60405180910390fd5b505050565b50805461210e90613273565b6000825580601f10612120575061213f565b601f01602090049060005260206000209081019061213e9190612210565b5b50565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5b80821115612229576000816000905550600101612211565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061226282612237565b9050919050565b61227281612257565b811461227d57600080fd5b50565b60008135905061228f81612269565b92915050565b6000602082840312156122ab576122aa61222d565b5b60006122b984828501612280565b91505092915050565b6000819050919050565b6122d5816122c2565b82525050565b60006020820190506122f060008301846122cc565b92915050565b6122ff816122c2565b811461230a57600080fd5b50565b60008135905061231c816122f6565b92915050565b600080604083850312156123395761233861222d565b5b60006123478582860161230d565b925050602061235885828601612280565b9150509250929050565b60008115159050919050565b61237781612362565b82525050565b6000602082019050612392600083018461236e565b92915050565b6000602082840312156123ae576123ad61222d565b5b60006123bc8482850161230d565b91505092915050565b600080604083850312156123dc576123db61222d565b5b60006123ea8582860161230d565b92505060206123fb8582860161230d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61243a816122c2565b82525050565b61244981612257565b82525050565b600060ff82169050919050565b6124658161244f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124a557808201518184015260208101905061248a565b60008484015250505050565b6000601f19601f8301169050919050565b60006124cd8261246b565b6124d78185612476565b93506124e7818560208601612487565b6124f0816124b1565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006125338383612440565b60208301905092915050565b6000602082019050919050565b6000612557826124fb565b6125618185612506565b935061256c83612517565b8060005b8381101561259d5781516125848882612527565b975061258f8361253f565b925050600181019050612570565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b60006125d1826125aa565b6125db81856125b5565b93506125eb818560208601612487565b6125f4816124b1565b840191505092915050565b6000610160830160008301516126186000860182612431565b50602083015161262b6020860182612431565b50604083015161263e6040860182612431565b5060608301516126516060860182612431565b5060808301516126646080860182612440565b5060a083015161267760a086018261245c565b5060c083015184820360c086015261268f82826124c2565b91505060e083015184820360e08601526126a9828261254c565b9150506101008301518482036101008601526126c5828261254c565b9150506101208301516126dc610120860182612440565b506101408301518482036101408601526126f682826125c6565b9150508091505092915050565b600061270f83836125ff565b905092915050565b6000602082019050919050565b600061272f82612405565b6127398185612410565b93508360208202850161274b85612421565b8060005b8581101561278757848403895281516127688582612703565b945061277383612717565b925060208a0199505060018101905061274f565b50829750879550505050505092915050565b600060208201905081810360008301526127b38184612724565b905092915050565b6000806000606084860312156127d4576127d361222d565b5b60006127e286828701612280565b93505060206127f38682870161230d565b92505060406128048682870161230d565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006128468383612431565b60208301905092915050565b6000602082019050919050565b600061286a8261280e565b6128748185612819565b935061287f8361282a565b8060005b838110156128b0578151612897888261283a565b97506128a283612852565b925050600181019050612883565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128f281612362565b82525050565b600061290483836128e9565b60208301905092915050565b6000602082019050919050565b6000612928826128bd565b61293281856128c8565b935061293d836128d9565b8060005b8381101561296e57815161295588826128f8565b975061296083612910565b925050600181019050612941565b5085935050505092915050565b60006040820190508181036000830152612995818561285f565b905081810360208301526129a9818461291d565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126129d7576129d66129b2565b5b8235905067ffffffffffffffff8111156129f4576129f36129b7565b5b602083019150836001820283011115612a1057612a0f6129bc565b5b9250929050565b60008083601f840112612a2d57612a2c6129b2565b5b8235905067ffffffffffffffff811115612a4a57612a496129b7565b5b602083019150836001820283011115612a6657612a656129bc565b5b9250929050565b600080600080600060608688031215612a8957612a8861222d565b5b6000612a9788828901612280565b955050602086013567ffffffffffffffff811115612ab857612ab7612232565b5b612ac4888289016129c1565b9450945050604086013567ffffffffffffffff811115612ae757612ae6612232565b5b612af388828901612a17565b92509250509295509295909350565b600060a083016000830151612b1a6000860182612431565b506020830151612b2d6020860182612431565b506040830151612b406040860182612431565b506060830151612b536060860182612440565b5060808301518482036080860152612b6b82826124c2565b9150508091505092915050565b60006020820190508181036000830152612b928184612b02565b905092915050565b600061016083016000830151612bb36000860182612431565b506020830151612bc66020860182612431565b506040830151612bd96040860182612431565b506060830151612bec6060860182612431565b506080830151612bff6080860182612440565b5060a0830151612c1260a086018261245c565b5060c083015184820360c0860152612c2a82826124c2565b91505060e083015184820360e0860152612c44828261254c565b915050610100830151848203610100860152612c60828261254c565b915050610120830151612c77610120860182612440565b50610140830151848203610140860152612c9182826125c6565b9150508091505092915050565b60006020820190508181036000830152612cb88184612b9a565b905092915050565b612cc981612362565b8114612cd457600080fd5b50565b600081359050612ce681612cc0565b92915050565b60008060408385031215612d0357612d0261222d565b5b6000612d118582860161230d565b9250506020612d2285828601612cd7565b9150509250929050565b600080600060408486031215612d4557612d4461222d565b5b6000612d5386828701612280565b935050602084013567ffffffffffffffff811115612d7457612d73612232565b5b612d8086828701612a17565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060a083016000830151612dd06000860182612431565b506020830151612de36020860182612431565b506040830151612df66040860182612431565b506060830151612e096060860182612440565b5060808301518482036080860152612e2182826124c2565b9150508091505092915050565b6000612e3a8383612db8565b905092915050565b6000602082019050919050565b6000612e5a82612d8c565b612e648185612d97565b935083602082028501612e7685612da8565b8060005b85811015612eb25784840389528151612e938582612e2e565b9450612e9e83612e42565b925060208a01995050600181019050612e7a565b50829750879550505050505092915050565b60006020820190508181036000830152612ede8184612e4f565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920476f7665726e616e636544414f0000000000000000000000000000600082015250565b6000612f2d601283612ee6565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f9d826122c2565b915060008203612fb057612faf612f63565b5b600182039050919050565b7f70726f706f73616c206973206e6f7420636f6d706c6574656400000000000000600082015250565b6000612ff1601983612ee6565b9150612ffc82612fbb565b602082019050919050565b6000602082019050818103600083015261302081612fe4565b9050919050565b7f6e6f207061796d656e7400000000000000000000000000000000000000000000600082015250565b600061305d600a83612ee6565b915061306882613027565b602082019050919050565b6000602082019050818103600083015261308c81613050565b9050919050565b600061309e826122c2565b91506130a9836122c2565b92508282019050808211156130c1576130c0612f63565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613101826122c2565b915061310c836122c2565b92508261311c5761311b6130c7565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613190826122c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131c2576131c1612f63565b5b600182019050919050565b7f736d616c6c207061796d656e7400000000000000000000000000000000000000600082015250565b6000613203600d83612ee6565b915061320e826131cd565b602082019050919050565b60006020820190508181036000830152613232816131f6565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061328b57607f821691505b60208210810361329e5761329d613244565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026133067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132c9565b61331086836132c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061334d613348613343846122c2565b613328565b6122c2565b9050919050565b6000819050919050565b61336783613332565b61337b61337382613354565b8484546132d6565b825550505050565b600090565b613390613383565b61339b81848461335e565b505050565b5b818110156133bf576133b4600082613388565b6001810190506133a1565b5050565b601f821115613404576133d5816132a4565b6133de846132b9565b810160208510156133ed578190505b6134016133f9856132b9565b8301826133a0565b50505b505050565b600082821c905092915050565b600061342760001984600802613409565b1980831691505092915050565b60006134408383613416565b9150826002028217905092915050565b61345a8383613239565b67ffffffffffffffff81111561347357613472613127565b5b61347d8254613273565b6134888282856133c3565b6000601f8311600181146134b757600084156134a5578287013590505b6134af8582613434565b865550613517565b601f1984166134c5866132a4565b60005b828110156134ed578489013582556001820191506020850194506020810190506134c8565b8683101561350a5784890135613506601f891682613416565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f821115613581576135528161352b565b61355b846132b9565b8101602085101561356a578190505b61357e613576856132b9565b8301826133a0565b50505b505050565b6135908383613520565b67ffffffffffffffff8111156135a9576135a8613127565b5b6135b38254613273565b6135be828285613540565b6000601f8311600181146135ed57600084156135db578287013590505b6135e58582613434565b86555061364d565b601f1984166135fb8661352b565b60005b82811015613623578489013582556001820191506020850194506020810190506135fe565b86831015613640578489013561363c601f891682613416565b8355505b6001600288020188555050505b50505050505050565b7f70726f706f73616c20646f6573206e6f74206578697374000000000000000000600082015250565b600061368c601783612ee6565b915061369782613656565b602082019050919050565b600060208201905081810360008301526136bb8161367f565b9050919050565b6000819050919050565b60006136e76136e26136dd846136c2565b613328565b61244f565b9050919050565b6136f7816136cc565b82525050565b600060208201905061371260008301846136ee565b92915050565b7f796f7520617265206e6f742061206d656d626572000000000000000000000000600082015250565b600061374e601483612ee6565b915061375982613718565b602082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f796f75206861766520616c726561647920766f74656400000000000000000000600082015250565b60006137ba601683612ee6565b91506137c582613784565b602082019050919050565b600060208201905081810360008301526137e9816137ad565b9050919050565b6137f98261246b565b67ffffffffffffffff81111561381257613811613127565b5b61381c8254613273565b6138278282856133c3565b600060209050601f83116001811461385a5760008415613848578287015190505b6138528582613434565b8655506138ba565b601f198416613868866132a4565b60005b828110156138905784890151825560018201915060208501945060208101905061386b565b868310156138ad57848901516138a9601f891682613416565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b60006138e76138e26138dd846138c2565b613328565b61244f565b9050919050565b6138f7816138cc565b82525050565b600060208201905061391260008301846138ee565b92915050565b600081905092915050565b600061392e826125aa565b6139388185613918565b9350613948818560208601612487565b80840191505092915050565b60006139608284613923565b915081905092915050565b7f45786563757465206572726f7200000000000000000000000000000000000000600082015250565b60006139a1600d83612ee6565b91506139ac8261396b565b602082019050919050565b600060208201905081810360008301526139d081613994565b905091905056fea2646970667358221220045678531fd6b484b8a83173a8858a36f67c8999213a5a6262db0e6889a9357d64736f6c63430008100033000000000000000000000000ebe894814554c8382ea6a24ccddf1527407a24f6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000055570617574000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x60806040526004361061011f5760003560e01c80636f77926b116100a0578063ce83ad9611610064578063ce83ad96146103ef578063d7a52fa914610418578063eb72d0c814610441578063ef81bf1b1461047e578063fe0d94c1146104a75761011f565b80636f77926b146102f6578063b029091414610333578063be8e4d191461035e578063c7f758a814610389578063c9d27afe146103c65761011f565b8063396e75cc116100e7578063396e75cc1461020957806340912990146102465780634dee3534146102715780635d003332146102af57806364bd0cb2146102da5761011f565b806301081fc31461012457806310a4a2dc1461014d57806323ddd0711461017857806331218954146101a3578063379607f5146101e0575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190612295565b6104d0565b005b34801561015957600080fd5b5061016261077d565b60405161016f91906122db565b60405180910390f35b34801561018457600080fd5b5061018d610783565b60405161019a91906122db565b60405180910390f35b3480156101af57600080fd5b506101ca60048036038101906101c59190612322565b610789565b6040516101d7919061237d565b60405180910390f35b3480156101ec57600080fd5b5061020760048036038101906102029190612398565b6107f1565b005b34801561021557600080fd5b50610230600480360381019061022b91906123c5565b610a63565b60405161023d9190612799565b60405180910390f35b34801561025257600080fd5b5061025b610b42565b60405161026891906122db565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906127bb565b610b48565b6040516102a692919061297b565b60405180910390f35b3480156102bb57600080fd5b506102c4610cec565b6040516102d191906122db565b60405180910390f35b6102f460048036038101906102ef9190612a6d565b610cf2565b005b34801561030257600080fd5b5061031d60048036038101906103189190612295565b610fcd565b60405161032a9190612b78565b60405180910390f35b34801561033f57600080fd5b5061034861112c565b60405161035591906122db565b60405180910390f35b34801561036a57600080fd5b50610373611132565b60405161038091906122db565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612398565b611138565b6040516103bd9190612c9e565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612cec565b611497565b005b3480156103fb57600080fd5b5061041660048036038101906104119190612d2c565b6119c4565b005b34801561042457600080fd5b5061043f600480360381019061043a9190612398565b611c65565b005b34801561044d57600080fd5b50610468600480360381019061046391906123c5565b611cf9565b6040516104759190612ec4565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a091906123c5565b611de2565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190612398565b611e62565b005b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461053e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053590612f43565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156107795760025481146106995760066000600254815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b60066000600254815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556004820160006107609190612102565b505060026000815461077190612f92565b919050819055505b5050565b60035481565b60015481565b60006009600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60016008600083815260200190815260200160002060040160149054906101000a900460ff1660ff161161085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190613007565b60405180910390fd5b6009600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90613073565b60405180910390fd5b60006009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600860008381526020019081526020016000206007018054905060086000848152602001908152602001600020600601805490506109a09190613093565b905060008160086000858152602001908152602001600020600201546109c691906130f6565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a0e573d6000803e3d6000fd5b50823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf783604051610a5691906122db565b60405180910390a3505050565b60606000831480610a75575060005483115b610a7f5782610a83565b6000545b925060008267ffffffffffffffff811115610aa157610aa0613127565b5b604051908082528060200260200182016040528015610ada57816020015b610ac7612142565b815260200190600190039081610abf5790505b50905060005b83811015610b37576000850315610b3757610b068580610aff90612f92565b9650611138565b828281518110610b1957610b18613156565b5b60200260200101819052508080610b2f90613185565b915050610ae0565b508091505092915050565b60025481565b6060806000841480610b5b575060005484115b610b655783610b69565b6000545b935060008367ffffffffffffffff811115610b8757610b86613127565b5b604051908082528060200260200182016040528015610bb55781602001602082028036833780820191505090505b50905060008467ffffffffffffffff811115610bd457610bd3613127565b5b604051908082528060200260200182016040528015610c025781602001602082028036833780820191505090505b50905060005b85811015610cdb576000870315610cdb5786838281518110610c2d57610c2c613156565b5b6020026020010181815250506009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16828281518110610caa57610ca9613156565b5b60200260200101901515908115158152505086610cc690612f92565b96508080610cd390613185565b915050610c08565b508181935093505050935093915050565b60045481565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610d8757600454341015610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613219565b60405180910390fd5b610dcd565b600554341015610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390613219565b60405180910390fd5b5b6000808154610ddb90613185565b91905081905550600054600860008054815260200190815260200160002060000181905550426008600080548152602001908152602001600020600101819055503460086000805481526020019081526020016000206002018190555060035442610e469190613093565b60086000805481526020019081526020016000206003018190555033600860008054815260200190815260200160002060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860008054815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550818160086000805481526020019081526020016000206005019182610f0e929190613450565b5084600860008054815260200190815260200160002060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838360086000805481526020019081526020016000206009019182610f8b929190613586565b506000547f6638d63c6abdbf0a059e322e8c8b9401488d94b95731a935ca9f76cde49fa48334604051610fbe91906122db565b60405180910390a25050505050565b610fd56121cb565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820180546110a390613273565b80601f01602080910402602001604051908101604052809291908181526020018280546110cf90613273565b801561111c5780601f106110f15761010080835404028352916020019161111c565b820191906000526020600020905b8154815290600101906020018083116110ff57829003601f168201915b5050505050815250509050919050565b60055481565b60005481565b611140612142565b6008600083815260200190815260200160002060405180610160016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160149054906101000a900460ff1660ff1660ff16815260200160058201805461120a90613273565b80601f016020809104026020016040519081016040528092919081815260200182805461123690613273565b80156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561131157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112c7575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561139f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611355575b505050505081526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160098201805461140e90613273565b80601f016020809104026020016040519081016040528092919081815260200182805461143a90613273565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050505050815250509050919050565b60006008600084815260200190815260200160002060010154116114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906136a2565b60405180910390fd5b60016008600084815260200190815260200160002060040160149054906101000a900460ff1660ff16116119c05760086000838152602001908152602001600020600301544211156115c05760026008600084815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461157b90613185565b91905081905550817f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e860026040516115b391906136fd565b60405180910390a26119c0565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811161164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613764565b60405180910390fd5b6009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906137d0565b60405180910390fd5b60016009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008154809291906117a490613185565b9190505550823373ffffffffffffffffffffffffffffffffffffffff167f8d85a70fd2c5d140a4a01143492d27ff82cfad4cead313e66c53f39b0feb5e0f846040516117f0919061237d565b60405180910390a3811561187a5760086000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118f2565b60086000848152602001908152602001600020600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600860008581526020019081526020016000206007018054905060086000868152602001908152602001600020600601805490506119329190613093565b905060025481106119bd5760026008600086815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461197c90613185565b91905081905550837f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e860026040516119b491906136fd565b60405180910390a25b50505b5050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990612f43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160315611c60576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611c5f57600260008154611ac090613185565b919050819055508260066000600254815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a0016040528060025481526020016000815260200160015481526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019081611c5a91906137f0565b509050505b5b505050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca90612f43565b60405180910390fd5b6203f4808110158015611ce95750621275008111155b15611cf657806003819055505b50565b606060008267ffffffffffffffff811115611d1757611d16613127565b5b604051908082528060200260200182016040528015611d5057816020015b611d3d6121cb565b815260200190600190039081611d355790505b50905060005b83811015611dd757611da6600660008780611d7090613185565b9850815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610fcd565b828281518110611db957611db8613156565b5b60200260200101819052508080611dcf90613185565b915050611d56565b508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4790612f43565b60405180910390fd5b81600481905550806005819055505050565b60026008600083815260200190815260200160002060040160149054906101000a900460ff1660ff1614611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec290613007565b60405180910390fd5b60036008600083815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550600860008281526020019081526020016000206007018054905060086000838152602001908152602001600020600601805490501115612014576120136008600083815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860008481526020019081526020016000206009018054611f9090613273565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbc90613273565b80156120095780601f10611fde57610100808354040283529160200191612009565b820191906000526020600020905b815481529060010190602001808311611fec57829003601f168201915b5050505050612050565b5b807f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e8600360405161204591906138fd565b60405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516120779190613954565b6000604051808303816000865af19150503d80600081146120b4576040519150601f19603f3d011682016040523d82523d6000602084013e6120b9565b606091505b50509050806120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f4906139b7565b60405180910390fd5b505050565b50805461210e90613273565b6000825580601f10612120575061213f565b601f01602090049060005260206000209081019061213e9190612210565b5b50565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5b80821115612229576000816000905550600101612211565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061226282612237565b9050919050565b61227281612257565b811461227d57600080fd5b50565b60008135905061228f81612269565b92915050565b6000602082840312156122ab576122aa61222d565b5b60006122b984828501612280565b91505092915050565b6000819050919050565b6122d5816122c2565b82525050565b60006020820190506122f060008301846122cc565b92915050565b6122ff816122c2565b811461230a57600080fd5b50565b60008135905061231c816122f6565b92915050565b600080604083850312156123395761233861222d565b5b60006123478582860161230d565b925050602061235885828601612280565b9150509250929050565b60008115159050919050565b61237781612362565b82525050565b6000602082019050612392600083018461236e565b92915050565b6000602082840312156123ae576123ad61222d565b5b60006123bc8482850161230d565b91505092915050565b600080604083850312156123dc576123db61222d565b5b60006123ea8582860161230d565b92505060206123fb8582860161230d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61243a816122c2565b82525050565b61244981612257565b82525050565b600060ff82169050919050565b6124658161244f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124a557808201518184015260208101905061248a565b60008484015250505050565b6000601f19601f8301169050919050565b60006124cd8261246b565b6124d78185612476565b93506124e7818560208601612487565b6124f0816124b1565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006125338383612440565b60208301905092915050565b6000602082019050919050565b6000612557826124fb565b6125618185612506565b935061256c83612517565b8060005b8381101561259d5781516125848882612527565b975061258f8361253f565b925050600181019050612570565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b60006125d1826125aa565b6125db81856125b5565b93506125eb818560208601612487565b6125f4816124b1565b840191505092915050565b6000610160830160008301516126186000860182612431565b50602083015161262b6020860182612431565b50604083015161263e6040860182612431565b5060608301516126516060860182612431565b5060808301516126646080860182612440565b5060a083015161267760a086018261245c565b5060c083015184820360c086015261268f82826124c2565b91505060e083015184820360e08601526126a9828261254c565b9150506101008301518482036101008601526126c5828261254c565b9150506101208301516126dc610120860182612440565b506101408301518482036101408601526126f682826125c6565b9150508091505092915050565b600061270f83836125ff565b905092915050565b6000602082019050919050565b600061272f82612405565b6127398185612410565b93508360208202850161274b85612421565b8060005b8581101561278757848403895281516127688582612703565b945061277383612717565b925060208a0199505060018101905061274f565b50829750879550505050505092915050565b600060208201905081810360008301526127b38184612724565b905092915050565b6000806000606084860312156127d4576127d361222d565b5b60006127e286828701612280565b93505060206127f38682870161230d565b92505060406128048682870161230d565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006128468383612431565b60208301905092915050565b6000602082019050919050565b600061286a8261280e565b6128748185612819565b935061287f8361282a565b8060005b838110156128b0578151612897888261283a565b97506128a283612852565b925050600181019050612883565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128f281612362565b82525050565b600061290483836128e9565b60208301905092915050565b6000602082019050919050565b6000612928826128bd565b61293281856128c8565b935061293d836128d9565b8060005b8381101561296e57815161295588826128f8565b975061296083612910565b925050600181019050612941565b5085935050505092915050565b60006040820190508181036000830152612995818561285f565b905081810360208301526129a9818461291d565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126129d7576129d66129b2565b5b8235905067ffffffffffffffff8111156129f4576129f36129b7565b5b602083019150836001820283011115612a1057612a0f6129bc565b5b9250929050565b60008083601f840112612a2d57612a2c6129b2565b5b8235905067ffffffffffffffff811115612a4a57612a496129b7565b5b602083019150836001820283011115612a6657612a656129bc565b5b9250929050565b600080600080600060608688031215612a8957612a8861222d565b5b6000612a9788828901612280565b955050602086013567ffffffffffffffff811115612ab857612ab7612232565b5b612ac4888289016129c1565b9450945050604086013567ffffffffffffffff811115612ae757612ae6612232565b5b612af388828901612a17565b92509250509295509295909350565b600060a083016000830151612b1a6000860182612431565b506020830151612b2d6020860182612431565b506040830151612b406040860182612431565b506060830151612b536060860182612440565b5060808301518482036080860152612b6b82826124c2565b9150508091505092915050565b60006020820190508181036000830152612b928184612b02565b905092915050565b600061016083016000830151612bb36000860182612431565b506020830151612bc66020860182612431565b506040830151612bd96040860182612431565b506060830151612bec6060860182612431565b506080830151612bff6080860182612440565b5060a0830151612c1260a086018261245c565b5060c083015184820360c0860152612c2a82826124c2565b91505060e083015184820360e0860152612c44828261254c565b915050610100830151848203610100860152612c60828261254c565b915050610120830151612c77610120860182612440565b50610140830151848203610140860152612c9182826125c6565b9150508091505092915050565b60006020820190508181036000830152612cb88184612b9a565b905092915050565b612cc981612362565b8114612cd457600080fd5b50565b600081359050612ce681612cc0565b92915050565b60008060408385031215612d0357612d0261222d565b5b6000612d118582860161230d565b9250506020612d2285828601612cd7565b9150509250929050565b600080600060408486031215612d4557612d4461222d565b5b6000612d5386828701612280565b935050602084013567ffffffffffffffff811115612d7457612d73612232565b5b612d8086828701612a17565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060a083016000830151612dd06000860182612431565b506020830151612de36020860182612431565b506040830151612df66040860182612431565b506060830151612e096060860182612440565b5060808301518482036080860152612e2182826124c2565b9150508091505092915050565b6000612e3a8383612db8565b905092915050565b6000602082019050919050565b6000612e5a82612d8c565b612e648185612d97565b935083602082028501612e7685612da8565b8060005b85811015612eb25784840389528151612e938582612e2e565b9450612e9e83612e42565b925060208a01995050600181019050612e7a565b50829750879550505050505092915050565b60006020820190508181036000830152612ede8184612e4f565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920476f7665726e616e636544414f0000000000000000000000000000600082015250565b6000612f2d601283612ee6565b9150612f3882612ef7565b602082019050919050565b60006020820190508181036000830152612f5c81612f20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f9d826122c2565b915060008203612fb057612faf612f63565b5b600182039050919050565b7f70726f706f73616c206973206e6f7420636f6d706c6574656400000000000000600082015250565b6000612ff1601983612ee6565b9150612ffc82612fbb565b602082019050919050565b6000602082019050818103600083015261302081612fe4565b9050919050565b7f6e6f207061796d656e7400000000000000000000000000000000000000000000600082015250565b600061305d600a83612ee6565b915061306882613027565b602082019050919050565b6000602082019050818103600083015261308c81613050565b9050919050565b600061309e826122c2565b91506130a9836122c2565b92508282019050808211156130c1576130c0612f63565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613101826122c2565b915061310c836122c2565b92508261311c5761311b6130c7565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613190826122c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131c2576131c1612f63565b5b600182019050919050565b7f736d616c6c207061796d656e7400000000000000000000000000000000000000600082015250565b6000613203600d83612ee6565b915061320e826131cd565b602082019050919050565b60006020820190508181036000830152613232816131f6565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061328b57607f821691505b60208210810361329e5761329d613244565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026133067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132c9565b61331086836132c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061334d613348613343846122c2565b613328565b6122c2565b9050919050565b6000819050919050565b61336783613332565b61337b61337382613354565b8484546132d6565b825550505050565b600090565b613390613383565b61339b81848461335e565b505050565b5b818110156133bf576133b4600082613388565b6001810190506133a1565b5050565b601f821115613404576133d5816132a4565b6133de846132b9565b810160208510156133ed578190505b6134016133f9856132b9565b8301826133a0565b50505b505050565b600082821c905092915050565b600061342760001984600802613409565b1980831691505092915050565b60006134408383613416565b9150826002028217905092915050565b61345a8383613239565b67ffffffffffffffff81111561347357613472613127565b5b61347d8254613273565b6134888282856133c3565b6000601f8311600181146134b757600084156134a5578287013590505b6134af8582613434565b865550613517565b601f1984166134c5866132a4565b60005b828110156134ed578489013582556001820191506020850194506020810190506134c8565b8683101561350a5784890135613506601f891682613416565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f821115613581576135528161352b565b61355b846132b9565b8101602085101561356a578190505b61357e613576856132b9565b8301826133a0565b50505b505050565b6135908383613520565b67ffffffffffffffff8111156135a9576135a8613127565b5b6135b38254613273565b6135be828285613540565b6000601f8311600181146135ed57600084156135db578287013590505b6135e58582613434565b86555061364d565b601f1984166135fb8661352b565b60005b82811015613623578489013582556001820191506020850194506020810190506135fe565b86831015613640578489013561363c601f891682613416565b8355505b6001600288020188555050505b50505050505050565b7f70726f706f73616c20646f6573206e6f74206578697374000000000000000000600082015250565b600061368c601783612ee6565b915061369782613656565b602082019050919050565b600060208201905081810360008301526136bb8161367f565b9050919050565b6000819050919050565b60006136e76136e26136dd846136c2565b613328565b61244f565b9050919050565b6136f7816136cc565b82525050565b600060208201905061371260008301846136ee565b92915050565b7f796f7520617265206e6f742061206d656d626572000000000000000000000000600082015250565b600061374e601483612ee6565b915061375982613718565b602082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f796f75206861766520616c726561647920766f74656400000000000000000000600082015250565b60006137ba601683612ee6565b91506137c582613784565b602082019050919050565b600060208201905081810360008301526137e9816137ad565b9050919050565b6137f98261246b565b67ffffffffffffffff81111561381257613811613127565b5b61381c8254613273565b6138278282856133c3565b600060209050601f83116001811461385a5760008415613848578287015190505b6138528582613434565b8655506138ba565b601f198416613868866132a4565b60005b828110156138905784890151825560018201915060208501945060208101905061386b565b868310156138ad57848901516138a9601f891682613416565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b60006138e76138e26138dd846138c2565b613328565b61244f565b9050919050565b6138f7816138cc565b82525050565b600060208201905061391260008301846138ee565b92915050565b600081905092915050565b600061392e826125aa565b6139388185613918565b9350613948818560208601612487565b80840191505092915050565b60006139608284613923565b915081905092915050565b7f45786563757465206572726f7200000000000000000000000000000000000000600082015250565b60006139a1600d83612ee6565b91506139ac8261396b565b602082019050919050565b600060208201905081810360008301526139d081613994565b905091905056fea2646970667358221220045678531fd6b484b8a83173a8858a36f67c8999213a5a6262db0e6889a9357d64736f6c63430008100033