Commit 285f6717 authored by pengjun's avatar pengjun Committed by vipwzw

pokerbull add time log

parent 9b5c0ca6
...@@ -16,6 +16,7 @@ import ( ...@@ -16,6 +16,7 @@ import (
"github.com/33cn/chain33/system/dapp" "github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types" pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
"time"
) )
// Action 斗牛action结构 // Action 斗牛action结构
...@@ -484,7 +485,7 @@ func (action *Action) newGame(gameID string, start *pkt.PBGameStart) (*pkt.Poker ...@@ -484,7 +485,7 @@ func (action *Action) newGame(gameID string, start *pkt.PBGameStart) (*pkt.Poker
game = &pkt.PokerBull{ game = &pkt.PokerBull{
GameId: gameID, GameId: gameID,
Status: pkt.PBGameActionStart, Status: pkt.PBGameActionStart,
StartTime: action.blocktime, StartTime: time.Unix(action.blocktime, 0).Format("2006-01-02 15:04:05"),
StartTxHash: gameID, StartTxHash: gameID,
Value: start.GetValue(), Value: start.GetValue(),
Poker: NewPoker(), Poker: NewPoker(),
...@@ -497,7 +498,7 @@ func (action *Action) newGame(gameID string, start *pkt.PBGameStart) (*pkt.Poker ...@@ -497,7 +498,7 @@ func (action *Action) newGame(gameID string, start *pkt.PBGameStart) (*pkt.Poker
} }
Shuffle(game.Poker, action.blocktime) //洗牌 Shuffle(game.Poker, action.blocktime) //洗牌
logger.Debug(fmt.Sprintf("Start a new game %s for player %s", game.GameId, action.fromaddr)) logger.Info(fmt.Sprintf("Create a new game %s for player %s", game.GameId, action.fromaddr))
return game, nil return game, nil
} }
...@@ -560,7 +561,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error) ...@@ -560,7 +561,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
logger.Debug(fmt.Sprintf("Pokerbull game start for %s", action.fromaddr)) logger.Info(fmt.Sprintf("Pokerbull game match for %s", action.fromaddr))
if start.PlayerNum > pkt.MaxPlayerNum { if start.PlayerNum > pkt.MaxPlayerNum {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr,
"err", fmt.Sprintf("The maximum player number is %d", pkt.MaxPlayerNum)) "err", fmt.Sprintf("The maximum player number is %d", pkt.MaxPlayerNum))
...@@ -599,7 +600,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error) ...@@ -599,7 +600,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
return nil, err return nil, err
} }
} }
logger.Debug(fmt.Sprintf("Match a new game %s for player %s", game.GameId, action.fromaddr)) logger.Info(fmt.Sprintf("Match a new game %s for player %s", game.GameId, action.fromaddr))
} }
//发牌随机数取txhash //发牌随机数取txhash
...@@ -613,11 +614,12 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error) ...@@ -613,11 +614,12 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
Address: action.fromaddr, Address: action.fromaddr,
TxHash: txrng, TxHash: txrng,
Ready: false, Ready: false,
MatchTime:time.Unix(action.blocktime, 0).Format("2006-01-02 15:04:05"),
}) })
// 如果人数达标,则发牌计算斗牛结果 // 如果人数达标,则发牌计算斗牛结果
if len(game.Players) == int(game.PlayerNum) { if len(game.Players) == int(game.PlayerNum) {
logger.Debug(fmt.Sprintf("Game start: %s", game.GameId)) logger.Info(fmt.Sprintf("Game starting: %s round: %d", game.GameId, game.Round))
logsH, kvH, err := action.settleAccount(action.fromaddr, game) logsH, kvH, err := action.settleAccount(action.fromaddr, game)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -631,7 +633,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error) ...@@ -631,7 +633,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
game.PreStatus = pkt.PBGameActionStart game.PreStatus = pkt.PBGameActionStart
game.IsWaiting = false game.IsWaiting = false
} else { } else {
logger.Debug(fmt.Sprintf("Game waiting: %s", game.GameId)) logger.Info(fmt.Sprintf("Game waiting: %s round: %d", game.GameId, game.Round))
receipt, err := action.coinsAccount.ExecFrozen(action.fromaddr, action.execaddr, start.GetValue()*PokerbullLeverageMax) //冻结子账户资金, 最后一位玩家不需要冻结 receipt, err := action.coinsAccount.ExecFrozen(action.fromaddr, action.execaddr, start.GetValue()*PokerbullLeverageMax) //冻结子账户资金, 最后一位玩家不需要冻结
if err != nil { if err != nil {
logger.Error("GameCreate.ExecFrozen", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", start.GetValue(), "err", err.Error()) logger.Error("GameCreate.ExecFrozen", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", start.GetValue(), "err", err.Error())
...@@ -683,7 +685,7 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei ...@@ -683,7 +685,7 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei
pbcontinue.GetGameId()) pbcontinue.GetGameId())
return nil, err return nil, err
} }
logger.Debug(fmt.Sprintf("Pokerbull game %s continue for %s", game.GameId, action.fromaddr)) logger.Info(fmt.Sprintf("Continue pokerbull game %s from %s", game.GameId, action.fromaddr))
// 检查余额,庄家检查闲家数量倍数的资金 // 检查余额,庄家检查闲家数量倍数的资金
checkValue := game.GetValue() * PokerbullLeverageMax checkValue := game.GetValue() * PokerbullLeverageMax
...@@ -716,9 +718,10 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei ...@@ -716,9 +718,10 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei
} }
pbplayer.TxHash = txrng pbplayer.TxHash = txrng
pbplayer.Ready = true pbplayer.Ready = true
pbplayer.MatchTime = time.Unix(action.blocktime, 0).Format("2006-01-02 15:04:05")
if getReadyPlayerNum(game.Players) == int(game.PlayerNum) { if getReadyPlayerNum(game.Players) == int(game.PlayerNum) {
logger.Debug(fmt.Sprintf("Game start: %s", game.GameId)) logger.Info(fmt.Sprintf("Game starting: %s round: %d", game.GameId, game.Round))
logsH, kvH, err := action.settleAccount(action.fromaddr, game) logsH, kvH, err := action.settleAccount(action.fromaddr, game)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -730,7 +733,7 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei ...@@ -730,7 +733,7 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei
game.IsWaiting = false game.IsWaiting = false
game.PreStatus = pkt.PBGameActionContinue game.PreStatus = pkt.PBGameActionContinue
} else { } else {
logger.Debug(fmt.Sprintf("Game waiting: %s", game.GameId)) logger.Info(fmt.Sprintf("Game waiting: %s round: %d", game.GameId))
// 回合数加一次 // 回合数加一次
if !game.IsWaiting { if !game.IsWaiting {
game.Round++ game.Round++
...@@ -799,7 +802,7 @@ func (action *Action) GameQuit(pbend *pkt.PBGameQuit) (*types.Receipt, error) { ...@@ -799,7 +802,7 @@ func (action *Action) GameQuit(pbend *pkt.PBGameQuit) (*types.Receipt, error) {
game.Status = pkt.PBGameActionQuit game.Status = pkt.PBGameActionQuit
game.PrevIndex = game.Index game.PrevIndex = game.Index
game.Index = action.getIndex(game) game.Index = action.getIndex(game)
game.QuitTime = action.blocktime game.QuitTime = time.Unix(action.blocktime, 0).Format("2006-01-02 15:04:05")
game.QuitTxHash = common.ToHex(action.txhash) game.QuitTxHash = common.ToHex(action.txhash)
receiptLog := action.GetReceiptLog(game) receiptLog := action.GetReceiptLog(game)
......
...@@ -6,7 +6,7 @@ package types; ...@@ -6,7 +6,7 @@ package types;
message PokerBull { message PokerBull {
string gameId = 1; //默认是由创建这局游戏的txHash作为gameId string gameId = 1; //默认是由创建这局游戏的txHash作为gameId
int32 status = 2; // Start 1 -> Continue 2 -> Quit 3 int32 status = 2; // Start 1 -> Continue 2 -> Quit 3
int64 startTime = 3; //开始时间 string startTime = 3; //开始时间
string startTxHash = 4; //游戏启动交易hash string startTxHash = 4; //游戏启动交易hash
int64 value = 5; //赌注 int64 value = 5; //赌注
PBPoker poker = 6; //扑克牌 PBPoker poker = 6; //扑克牌
...@@ -15,7 +15,7 @@ message PokerBull { ...@@ -15,7 +15,7 @@ message PokerBull {
repeated PBResult results = 9; //游戏结果集 repeated PBResult results = 9; //游戏结果集
int64 index = 10; //索引 int64 index = 10; //索引
int64 prevIndex = 11; //上级索引 int64 prevIndex = 11; //上级索引
int64 quitTime = 12; //游戏结束时间 string quitTime = 12; //游戏结束时间
string quitTxHash = 13; //游戏结束交易hash string quitTxHash = 13; //游戏结束交易hash
string dealerAddr = 14; //下局庄家地址 string dealerAddr = 14; //下局庄家地址
bool isWaiting = 15; //游戏是否处于等待状态 bool isWaiting = 15; //游戏是否处于等待状态
...@@ -25,19 +25,21 @@ message PokerBull { ...@@ -25,19 +25,21 @@ message PokerBull {
//一把牌 //一把牌
message PBHand { message PBHand {
repeated int32 cards = 1; //一把牌,五张 repeated int32 cards = 1; //一把牌,五张
int32 result = 2; //斗牛结果 (没牛:0, 牛1-9:1-9, 牛牛:10) int32 result = 2; //斗牛结果 (没牛:0, 牛1-9:1-9, 牛牛:10)
string address = 3; //玩家地址 string address = 3; //玩家地址
bool isWin = 4; //是否赢庄家 bool isWin = 4; //是否赢庄家
int32 leverage = 5; //赌注倍数 int32 leverage = 5; //赌注倍数
string roundTime = 6; //本回合开始时间
} }
//玩家 //玩家
message PBPlayer { message PBPlayer {
repeated PBHand hands = 1; //历史发牌和斗牛结果 repeated PBHand hands = 1; //历史发牌和斗牛结果
string address = 2; //玩家地址 string address = 2; //玩家地址
int64 txHash = 3; //发牌随机数因子txhash的整数格式 int64 txHash = 3; //发牌随机数因子txhash的整数格式
bool ready = 4; // continue状态下,是否ready bool ready = 4; //continue状态下,是否ready
string matchTime = 5; //玩家匹配时间
} }
//本局游戏结果 //本局游戏结果
......
...@@ -5,9 +5,8 @@ package types ...@@ -5,9 +5,8 @@ package types
import ( import (
fmt "fmt" fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
math "math"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
...@@ -25,7 +24,7 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package ...@@ -25,7 +24,7 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type PokerBull struct { type PokerBull struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"` GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"` Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
StartTime int64 `protobuf:"varint,3,opt,name=startTime,proto3" json:"startTime,omitempty"` StartTime string `protobuf:"bytes,3,opt,name=startTime,proto3" json:"startTime,omitempty"`
StartTxHash string `protobuf:"bytes,4,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"` StartTxHash string `protobuf:"bytes,4,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"`
Value int64 `protobuf:"varint,5,opt,name=value,proto3" json:"value,omitempty"` Value int64 `protobuf:"varint,5,opt,name=value,proto3" json:"value,omitempty"`
Poker *PBPoker `protobuf:"bytes,6,opt,name=poker,proto3" json:"poker,omitempty"` Poker *PBPoker `protobuf:"bytes,6,opt,name=poker,proto3" json:"poker,omitempty"`
...@@ -34,7 +33,7 @@ type PokerBull struct { ...@@ -34,7 +33,7 @@ type PokerBull struct {
Results []*PBResult `protobuf:"bytes,9,rep,name=results,proto3" json:"results,omitempty"` Results []*PBResult `protobuf:"bytes,9,rep,name=results,proto3" json:"results,omitempty"`
Index int64 `protobuf:"varint,10,opt,name=index,proto3" json:"index,omitempty"` Index int64 `protobuf:"varint,10,opt,name=index,proto3" json:"index,omitempty"`
PrevIndex int64 `protobuf:"varint,11,opt,name=prevIndex,proto3" json:"prevIndex,omitempty"` PrevIndex int64 `protobuf:"varint,11,opt,name=prevIndex,proto3" json:"prevIndex,omitempty"`
QuitTime int64 `protobuf:"varint,12,opt,name=quitTime,proto3" json:"quitTime,omitempty"` QuitTime string `protobuf:"bytes,12,opt,name=quitTime,proto3" json:"quitTime,omitempty"`
QuitTxHash string `protobuf:"bytes,13,opt,name=quitTxHash,proto3" json:"quitTxHash,omitempty"` QuitTxHash string `protobuf:"bytes,13,opt,name=quitTxHash,proto3" json:"quitTxHash,omitempty"`
DealerAddr string `protobuf:"bytes,14,opt,name=dealerAddr,proto3" json:"dealerAddr,omitempty"` DealerAddr string `protobuf:"bytes,14,opt,name=dealerAddr,proto3" json:"dealerAddr,omitempty"`
IsWaiting bool `protobuf:"varint,15,opt,name=isWaiting,proto3" json:"isWaiting,omitempty"` IsWaiting bool `protobuf:"varint,15,opt,name=isWaiting,proto3" json:"isWaiting,omitempty"`
...@@ -84,11 +83,11 @@ func (m *PokerBull) GetStatus() int32 { ...@@ -84,11 +83,11 @@ func (m *PokerBull) GetStatus() int32 {
return 0 return 0
} }
func (m *PokerBull) GetStartTime() int64 { func (m *PokerBull) GetStartTime() string {
if m != nil { if m != nil {
return m.StartTime return m.StartTime
} }
return 0 return ""
} }
func (m *PokerBull) GetStartTxHash() string { func (m *PokerBull) GetStartTxHash() string {
...@@ -147,11 +146,11 @@ func (m *PokerBull) GetPrevIndex() int64 { ...@@ -147,11 +146,11 @@ func (m *PokerBull) GetPrevIndex() int64 {
return 0 return 0
} }
func (m *PokerBull) GetQuitTime() int64 { func (m *PokerBull) GetQuitTime() string {
if m != nil { if m != nil {
return m.QuitTime return m.QuitTime
} }
return 0 return ""
} }
func (m *PokerBull) GetQuitTxHash() string { func (m *PokerBull) GetQuitTxHash() string {
...@@ -196,6 +195,7 @@ type PBHand struct { ...@@ -196,6 +195,7 @@ type PBHand struct {
Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
IsWin bool `protobuf:"varint,4,opt,name=isWin,proto3" json:"isWin,omitempty"` IsWin bool `protobuf:"varint,4,opt,name=isWin,proto3" json:"isWin,omitempty"`
Leverage int32 `protobuf:"varint,5,opt,name=leverage,proto3" json:"leverage,omitempty"` Leverage int32 `protobuf:"varint,5,opt,name=leverage,proto3" json:"leverage,omitempty"`
RoundTime string `protobuf:"bytes,6,opt,name=roundTime,proto3" json:"roundTime,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -261,12 +261,20 @@ func (m *PBHand) GetLeverage() int32 { ...@@ -261,12 +261,20 @@ func (m *PBHand) GetLeverage() int32 {
return 0 return 0
} }
func (m *PBHand) GetRoundTime() string {
if m != nil {
return m.RoundTime
}
return ""
}
//玩家 //玩家
type PBPlayer struct { type PBPlayer struct {
Hands []*PBHand `protobuf:"bytes,1,rep,name=hands,proto3" json:"hands,omitempty"` Hands []*PBHand `protobuf:"bytes,1,rep,name=hands,proto3" json:"hands,omitempty"`
Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
TxHash int64 `protobuf:"varint,3,opt,name=txHash,proto3" json:"txHash,omitempty"` TxHash int64 `protobuf:"varint,3,opt,name=txHash,proto3" json:"txHash,omitempty"`
Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"`
MatchTime string `protobuf:"bytes,5,opt,name=matchTime,proto3" json:"matchTime,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -325,6 +333,13 @@ func (m *PBPlayer) GetReady() bool { ...@@ -325,6 +333,13 @@ func (m *PBPlayer) GetReady() bool {
return false return false
} }
func (m *PBPlayer) GetMatchTime() string {
if m != nil {
return m.MatchTime
}
return ""
}
//本局游戏结果 //本局游戏结果
type PBResult struct { type PBResult struct {
Hands []*PBHand `protobuf:"bytes,1,rep,name=hands,proto3" json:"hands,omitempty"` Hands []*PBHand `protobuf:"bytes,1,rep,name=hands,proto3" json:"hands,omitempty"`
...@@ -1734,69 +1749,71 @@ func init() { ...@@ -1734,69 +1749,71 @@ func init() {
func init() { proto.RegisterFile("pokerbull.proto", fileDescriptor_8d22e4ee2313e311) } func init() { proto.RegisterFile("pokerbull.proto", fileDescriptor_8d22e4ee2313e311) }
var fileDescriptor_8d22e4ee2313e311 = []byte{ var fileDescriptor_8d22e4ee2313e311 = []byte{
// 1021 bytes of a gzipped FileDescriptorProto // 1045 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4b, 0x6f, 0x23, 0x45, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44,
0x10, 0xde, 0xb1, 0x3d, 0x7e, 0xd4, 0x6c, 0xec, 0xa4, 0x81, 0xa8, 0x85, 0x10, 0xb2, 0x66, 0xc3, 0x10, 0x3f, 0xc7, 0xb1, 0x93, 0x8c, 0xaf, 0x4d, 0xbb, 0x40, 0xb5, 0x42, 0x08, 0x45, 0xbe, 0x72,
0xae, 0x41, 0x90, 0x83, 0x23, 0x81, 0x56, 0x48, 0x48, 0x36, 0x07, 0x1c, 0x69, 0x85, 0x9c, 0xce, 0x17, 0x10, 0xf4, 0x21, 0x95, 0x40, 0x27, 0x24, 0xa4, 0x84, 0x07, 0x52, 0xe9, 0x84, 0xd2, 0xed,
0x4a, 0x7b, 0x9e, 0xf5, 0xf4, 0x66, 0x47, 0x3b, 0x19, 0x3b, 0xf3, 0xc8, 0xc6, 0x57, 0xee, 0xfc, 0x49, 0xf7, 0xec, 0x8b, 0xf7, 0x5a, 0xeb, 0x1c, 0x27, 0xf5, 0x9f, 0x72, 0xf9, 0x10, 0x3c, 0xf2,
0x0a, 0x0e, 0xfc, 0x2a, 0x6e, 0xfc, 0x10, 0xd4, 0x55, 0xdd, 0x33, 0x3d, 0x13, 0x9b, 0x10, 0x6e, 0x8e, 0xc4, 0x03, 0x9f, 0x8a, 0x37, 0x3e, 0x08, 0xda, 0x99, 0xb5, 0xbd, 0x76, 0x13, 0x4a, 0x79,
0x5d, 0x8f, 0xae, 0xae, 0x57, 0x7f, 0x55, 0x30, 0xda, 0xac, 0x3f, 0xc8, 0xf4, 0x6d, 0x11, 0xc7, 0xdb, 0xf9, 0xb3, 0xb3, 0xbf, 0x99, 0x9d, 0xfd, 0xcd, 0xc2, 0x70, 0xb3, 0x7e, 0x2f, 0xd3, 0xb7,
0xa7, 0x9b, 0x74, 0x9d, 0xaf, 0x99, 0x9b, 0x6f, 0x37, 0x32, 0xf3, 0x7f, 0xef, 0xc0, 0x60, 0xa9, 0x45, 0x1c, 0x9f, 0x6d, 0xd2, 0x75, 0xbe, 0x66, 0x4e, 0xbe, 0xdd, 0xc8, 0xcc, 0xff, 0xb5, 0x0b,
0x44, 0xf3, 0x22, 0x8e, 0xd9, 0x31, 0x74, 0xaf, 0x82, 0x6b, 0x79, 0x1e, 0x72, 0x67, 0xec, 0x4c, 0x83, 0x85, 0x32, 0xcd, 0x8a, 0x38, 0x66, 0x27, 0xe0, 0x5e, 0x07, 0x2b, 0x79, 0x11, 0x72, 0x6b,
0x06, 0x42, 0x53, 0x8a, 0x9f, 0xe5, 0x41, 0x5e, 0x64, 0xbc, 0x35, 0x76, 0x26, 0xae, 0xd0, 0x14, 0x64, 0x8d, 0x07, 0x42, 0x4b, 0x4a, 0x9f, 0xe5, 0x41, 0x5e, 0x64, 0xbc, 0x33, 0xb2, 0xc6, 0x8e,
0xfb, 0x02, 0x06, 0x59, 0x1e, 0xa4, 0xf9, 0xeb, 0xe8, 0x5a, 0xf2, 0xf6, 0xd8, 0x99, 0xb4, 0x45, 0xd0, 0x12, 0xfb, 0x0c, 0x06, 0x59, 0x1e, 0xa4, 0xf9, 0xeb, 0x68, 0x25, 0xb9, 0x8d, 0x5b, 0x6a,
0xc5, 0x60, 0x63, 0xf0, 0x88, 0xb8, 0x5b, 0x04, 0xd9, 0x7b, 0xde, 0x41, 0x93, 0x36, 0x8b, 0x7d, 0x05, 0x1b, 0x81, 0x47, 0xc2, 0x87, 0x79, 0x90, 0xdd, 0xf0, 0x2e, 0xda, 0x4d, 0x15, 0xfb, 0x18,
0x0a, 0xee, 0x6d, 0x10, 0x17, 0x92, 0xbb, 0x78, 0x97, 0x08, 0x76, 0x02, 0x2e, 0x7a, 0xcb, 0xbb, 0x9c, 0xbb, 0x20, 0x2e, 0x24, 0x77, 0x46, 0xd6, 0xd8, 0x16, 0x24, 0xb0, 0x53, 0x70, 0x10, 0x2d,
0x63, 0x67, 0xe2, 0x4d, 0x87, 0xa7, 0xe8, 0xea, 0xe9, 0x72, 0x8e, 0x8e, 0x0a, 0x12, 0xb2, 0xaf, 0x77, 0x47, 0xd6, 0xd8, 0x9b, 0x1c, 0x9e, 0x21, 0xd4, 0xb3, 0xc5, 0x0c, 0x81, 0x0a, 0x32, 0xb2,
0xa1, 0xb7, 0x89, 0x83, 0xad, 0x4c, 0x33, 0xde, 0x1b, 0xb7, 0x27, 0xde, 0x74, 0x54, 0xe9, 0x21, 0x2f, 0xa1, 0xb7, 0x89, 0x83, 0xad, 0x4c, 0x33, 0xde, 0x1b, 0xd9, 0x63, 0x6f, 0x32, 0xac, 0xfd,
0x5f, 0x18, 0xb9, 0x72, 0x93, 0x8e, 0xbf, 0x16, 0xd7, 0xbc, 0x8f, 0x11, 0x54, 0x0c, 0x65, 0x28, 0x50, 0x2f, 0x4a, 0xbb, 0x82, 0x49, 0xcb, 0x9f, 0x8b, 0x15, 0xef, 0x63, 0x06, 0xb5, 0x42, 0x05,
0x95, 0x59, 0x11, 0xe7, 0x19, 0x1f, 0x34, 0x0c, 0x09, 0xe4, 0x0b, 0x23, 0x57, 0xfe, 0x46, 0x49, 0x4a, 0x65, 0x56, 0xc4, 0x79, 0xc6, 0x07, 0xad, 0x40, 0x02, 0xf5, 0xa2, 0xb4, 0x2b, 0xbc, 0x51,
0x28, 0xef, 0x38, 0x90, 0xbf, 0x48, 0xa0, 0xf9, 0x54, 0xde, 0x9e, 0xa3, 0xc4, 0xa3, 0x2c, 0x94, 0x12, 0xca, 0x0f, 0x1c, 0x08, 0x2f, 0x0a, 0x18, 0x3e, 0x95, 0x77, 0x17, 0x68, 0xf1, 0xd0, 0x52,
0x0c, 0xf6, 0x39, 0xf4, 0x6f, 0x8a, 0x88, 0x52, 0xf4, 0x14, 0x85, 0x25, 0xcd, 0xbe, 0x04, 0xc0, 0x2b, 0xd8, 0xa7, 0xd0, 0xbf, 0x2d, 0x22, 0x2a, 0xd1, 0x53, 0x2c, 0x41, 0x25, 0xb3, 0xcf, 0x01,
0x33, 0x25, 0xe8, 0x00, 0x13, 0x64, 0x71, 0x94, 0x3c, 0x94, 0x41, 0x2c, 0xd3, 0x59, 0x18, 0xa6, 0x70, 0x4d, 0x05, 0x3a, 0x40, 0xab, 0xa1, 0x51, 0xf6, 0x50, 0x06, 0xb1, 0x4c, 0xa7, 0x61, 0x98,
0x7c, 0x48, 0xf2, 0x8a, 0xa3, 0x5e, 0x8e, 0xb2, 0x37, 0x41, 0x94, 0x47, 0xc9, 0x15, 0x1f, 0x8d, 0xf2, 0x43, 0xb2, 0xd7, 0x1a, 0x75, 0x72, 0x94, 0xbd, 0x09, 0xa2, 0x3c, 0x4a, 0xae, 0xf9, 0x70,
0x9d, 0x49, 0x5f, 0x54, 0x0c, 0xed, 0xd7, 0x25, 0x15, 0xee, 0x50, 0x87, 0x6d, 0x18, 0x2a, 0x96, 0x64, 0x8d, 0xfb, 0xa2, 0x56, 0x68, 0x5c, 0x57, 0x74, 0x71, 0x47, 0x3a, 0xed, 0x52, 0xa1, 0x72,
0x74, 0x5d, 0x24, 0x21, 0x3f, 0x42, 0x09, 0x11, 0xfe, 0x6f, 0x0e, 0x74, 0x97, 0xf3, 0x45, 0x90, 0x49, 0xd7, 0x45, 0x12, 0xf2, 0x63, 0xb4, 0x90, 0xe0, 0xff, 0x6e, 0x81, 0xbb, 0x98, 0xcd, 0x83,
0x84, 0x4a, 0x61, 0x15, 0xa4, 0x61, 0xc6, 0x9d, 0x71, 0x5b, 0x29, 0x20, 0xa1, 0x5a, 0x81, 0xb2, 0x24, 0x54, 0x0e, 0xcb, 0x20, 0x0d, 0x33, 0x6e, 0x8d, 0x6c, 0xe5, 0x80, 0x82, 0x6a, 0x05, 0xaa,
0x61, 0x5a, 0x81, 0x28, 0xc6, 0xa1, 0x17, 0x84, 0x61, 0x2a, 0xb3, 0x0c, 0x1b, 0x61, 0x20, 0x0c, 0x46, 0xd9, 0x0a, 0x24, 0x31, 0x0e, 0xbd, 0x20, 0x0c, 0x53, 0x99, 0x65, 0xba, 0x11, 0x4a, 0x11,
0x89, 0x49, 0xcb, 0xde, 0x44, 0x09, 0x36, 0x40, 0x5f, 0x10, 0xa1, 0xd2, 0x12, 0xcb, 0x5b, 0x99, 0x8b, 0x96, 0xbd, 0x89, 0x12, 0x6c, 0x80, 0xbe, 0x20, 0x41, 0x95, 0x25, 0x96, 0x77, 0x32, 0x0d,
0x06, 0x57, 0x54, 0x7d, 0x57, 0x94, 0xb4, 0xff, 0x11, 0xfa, 0xa6, 0x88, 0xec, 0x19, 0xb8, 0xef, 0xae, 0xe9, 0xf6, 0x1d, 0x51, 0xc9, 0x0a, 0x38, 0xa2, 0xc1, 0x9a, 0xb9, 0xd4, 0x56, 0x95, 0xc2,
0x83, 0x44, 0x7b, 0xe1, 0x4d, 0x0f, 0xca, 0xda, 0x28, 0x1f, 0x05, 0xc9, 0xec, 0xc7, 0x5b, 0xf5, 0xff, 0xcd, 0x82, 0x7e, 0x79, 0xc7, 0xec, 0x19, 0x38, 0x37, 0x41, 0xa2, 0x41, 0x7a, 0x93, 0x83,
0xc7, 0x8f, 0xa1, 0x9b, 0x53, 0x76, 0xa9, 0x3d, 0x35, 0x85, 0xd1, 0xcb, 0x20, 0xdc, 0x1a, 0xa7, 0xea, 0xea, 0x54, 0x0a, 0x82, 0x6c, 0x26, 0xb6, 0x4e, 0x13, 0xdb, 0x09, 0xb8, 0x39, 0x15, 0xdf,
0x90, 0xf0, 0xff, 0x70, 0xd4, 0xcb, 0x54, 0xf5, 0xff, 0xf6, 0xf2, 0x31, 0x74, 0x3f, 0x46, 0x49, 0xc6, 0x7b, 0xd3, 0x12, 0x16, 0x47, 0x06, 0xe1, 0xb6, 0xc4, 0x8c, 0x82, 0xc2, 0xb5, 0x0a, 0xf2,
0x22, 0x53, 0xfd, 0xb0, 0xa6, 0x6a, 0xe1, 0xb5, 0xeb, 0xe1, 0xa9, 0x3b, 0x54, 0x43, 0xfd, 0x25, 0xe5, 0x0d, 0xe2, 0x72, 0x08, 0x57, 0xa5, 0xf0, 0xff, 0x40, 0x5c, 0xd4, 0x32, 0xff, 0x0d, 0xd7,
0x34, 0xc5, 0x9e, 0xc3, 0x90, 0x4e, 0xaf, 0xea, 0x89, 0x69, 0x70, 0xfd, 0x97, 0xd0, 0xd3, 0x7f, 0x09, 0xb8, 0xbf, 0x44, 0x49, 0x22, 0x53, 0x0d, 0x4b, 0x4b, 0x8d, 0xda, 0xd8, 0xad, 0xda, 0x9c,
0x61, 0x4f, 0x8d, 0x38, 0xf4, 0x36, 0xeb, 0x28, 0xc9, 0xb5, 0x57, 0xae, 0x30, 0xa4, 0xff, 0x97, 0x80, 0x4b, 0x0d, 0xa0, 0xdf, 0x93, 0x96, 0xd8, 0x73, 0x38, 0xa4, 0xd5, 0xab, 0x66, 0x55, 0x5b,
0x03, 0x4f, 0x97, 0xf3, 0x5f, 0x82, 0x6b, 0x39, 0x5b, 0xe5, 0xd1, 0x3a, 0x61, 0xdf, 0x80, 0x8b, 0x5a, 0xff, 0x25, 0xf4, 0xf4, 0x43, 0xda, 0x73, 0xc1, 0x1c, 0x7a, 0x9b, 0x75, 0x94, 0xe4, 0x1a,
0x1f, 0x12, 0x3f, 0xbc, 0x37, 0x65, 0x65, 0x90, 0x4a, 0xe7, 0x52, 0x49, 0x16, 0x4f, 0x04, 0xa9, 0x95, 0x23, 0x4a, 0xd1, 0xff, 0xcb, 0x82, 0xa7, 0x8b, 0xd9, 0x4f, 0xc1, 0x4a, 0x4e, 0x97, 0x79,
0xb0, 0x33, 0xe8, 0xaf, 0xd6, 0x49, 0x1e, 0x25, 0x85, 0x44, 0xbb, 0xde, 0xf4, 0xb3, 0x9a, 0xfa, 0xb4, 0x4e, 0xd8, 0x57, 0xe0, 0xe0, 0x6b, 0x46, 0xb6, 0xf0, 0x26, 0xac, 0x4a, 0x52, 0xf9, 0x5c,
0xcf, 0x5a, 0xb8, 0x78, 0x22, 0x4a, 0x45, 0xf6, 0x02, 0x3a, 0xaa, 0xa1, 0x31, 0x09, 0xde, 0xf4, 0x29, 0xcb, 0xfc, 0x89, 0x20, 0x17, 0x76, 0x0e, 0xfd, 0xe5, 0x3a, 0xc9, 0xa3, 0xa4, 0x90, 0x18,
0xa8, 0x76, 0xe1, 0xa2, 0x88, 0x94, 0x79, 0x54, 0x50, 0x9e, 0xdc, 0x14, 0x32, 0xa5, 0x8a, 0x34, 0xd7, 0x9b, 0x7c, 0xd2, 0x70, 0xff, 0x51, 0x1b, 0xe7, 0x4f, 0x44, 0xe5, 0xc8, 0x5e, 0x40, 0x57,
0x3d, 0xb9, 0x50, 0x12, 0xe5, 0x09, 0xaa, 0xb0, 0x21, 0xb4, 0xf2, 0x2d, 0x7e, 0x42, 0x57, 0xb4, 0xbd, 0x06, 0x2c, 0x82, 0x37, 0x39, 0x6e, 0x6c, 0xb8, 0x2c, 0x22, 0x15, 0x1e, 0x1d, 0x14, 0x92,
0xf2, 0xed, 0xbc, 0xa7, 0x71, 0xc4, 0x9f, 0x81, 0x67, 0xb9, 0x5e, 0xe1, 0x8b, 0x63, 0xe3, 0x4b, 0xdb, 0x42, 0xa6, 0x74, 0x5f, 0x6d, 0x24, 0x97, 0xca, 0xa2, 0x90, 0xa0, 0x0b, 0x3b, 0x84, 0x4e,
0x0d, 0x0e, 0x5a, 0x0d, 0x38, 0xf0, 0x27, 0x30, 0xac, 0x87, 0xb3, 0x0f, 0x15, 0xfd, 0x13, 0x80, 0xbe, 0xc5, 0x17, 0xec, 0x88, 0x4e, 0xbe, 0x9d, 0xf5, 0x34, 0x09, 0xf9, 0x53, 0xf0, 0x0c, 0xe8,
0x2a, 0x8e, 0xbd, 0x5a, 0x5f, 0x19, 0x97, 0x30, 0x86, 0xbd, 0x6a, 0x37, 0xf0, 0x0c, 0x15, 0x48, 0x35, 0x39, 0x59, 0x26, 0x39, 0x35, 0xb8, 0xa4, 0xd3, 0xe2, 0x12, 0x7f, 0x0c, 0x87, 0xcd, 0x74,
0xf7, 0x55, 0x94, 0xe5, 0xf3, 0x2d, 0xfd, 0xd4, 0x59, 0x12, 0x2e, 0x4b, 0xb0, 0xaa, 0x90, 0xd8, 0xf6, 0x51, 0xaa, 0x7f, 0x0a, 0x50, 0xe7, 0xb1, 0xd7, 0xeb, 0x8b, 0x12, 0x12, 0xe6, 0xb0, 0xd7,
0x69, 0x22, 0xf1, 0xfe, 0x98, 0x2a, 0xdc, 0x6a, 0x5b, 0xb8, 0xe5, 0xbf, 0x36, 0xbd, 0x20, 0xe4, 0xed, 0x16, 0x9e, 0xa1, 0x03, 0xf9, 0xbe, 0x8a, 0xb2, 0x7c, 0xb6, 0xa5, 0x67, 0x3e, 0x4d, 0xc2,
0x6a, 0x9d, 0x86, 0x8f, 0x46, 0xff, 0xdd, 0x56, 0x67, 0x70, 0x44, 0x56, 0x11, 0xfe, 0x1e, 0x30, 0x45, 0xc5, 0x74, 0x35, 0x8d, 0x5b, 0x6d, 0x1a, 0xdf, 0x9f, 0x53, 0x4d, 0x7a, 0xb6, 0x41, 0x7a,
0x5d, 0x9a, 0x68, 0xd9, 0x26, 0x7e, 0x82, 0x03, 0xdb, 0xb1, 0x8c, 0x7d, 0xa7, 0x20, 0x1a, 0x8f, 0xfe, 0xeb, 0xb2, 0x17, 0x84, 0x5c, 0xae, 0xd3, 0xf0, 0xd1, 0xa3, 0x63, 0x77, 0xd4, 0x29, 0x1c,
0xfa, 0x33, 0x7e, 0x52, 0xeb, 0x0e, 0x52, 0x13, 0x46, 0xc7, 0x5f, 0x00, 0xbb, 0xe7, 0x42, 0xc6, 0x53, 0x54, 0xe4, 0xce, 0x07, 0x42, 0x57, 0x21, 0x3a, 0x66, 0x88, 0x1f, 0xe0, 0xc0, 0x04, 0x96,
0xa6, 0x4d, 0x23, 0xbc, 0x66, 0xc4, 0xd2, 0xad, 0x2c, 0x7d, 0x80, 0x91, 0x55, 0x95, 0xf3, 0xe4, 0xb1, 0x6f, 0x14, 0xbf, 0xe3, 0x52, 0x3f, 0xc6, 0x8f, 0x1a, 0xdd, 0x41, 0x6e, 0xa2, 0xf4, 0xf1,
0xdd, 0x7a, 0x6f, 0x28, 0x0c, 0x3a, 0x0a, 0x74, 0x34, 0x0e, 0xe0, 0xd9, 0xca, 0x5c, 0x7b, 0x77, 0xe7, 0xc0, 0xee, 0x41, 0xc8, 0xd8, 0xa4, 0x1d, 0x84, 0x37, 0x82, 0x18, 0xbe, 0x75, 0xa4, 0xf7,
0xe6, 0x3a, 0x76, 0xd8, 0x67, 0xe0, 0x09, 0xb9, 0x89, 0xf5, 0x63, 0xec, 0x04, 0x3a, 0xca, 0xb4, 0x30, 0x34, 0x6e, 0xe5, 0x22, 0x79, 0xb7, 0xde, 0x9b, 0x0a, 0x83, 0xae, 0xa2, 0x24, 0xcd, 0x03,
0xfe, 0x99, 0x87, 0xc6, 0x59, 0x33, 0xac, 0x05, 0x4a, 0xfd, 0x6f, 0xe1, 0xb0, 0xe1, 0x21, 0xfe, 0xb8, 0x36, 0x2a, 0x67, 0xef, 0xae, 0x5c, 0xd7, 0x4c, 0xfb, 0x1c, 0x3c, 0x21, 0x37, 0xb1, 0x3e,
0x7f, 0x72, 0x8a, 0x22, 0x1d, 0x08, 0x43, 0xfa, 0x2f, 0x61, 0x64, 0x3d, 0xa1, 0xba, 0x8c, 0x3d, 0x8c, 0x9d, 0x42, 0x57, 0x85, 0xd6, 0x2f, 0xf3, 0xa8, 0x04, 0x5b, 0x4e, 0x7a, 0x81, 0x56, 0xff,
0x07, 0x57, 0x49, 0x4d, 0x52, 0xee, 0xbf, 0x43, 0x62, 0x7f, 0x0e, 0xcc, 0x7a, 0x68, 0xbe, 0x15, 0x6b, 0x38, 0x6a, 0x21, 0xc4, 0xf7, 0x4f, 0xa0, 0x28, 0xd3, 0x81, 0x28, 0x45, 0xff, 0x25, 0x0c,
0x6a, 0x5e, 0xfc, 0x5b, 0x61, 0x69, 0xba, 0xb4, 0xec, 0xe9, 0xf2, 0xb7, 0x03, 0xcc, 0x7a, 0xff, 0x8d, 0x23, 0x54, 0x97, 0xb1, 0xe7, 0xe0, 0x28, 0x6b, 0x59, 0x94, 0xfb, 0xe7, 0x90, 0xd9, 0x9f,
0x21, 0x23, 0xfb, 0x1a, 0xef, 0x45, 0x39, 0x83, 0x08, 0x55, 0xee, 0x0d, 0x6c, 0x33, 0x94, 0x6a, 0x01, 0x33, 0x0e, 0x9a, 0x6d, 0x85, 0x62, 0xf3, 0x7f, 0xbb, 0x58, 0x1a, 0x4d, 0x1d, 0x73, 0x34,
0xf3, 0xb1, 0xd3, 0x9c, 0x8f, 0xbb, 0xb7, 0x0f, 0x6b, 0xaf, 0xe8, 0x3e, 0xb0, 0x57, 0xe0, 0x2c, 0xfd, 0x6d, 0x01, 0x33, 0xce, 0x7f, 0x28, 0xc8, 0xbe, 0xc6, 0x7b, 0x51, 0x0d, 0x30, 0x62, 0x95,
0xcc, 0x8b, 0x34, 0xe1, 0x3d, 0x1a, 0x2e, 0x44, 0xf9, 0x7f, 0xb6, 0xe0, 0x40, 0xc8, 0x95, 0x8c, 0x7b, 0xd3, 0xbe, 0x9c, 0x68, 0x8d, 0xe1, 0xda, 0x6d, 0x0f, 0xd7, 0xdd, 0x5f, 0x17, 0xe3, 0x53,
0x36, 0xb9, 0xae, 0xe5, 0x63, 0x23, 0x34, 0xcd, 0xd4, 0xb6, 0x9a, 0x69, 0x67, 0xd3, 0xd4, 0x97, 0xe2, 0x3e, 0xf0, 0x29, 0xc1, 0x41, 0x9a, 0x17, 0x69, 0xc2, 0x7b, 0x34, 0x7a, 0x48, 0xf2, 0xff,
0x0f, 0xb7, 0xb9, 0x7c, 0xd4, 0x60, 0xa1, 0xbb, 0x03, 0x16, 0x28, 0x01, 0xbd, 0x06, 0x3c, 0x56, 0xec, 0xc0, 0x81, 0x90, 0x4b, 0x19, 0x6d, 0x72, 0x7d, 0x97, 0x8f, 0xcd, 0xb0, 0x6c, 0x26, 0xdb,
0x49, 0xeb, 0x37, 0x93, 0xc6, 0xab, 0xf4, 0x0c, 0xa8, 0xb7, 0xec, 0x2d, 0xab, 0x5c, 0x37, 0x60, 0x68, 0xa6, 0x9d, 0x4d, 0xd3, 0xfc, 0xb9, 0x38, 0xed, 0x9f, 0x4b, 0x83, 0x16, 0xdc, 0x1d, 0xb4,
0xef, 0xba, 0xe1, 0xd9, 0x0d, 0x81, 0x10, 0x74, 0x49, 0x1b, 0xa1, 0x90, 0x37, 0xff, 0x07, 0xb0, 0x40, 0x05, 0xe8, 0xb5, 0xe8, 0xb1, 0x2e, 0x5a, 0xbf, 0x5d, 0x34, 0x5e, 0x97, 0x67, 0x40, 0xbd,
0xd9, 0x21, 0xb4, 0xdf, 0x49, 0xb3, 0x7e, 0xaa, 0xa3, 0xff, 0x23, 0x8c, 0x96, 0x73, 0x03, 0xdf, 0x65, 0x7e, 0xd1, 0xaa, 0xbf, 0x0a, 0xec, 0xfd, 0xab, 0x78, 0x66, 0x43, 0x20, 0x05, 0x5d, 0xd1,
0x64, 0x78, 0x5f, 0x01, 0xf4, 0xe5, 0x56, 0x75, 0xf9, 0x07, 0x85, 0xd7, 0x17, 0xb8, 0x83, 0x3d, 0x77, 0x52, 0xc8, 0xdb, 0xff, 0x43, 0xd8, 0xec, 0x08, 0xec, 0x77, 0x52, 0x6a, 0x12, 0x52, 0x4b,
0xee, 0xe2, 0xf7, 0x6a, 0x1c, 0xe0, 0x17, 0x79, 0xd4, 0xbd, 0xb7, 0x5d, 0x5c, 0xc8, 0xcf, 0xfe, 0xff, 0x7b, 0x18, 0x2e, 0x66, 0x25, 0x7d, 0x53, 0xe0, 0x7d, 0x17, 0xa0, 0x37, 0x77, 0xea, 0xcd,
0x09, 0x00, 0x00, 0xff, 0xff, 0xda, 0x14, 0x34, 0x44, 0xa3, 0x0b, 0x00, 0x00, 0xdf, 0x29, 0xbe, 0xbe, 0xc4, 0x0f, 0xdc, 0xe3, 0x36, 0x7e, 0xab, 0xc6, 0x01, 0x3e, 0x91, 0x47,
0xed, 0x7b, 0xeb, 0xe2, 0x6f, 0xfe, 0xfc, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x08, 0xea,
0x50, 0xe0, 0x0b, 0x00, 0x00,
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment