Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
1e3095ef
Commit
1e3095ef
authored
Jul 25, 2019
by
liuyuhang
Committed by
33cn
Aug 14, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add comment test and rpc test
parent
2138931a
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
567 additions
and
92 deletions
+567
-92
exec.go
plugin/dapp/autonomy/executor/exec.go
+3
-2
exec_del_local.go
plugin/dapp/autonomy/executor/exec_del_local.go
+3
-2
exec_local.go
plugin/dapp/autonomy/executor/exec_local.go
+3
-2
rule.go
plugin/dapp/autonomy/executor/rule.go
+8
-3
rule_test.go
plugin/dapp/autonomy/executor/rule_test.go
+160
-2
ruleaction.go
plugin/dapp/autonomy/executor/ruleaction.go
+2
-2
ruleaction_test.go
plugin/dapp/autonomy/executor/ruleaction_test.go
+94
-0
rule.proto
plugin/dapp/autonomy/proto/rule.proto
+2
-0
board_jrpc_channel_test.go
plugin/dapp/autonomy/rpc/board_jrpc_channel_test.go
+61
-0
jrpc_channel_test.go
plugin/dapp/autonomy/rpc/jrpc_channel_test.go
+20
-36
project_jrpc_channel_test.go
plugin/dapp/autonomy/rpc/project_jrpc_channel_test.go
+68
-0
rule_jrpc_channel_test.go
plugin/dapp/autonomy/rpc/rule_jrpc_channel_test.go
+83
-0
rule.pb.go
plugin/dapp/autonomy/types/rule.pb.go
+60
-43
No files found.
plugin/dapp/autonomy/executor/exec.go
View file @
1e3095ef
...
@@ -97,7 +97,7 @@ func (a *Autonomy) Exec_Transfer(payload *auty.TransferFund, tx *types.Transacti
...
@@ -97,7 +97,7 @@ func (a *Autonomy) Exec_Transfer(payload *auty.TransferFund, tx *types.Transacti
}
}
// Exec_Comment 评论提案
// Exec_Comment 评论提案
func
(
a
*
Autonomy
)
Exec_Comment
(
payload
*
auty
.
Comment
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
Autonomy
)
Exec_Comment
Prop
(
payload
*
auty
.
Comment
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
action
:=
newAction
(
a
,
tx
,
int32
(
index
))
action
:=
newAction
(
a
,
tx
,
int32
(
index
))
return
action
.
comment
(
payload
)
return
action
.
comment
Prop
(
payload
)
}
}
\ No newline at end of file
plugin/dapp/autonomy/executor/exec_del_local.go
View file @
1e3095ef
...
@@ -78,6 +78,6 @@ func (a *Autonomy) ExecDelLocal_TmintPropRule(payload *auty.TerminateProposalRul
...
@@ -78,6 +78,6 @@ func (a *Autonomy) ExecDelLocal_TmintPropRule(payload *auty.TerminateProposalRul
}
}
// ExecDelLocal_TmintPropRule 终止提案规则
// ExecDelLocal_TmintPropRule 终止提案规则
func
(
a
*
Autonomy
)
ExecDelLocal_Comment
(
payload
*
auty
.
Comment
,
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
,
index
int
)
(
*
types
.
LocalDBSet
,
error
)
{
func
(
a
*
Autonomy
)
ExecDelLocal_Comment
Prop
(
payload
*
auty
.
Comment
,
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
,
index
int
)
(
*
types
.
LocalDBSet
,
error
)
{
return
a
.
execDelLocalComment
(
receiptData
)
return
a
.
execDelLocalComment
Prop
(
receiptData
)
}
}
\ No newline at end of file
plugin/dapp/autonomy/executor/exec_local.go
View file @
1e3095ef
...
@@ -78,6 +78,6 @@ func (a *Autonomy) ExecLocal_TmintPropRule(payload *auty.TerminateProposalRule,
...
@@ -78,6 +78,6 @@ func (a *Autonomy) ExecLocal_TmintPropRule(payload *auty.TerminateProposalRule,
}
}
// ExecLocal_Comment 评论提案
// ExecLocal_Comment 评论提案
func
(
a
*
Autonomy
)
ExecLocal_Comment
(
payload
*
auty
.
Comment
,
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
,
index
int
)
(
*
types
.
LocalDBSet
,
error
)
{
func
(
a
*
Autonomy
)
ExecLocal_Comment
Prop
(
payload
*
auty
.
Comment
,
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
,
index
int
)
(
*
types
.
LocalDBSet
,
error
)
{
return
a
.
execLocalComment
(
receiptData
)
return
a
.
execLocalComment
Prop
(
receiptData
)
}
}
\ No newline at end of file
plugin/dapp/autonomy/executor/rule.go
View file @
1e3095ef
...
@@ -147,7 +147,7 @@ func (a *Autonomy) listProposalRule(req *auty.ReqQueryProposalRule) (types.Messa
...
@@ -147,7 +147,7 @@ func (a *Autonomy) listProposalRule(req *auty.ReqQueryProposalRule) (types.Messa
return
&
rep
,
nil
return
&
rep
,
nil
}
}
func
(
a
*
Autonomy
)
execLocalComment
(
receiptData
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
func
(
a
*
Autonomy
)
execLocalComment
Prop
(
receiptData
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
dbSet
:=
&
types
.
LocalDBSet
{}
dbSet
:=
&
types
.
LocalDBSet
{}
var
set
[]
*
types
.
KeyValue
var
set
[]
*
types
.
KeyValue
for
_
,
log
:=
range
receiptData
.
Logs
{
for
_
,
log
:=
range
receiptData
.
Logs
{
...
@@ -173,12 +173,17 @@ func (a *Autonomy) execLocalComment(receiptData *types.ReceiptData) (*types.Loca
...
@@ -173,12 +173,17 @@ func (a *Autonomy) execLocalComment(receiptData *types.ReceiptData) (*types.Loca
func
saveCommentHeightIndex
(
res
*
auty
.
ReceiptProposalComment
)
(
kvs
[]
*
types
.
KeyValue
)
{
func
saveCommentHeightIndex
(
res
*
auty
.
ReceiptProposalComment
)
(
kvs
[]
*
types
.
KeyValue
)
{
kv
:=
&
types
.
KeyValue
{}
kv
:=
&
types
.
KeyValue
{}
kv
.
Key
=
calcCommentHeight
(
res
.
Cmt
.
ProposalID
,
dapp
.
HeightIndexStr
(
res
.
Height
,
int64
(
res
.
Index
)))
kv
.
Key
=
calcCommentHeight
(
res
.
Cmt
.
ProposalID
,
dapp
.
HeightIndexStr
(
res
.
Height
,
int64
(
res
.
Index
)))
kv
.
Value
=
types
.
Encode
(
&
auty
.
RelationCmt
{
RepCmtHash
:
res
.
Cmt
.
RepCmtHash
,
Comment
:
res
.
Cmt
.
Comment
})
kv
.
Value
=
types
.
Encode
(
&
auty
.
RelationCmt
{
RepCmtHash
:
res
.
Cmt
.
RepCmtHash
,
Comment
:
res
.
Cmt
.
Comment
,
Height
:
res
.
Height
,
Index
:
res
.
Index
,
})
kvs
=
append
(
kvs
,
kv
)
kvs
=
append
(
kvs
,
kv
)
return
kvs
return
kvs
}
}
func
(
a
*
Autonomy
)
execDelLocalComment
(
receiptData
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
func
(
a
*
Autonomy
)
execDelLocalComment
Prop
(
receiptData
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
dbSet
:=
&
types
.
LocalDBSet
{}
dbSet
:=
&
types
.
LocalDBSet
{}
var
set
[]
*
types
.
KeyValue
var
set
[]
*
types
.
KeyValue
for
_
,
log
:=
range
receiptData
.
Logs
{
for
_
,
log
:=
range
receiptData
.
Logs
{
...
...
plugin/dapp/autonomy/executor/rule_test.go
View file @
1e3095ef
...
@@ -259,4 +259,163 @@ func TestListProposalRule(t *testing.T) {
...
@@ -259,4 +259,163 @@ func TestListProposalRule(t *testing.T) {
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalRule
)
.
PropRules
[
0
]
.
Index
,
int32
(
testcase2
[
1
]
.
index
))
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalRule
)
.
PropRules
[
0
]
.
Index
,
int32
(
testcase2
[
1
]
.
index
))
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalRule
)
.
PropRules
[
1
]
.
Height
,
testcase2
[
0
]
.
height
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalRule
)
.
PropRules
[
1
]
.
Height
,
testcase2
[
0
]
.
height
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalRule
)
.
PropRules
[
1
]
.
Index
,
int32
(
testcase2
[
0
]
.
index
))
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalRule
)
.
PropRules
[
1
]
.
Index
,
int32
(
testcase2
[
0
]
.
index
))
}
}
\ No newline at end of file
func
TestExecLocalCommentProp
(
t
*
testing
.
T
)
{
au
:=
&
Autonomy
{}
propID
:=
"11111111111111"
Repcmt
:=
"2222222222"
comment
:=
"3333333333"
receiptCmt
:=
&
auty
.
ReceiptProposalComment
{
Cmt
:
&
auty
.
Comment
{
ProposalID
:
propID
,
RepCmtHash
:
Repcmt
,
Comment
:
comment
,
},
Height
:
11
,
Index
:
1
,
}
receipt
:=
&
types
.
ReceiptData
{
Logs
:
[]
*
types
.
ReceiptLog
{
{
Ty
:
auty
.
TyLogCommentProp
,
Log
:
types
.
Encode
(
receiptCmt
)},
},
}
set
,
err
:=
au
.
execLocalCommentProp
(
receipt
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
set
)
require
.
Equal
(
t
,
set
.
KV
[
0
]
.
Key
,
calcCommentHeight
(
propID
,
dapp
.
HeightIndexStr
(
receiptCmt
.
Height
,
int64
(
receiptCmt
.
Index
))))
require
.
NotNil
(
t
,
set
.
KV
[
0
]
.
Value
)
}
func
TestExecDelLocalCommentProp
(
t
*
testing
.
T
)
{
au
:=
&
Autonomy
{}
propID
:=
"11111111111111"
Repcmt
:=
"2222222222"
comment
:=
"3333333333"
receiptCmt
:=
&
auty
.
ReceiptProposalComment
{
Cmt
:
&
auty
.
Comment
{
ProposalID
:
propID
,
RepCmtHash
:
Repcmt
,
Comment
:
comment
,
},
Height
:
11
,
Index
:
1
,
}
receipt
:=
&
types
.
ReceiptData
{
Logs
:
[]
*
types
.
ReceiptLog
{
{
Ty
:
auty
.
TyLogCommentProp
,
Log
:
types
.
Encode
(
receiptCmt
)},
},
}
set
,
err
:=
au
.
execDelLocalCommentProp
(
receipt
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
set
)
require
.
Equal
(
t
,
set
.
KV
[
0
]
.
Key
,
calcCommentHeight
(
propID
,
dapp
.
HeightIndexStr
(
receiptCmt
.
Height
,
int64
(
receiptCmt
.
Index
))))
require
.
Nil
(
t
,
set
.
KV
[
0
]
.
Value
)
}
func
TestListProposalComment
(
t
*
testing
.
T
)
{
au
:=
&
Autonomy
{
dapp
.
DriverBase
{},
}
_
,
_
,
kvdb
:=
util
.
CreateTestDB
()
au
.
SetLocalDB
(
kvdb
)
type
statu
struct
{
propId
string
height
int64
index
int64
}
propID
:=
"3333333333"
propID1
:=
"2222222"
propID2
:=
"111111111111"
testcase1
:=
[]
statu
{
{
propID
,
10
,
2
},
{
propID1
,
15
,
1
},
{
propID
,
20
,
1
},
}
testcase2
:=
[]
statu
{
{
propID2
,
10
,
1
},
{
propID2
,
20
,
2
},
{
propID2
,
20
,
5
},
}
var
testcase
[]
statu
testcase
=
append
(
testcase
,
testcase1
...
)
testcase
=
append
(
testcase
,
testcase2
...
)
cur
:=
&
auty
.
RelationCmt
{
RepCmtHash
:
"aaaaaa"
,
Comment
:
"bbbbbbbbbb"
,
}
for
_
,
tcase
:=
range
testcase
{
key
:=
calcCommentHeight
(
tcase
.
propId
,
dapp
.
HeightIndexStr
(
tcase
.
height
,
int64
(
tcase
.
index
)))
cur
.
Height
=
tcase
.
height
cur
.
Index
=
int32
(
tcase
.
index
)
value
:=
types
.
Encode
(
cur
)
kvdb
.
Set
(
key
,
value
)
}
// 反向查找
req
:=
&
auty
.
ReqQueryProposalComment
{
ProposalID
:
propID2
,
Count
:
10
,
Direction
:
0
,
Index
:
-
1
,
}
rsp
,
err
:=
au
.
listProposalComment
(
req
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
len
(
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
),
len
(
testcase2
))
k
:=
2
for
_
,
tcase
:=
range
testcase2
{
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
k
]
.
Height
,
tcase
.
height
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
k
]
.
Index
,
int32
(
tcase
.
index
))
k
--
}
// 正向查找
req
=
&
auty
.
ReqQueryProposalComment
{
ProposalID
:
propID2
,
Count
:
10
,
Direction
:
1
,
Index
:
-
1
,
}
rsp
,
err
=
au
.
listProposalComment
(
req
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
len
(
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
),
len
(
testcase2
))
for
i
,
tcase
:=
range
testcase2
{
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
i
]
.
Height
,
tcase
.
height
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
i
]
.
Index
,
int32
(
tcase
.
index
))
}
// 翻页查找
req
=
&
auty
.
ReqQueryProposalComment
{
ProposalID
:
propID2
,
Count
:
1
,
Direction
:
0
,
Index
:
-
1
,
}
rsp
,
err
=
au
.
listProposalComment
(
req
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
len
(
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
),
1
)
height
:=
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
0
]
.
Height
index
:=
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
0
]
.
Index
require
.
Equal
(
t
,
height
,
testcase2
[
2
]
.
height
)
require
.
Equal
(
t
,
index
,
int32
(
testcase2
[
2
]
.
index
))
//
Index
:=
height
*
types
.
MaxTxsPerBlock
+
int64
(
index
)
req
=
&
auty
.
ReqQueryProposalComment
{
ProposalID
:
propID2
,
Count
:
10
,
Direction
:
0
,
Index
:
Index
,
}
rsp
,
err
=
au
.
listProposalComment
(
req
)
require
.
Equal
(
t
,
len
(
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
),
2
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
0
]
.
Height
,
testcase2
[
1
]
.
height
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
0
]
.
Index
,
int32
(
testcase2
[
1
]
.
index
))
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
1
]
.
Height
,
testcase2
[
0
]
.
height
)
require
.
Equal
(
t
,
rsp
.
(
*
auty
.
ReplyQueryProposalComment
)
.
RltCmt
[
1
]
.
Index
,
int32
(
testcase2
[
0
]
.
index
))
}
plugin/dapp/autonomy/executor/ruleaction.go
View file @
1e3095ef
...
@@ -325,10 +325,10 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) {
...
@@ -325,10 +325,10 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) {
return
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
},
nil
return
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
},
nil
}
}
func
(
a
*
action
)
comment
(
cm
*
auty
.
Comment
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
comment
Prop
(
cm
*
auty
.
Comment
)
(
*
types
.
Receipt
,
error
)
{
if
cm
.
Comment
==
""
||
cm
.
ProposalID
==
""
{
if
cm
.
Comment
==
""
||
cm
.
ProposalID
==
""
{
err
:=
types
.
ErrInvalidParam
err
:=
types
.
ErrInvalidParam
alog
.
Error
(
"autonomy comment "
,
"addr"
,
a
.
fromaddr
,
"execaddr"
,
a
.
execaddr
,
"Comment or proposalID empty"
,
err
)
alog
.
Error
(
"autonomy comment
Prop
"
,
"addr"
,
a
.
fromaddr
,
"execaddr"
,
a
.
execaddr
,
"Comment or proposalID empty"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
var
logs
[]
*
types
.
ReceiptLog
var
logs
[]
*
types
.
ReceiptLog
...
...
plugin/dapp/autonomy/executor/ruleaction_test.go
View file @
1e3095ef
...
@@ -473,4 +473,97 @@ func TestUpgradeRule(t *testing.T) {
...
@@ -473,4 +473,97 @@ func TestUpgradeRule(t *testing.T) {
require
.
Equal
(
t
,
new
.
ProposalAmount
,
modify
.
ProposalAmount
)
require
.
Equal
(
t
,
new
.
ProposalAmount
,
modify
.
ProposalAmount
)
require
.
Equal
(
t
,
new
.
LargeProjectAmount
,
modify
.
LargeProjectAmount
)
require
.
Equal
(
t
,
new
.
LargeProjectAmount
,
modify
.
LargeProjectAmount
)
require
.
Equal
(
t
,
new
.
PublicPeriod
,
modify
.
PublicPeriod
)
require
.
Equal
(
t
,
new
.
PublicPeriod
,
modify
.
PublicPeriod
)
}
func
TestTransfer
(
t
*
testing
.
T
)
{
env
,
exec
,
stateDB
,
_
:=
InitEnv
()
opt1
:=
&
auty
.
TransferFund
{
Amount
:
types
.
Coin
*
190
,
}
pbtx
,
err
:=
transferFundTx
(
opt1
)
require
.
NoError
(
t
,
err
)
pbtx
,
err
=
signTx
(
pbtx
,
PrivKeyA
)
require
.
NoError
(
t
,
err
)
exec
.
SetEnv
(
env
.
blockHeight
,
env
.
blockTime
,
env
.
difficulty
)
receipt
,
err
:=
exec
.
Exec
(
pbtx
,
int
(
1
))
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
receipt
)
for
_
,
kv
:=
range
receipt
.
KV
{
stateDB
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
// check
accCoin
:=
account
.
NewCoinsAccount
()
accCoin
.
SetDB
(
stateDB
)
account
:=
accCoin
.
LoadExecAccount
(
AddrA
,
address
.
ExecAddress
(
auty
.
AutonomyX
))
require
.
Equal
(
t
,
total
-
types
.
Coin
*
190
,
account
.
Balance
)
account
=
accCoin
.
LoadExecAccount
(
autonomyFundAddr
,
address
.
ExecAddress
(
auty
.
AutonomyX
))
require
.
Equal
(
t
,
types
.
Coin
*
190
,
account
.
Balance
)
}
func
transferFundTx
(
parm
*
auty
.
TransferFund
)
(
*
types
.
Transaction
,
error
)
{
if
parm
==
nil
{
return
nil
,
types
.
ErrInvalidParam
}
val
:=
&
auty
.
AutonomyAction
{
Ty
:
auty
.
AutonomyActionTransfer
,
Value
:
&
auty
.
AutonomyAction_Transfer
{
Transfer
:
parm
},
}
return
types
.
CreateFormatTx
(
types
.
ExecName
(
auty
.
AutonomyX
),
types
.
Encode
(
val
))
}
func
TestComment
(
t
*
testing
.
T
)
{
env
,
exec
,
stateDB
,
kvdb
:=
InitEnv
()
propID
:=
"11111111111111"
Repcmt
:=
"2222222222"
comment
:=
"3333333333"
opt1
:=
&
auty
.
Comment
{
ProposalID
:
propID
,
RepCmtHash
:
Repcmt
,
Comment
:
comment
,
}
pbtx
,
err
:=
commentPropTx
(
opt1
)
require
.
NoError
(
t
,
err
)
pbtx
,
err
=
signTx
(
pbtx
,
PrivKeyA
)
require
.
NoError
(
t
,
err
)
exec
.
SetEnv
(
env
.
blockHeight
,
env
.
blockTime
,
env
.
difficulty
)
receipt
,
err
:=
exec
.
Exec
(
pbtx
,
int
(
1
))
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
receipt
)
for
_
,
kv
:=
range
receipt
.
KV
{
stateDB
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
receiptData
:=
&
types
.
ReceiptData
{
Ty
:
receipt
.
Ty
,
Logs
:
receipt
.
Logs
}
set
,
err
:=
exec
.
ExecLocal
(
pbtx
,
receiptData
,
int
(
1
))
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
set
)
for
_
,
kv
:=
range
set
.
KV
{
kvdb
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
// check
value
,
err
:=
kvdb
.
Get
(
calcCommentHeight
(
propID
,
drivers
.
HeightIndexStr
(
env
.
blockHeight
,
1
)))
require
.
NoError
(
t
,
err
)
cmt
:=
&
auty
.
RelationCmt
{}
err
=
types
.
Decode
(
value
,
cmt
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
cmt
.
Comment
,
comment
)
require
.
Equal
(
t
,
cmt
.
RepCmtHash
,
Repcmt
)
}
func
commentPropTx
(
parm
*
auty
.
Comment
)
(
*
types
.
Transaction
,
error
)
{
if
parm
==
nil
{
return
nil
,
types
.
ErrInvalidParam
}
val
:=
&
auty
.
AutonomyAction
{
Ty
:
auty
.
AutonomyActionCommentProp
,
Value
:
&
auty
.
AutonomyAction_CommentProp
{
CommentProp
:
parm
},
}
return
types
.
CreateFormatTx
(
types
.
ExecName
(
auty
.
AutonomyX
),
types
.
Encode
(
val
))
}
}
\ No newline at end of file
plugin/dapp/autonomy/proto/rule.proto
View file @
1e3095ef
...
@@ -101,6 +101,8 @@ message ReqQueryProposalComment {
...
@@ -101,6 +101,8 @@ message ReqQueryProposalComment {
message
RelationCmt
{
message
RelationCmt
{
string
repCmtHash
=
1
;
string
repCmtHash
=
1
;
string
comment
=
2
;
string
comment
=
2
;
int64
height
=
3
;
int32
index
=
4
;
}
}
message
ReplyQueryProposalComment
{
message
ReplyQueryProposalComment
{
...
...
plugin/dapp/autonomy/rpc/board_jrpc_channel_test.go
0 → 100644
View file @
1e3095ef
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
rpc_test
import
(
"testing"
"github.com/33cn/chain33/rpc/jsonclient"
rpctypes
"github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
auty
"github.com/33cn/plugin/plugin/dapp/autonomy/types"
_
"github.com/33cn/chain33/system"
_
"github.com/33cn/plugin/plugin"
)
func
testPropBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
ProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.PropBoardTx"
,
params
,
&
res
)
}
func
testRevokeProposalBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
RevokeProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.RevokeProposalBoardTx"
,
params
,
&
res
)
}
func
testVoteProposalBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
VoteProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.VoteProposalBoardTx"
,
params
,
&
res
)
}
func
testTerminateProposalBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
TerminateProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.TerminateProposalBoardTx"
,
params
,
&
res
)
}
func
testGetProposalBoardCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
types
.
ReqString
{}
params
.
FuncName
=
auty
.
GetProposalBoard
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalBoard
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
func
testListProposalBoardCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
auty
.
ReqQueryProposalBoard
{}
params
.
FuncName
=
auty
.
ListProposalBoard
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalBoard
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
plugin/dapp/autonomy/rpc/jrpc_channel_test.go
View file @
1e3095ef
...
@@ -10,10 +10,8 @@ import (
...
@@ -10,10 +10,8 @@ import (
commonlog
"github.com/33cn/chain33/common/log"
commonlog
"github.com/33cn/chain33/common/log"
"github.com/33cn/chain33/rpc/jsonclient"
"github.com/33cn/chain33/rpc/jsonclient"
rpctypes
"github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util/testnode"
"github.com/33cn/chain33/util/testnode"
auty
"github.com/33cn/plugin/plugin/dapp/autonomy/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
_
"github.com/33cn/chain33/system"
_
"github.com/33cn/chain33/system"
...
@@ -43,6 +41,26 @@ func TestJRPCChannel(t *testing.T) {
...
@@ -43,6 +41,26 @@ func TestJRPCChannel(t *testing.T) {
{
fn
:
testVoteProposalBoardTxCmd
},
{
fn
:
testVoteProposalBoardTxCmd
},
{
fn
:
testTerminateProposalBoardTxCmd
},
{
fn
:
testTerminateProposalBoardTxCmd
},
{
fn
:
testGetProposalBoardCmd
},
{
fn
:
testGetProposalBoardCmd
},
{
fn
:
testListProposalBoardCmd
},
{
fn
:
testPropProjectTxCmd
},
{
fn
:
testRevokeProposalProjectTxCmd
},
{
fn
:
testVoteProposalProjectTxCmd
},
{
fn
:
testPubVoteProposalProjectTxCmd
},
{
fn
:
testTerminateProposalProjectTxCmd
},
{
fn
:
testGetProposalProjectCmd
},
{
fn
:
testListProposalProjectCmd
},
{
fn
:
testPropRuleTxCmd
},
{
fn
:
testRevokeProposalRuleTxCmd
},
{
fn
:
testVoteProposalRuleTxCmd
},
{
fn
:
testTerminateProposalRuleTxCmd
},
{
fn
:
testGetProposalRuleCmd
},
{
fn
:
testListProposalRuleCmd
},
{
fn
:
testTransferFundTxCmd
},
{
fn
:
testCommentProposalTxCmd
},
{
fn
:
testListProposalCommentCmd
},
}
}
for
index
,
testCase
:=
range
testCases
{
for
index
,
testCase
:=
range
testCases
{
err
:=
testCase
.
fn
(
t
,
jrpcClient
)
err
:=
testCase
.
fn
(
t
,
jrpcClient
)
...
@@ -55,37 +73,3 @@ func TestJRPCChannel(t *testing.T) {
...
@@ -55,37 +73,3 @@ func TestJRPCChannel(t *testing.T) {
}
}
}
}
}
}
func
testPropBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
ProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.PropBoardTx"
,
params
,
&
res
)
}
func
testRevokeProposalBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
RevokeProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.RevokeProposalBoardTx"
,
params
,
&
res
)
}
func
testVoteProposalBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
VoteProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.VoteProposalBoardTx"
,
params
,
&
res
)
}
func
testTerminateProposalBoardTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
TerminateProposalBoard
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.TerminateProposalBoardTx"
,
params
,
&
res
)
}
func
testGetProposalBoardCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
auty
.
ReqQueryProposalBoard
{}
params
.
FuncName
=
auty
.
GetProposalBoard
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalBoard
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
plugin/dapp/autonomy/rpc/project_jrpc_channel_test.go
0 → 100644
View file @
1e3095ef
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
rpc_test
import
(
"testing"
"github.com/33cn/chain33/rpc/jsonclient"
rpctypes
"github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
auty
"github.com/33cn/plugin/plugin/dapp/autonomy/types"
_
"github.com/33cn/chain33/system"
_
"github.com/33cn/plugin/plugin"
)
func
testPropProjectTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
ProposalProject
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.PropProjectTx"
,
params
,
&
res
)
}
func
testRevokeProposalProjectTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
RevokeProposalProject
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.RevokeProposalProjectTx"
,
params
,
&
res
)
}
func
testVoteProposalProjectTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
VoteProposalProject
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.VoteProposalProjectTx"
,
params
,
&
res
)
}
func
testPubVoteProposalProjectTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
PubVoteProposalProject
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.PubVoteProposalProjectTx"
,
params
,
&
res
)
}
func
testTerminateProposalProjectTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
TerminateProposalProject
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.TerminateProposalProjectTx"
,
params
,
&
res
)
}
func
testGetProposalProjectCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
types
.
ReqString
{}
params
.
FuncName
=
auty
.
GetProposalProject
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalProject
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
func
testListProposalProjectCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
auty
.
ReqQueryProposalProject
{}
params
.
FuncName
=
auty
.
ListProposalProject
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalProject
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
plugin/dapp/autonomy/rpc/rule_jrpc_channel_test.go
0 → 100644
View file @
1e3095ef
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
rpc_test
import
(
"testing"
"github.com/33cn/chain33/rpc/jsonclient"
rpctypes
"github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
auty
"github.com/33cn/plugin/plugin/dapp/autonomy/types"
_
"github.com/33cn/chain33/system"
_
"github.com/33cn/plugin/plugin"
)
func
testPropRuleTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
ProposalRule
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.PropRuleTx"
,
params
,
&
res
)
}
func
testRevokeProposalRuleTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
RevokeProposalRule
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.RevokeProposalRuleTx"
,
params
,
&
res
)
}
func
testVoteProposalRuleTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
VoteProposalRule
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.VoteProposalRuleTx"
,
params
,
&
res
)
}
func
testTerminateProposalRuleTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
TerminateProposalRule
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.TerminateProposalRuleTx"
,
params
,
&
res
)
}
func
testGetProposalRuleCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
types
.
ReqString
{}
params
.
FuncName
=
auty
.
GetProposalRule
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalRule
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
func
testListProposalRuleCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
auty
.
ReqQueryProposalRule
{}
params
.
FuncName
=
auty
.
ListProposalRule
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalRule
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
func
testTransferFundTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
TransferFund
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.TransferFundTx"
,
params
,
&
res
)
}
func
testCommentProposalTxCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
params
:=
&
auty
.
Comment
{}
var
res
string
return
jrpc
.
Call
(
"autonomy.CommentProposalTx"
,
params
,
&
res
)
}
func
testListProposalCommentCmd
(
t
*
testing
.
T
,
jrpc
*
jsonclient
.
JSONClient
)
error
{
var
rep
interface
{}
var
params
rpctypes
.
Query4Jrpc
req
:=
&
auty
.
ReqQueryProposalComment
{}
params
.
FuncName
=
auty
.
ListProposalComment
params
.
Payload
=
types
.
MustPBToJSON
(
req
)
rep
=
&
auty
.
ReplyQueryProposalComment
{}
return
jrpc
.
Call
(
"Chain33.Query"
,
params
,
rep
)
}
\ No newline at end of file
plugin/dapp/autonomy/types/rule.pb.go
View file @
1e3095ef
...
@@ -442,6 +442,8 @@ func (m *ReqQueryProposalComment) GetIndex() int64 {
...
@@ -442,6 +442,8 @@ func (m *ReqQueryProposalComment) GetIndex() int64 {
type
RelationCmt
struct
{
type
RelationCmt
struct
{
RepCmtHash
string
`protobuf:"bytes,1,opt,name=repCmtHash" json:"repCmtHash,omitempty"`
RepCmtHash
string
`protobuf:"bytes,1,opt,name=repCmtHash" json:"repCmtHash,omitempty"`
Comment
string
`protobuf:"bytes,2,opt,name=comment" json:"comment,omitempty"`
Comment
string
`protobuf:"bytes,2,opt,name=comment" json:"comment,omitempty"`
Height
int64
`protobuf:"varint,3,opt,name=height" json:"height,omitempty"`
Index
int32
`protobuf:"varint,4,opt,name=index" json:"index,omitempty"`
}
}
func
(
m
*
RelationCmt
)
Reset
()
{
*
m
=
RelationCmt
{}
}
func
(
m
*
RelationCmt
)
Reset
()
{
*
m
=
RelationCmt
{}
}
...
@@ -463,6 +465,20 @@ func (m *RelationCmt) GetComment() string {
...
@@ -463,6 +465,20 @@ func (m *RelationCmt) GetComment() string {
return
""
return
""
}
}
func
(
m
*
RelationCmt
)
GetHeight
()
int64
{
if
m
!=
nil
{
return
m
.
Height
}
return
0
}
func
(
m
*
RelationCmt
)
GetIndex
()
int32
{
if
m
!=
nil
{
return
m
.
Index
}
return
0
}
type
ReplyQueryProposalComment
struct
{
type
ReplyQueryProposalComment
struct
{
RltCmt
[]
*
RelationCmt
`protobuf:"bytes,1,rep,name=rltCmt" json:"rltCmt,omitempty"`
RltCmt
[]
*
RelationCmt
`protobuf:"bytes,1,rep,name=rltCmt" json:"rltCmt,omitempty"`
}
}
...
@@ -500,47 +516,48 @@ func init() {
...
@@ -500,47 +516,48 @@ func init() {
func
init
()
{
proto
.
RegisterFile
(
"rule.proto"
,
fileDescriptor4
)
}
func
init
()
{
proto
.
RegisterFile
(
"rule.proto"
,
fileDescriptor4
)
}
var
fileDescriptor4
=
[]
byte
{
var
fileDescriptor4
=
[]
byte
{
// 671 bytes of a gzipped FileDescriptorProto
// 678 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xac
,
0x55
,
0x4d
,
0x6f
,
0xd3
,
0x4a
,
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xac
,
0x55
,
0x4d
,
0x6f
,
0xdb
,
0x38
,
0x14
,
0x95
,
0xe3
,
0x38
,
0xa9
,
0x6f
,
0xfb
,
0xaa
,
0x76
,
0x9a
,
0xd7
,
0xe7
,
0xd7
,
0xf7
,
0x54
,
0x45
,
0x10
,
0x85
,
0x2c
,
0xcb
,
0x8e
,
0x26
,
0xd9
,
0x20
,
0x61
,
0xbc
,
0x59
,
0x6d
,
0x5a
,
0x04
,
0x86
,
0x0e
,
0x5e
,
0xa0
,
0xa8
,
0x48
,
0x41
,
0x7c
,
0xa9
,
0x82
,
0x1d
,
0x04
,
0x68
,
0x91
,
0xba
,
0x80
,
0xa1
,
0x62
,
0x85
,
0x91
,
0x02
,
0x2e
,
0xfa
,
0x85
,
0xa0
,
0xbd
,
0xb5
,
0xee
,
0x47
,
0x0a
,
0xe4
,
0xd0
,
0xb2
,
0x41
,
0x3f
,
0xd8
,
0xb7
,
0x8d
,
0x55
,
0x7b
,
0xc6
,
0x8c
,
0xc7
,
0x51
,
0xb3
,
0x60
,
0xc5
,
0x82
,
0x1f
,
0xcd
,
0xef
,
0xac
,
0x34
,
0x89
,
0x85
,
0x48
,
0xa4
,
0x4a
,
0x51
,
0x46
,
0x7c
,
0xe8
,
0xa9
,
0x87
,
0xfe
,
0xe8
,
0x06
,
0xcd
,
0x78
,
0xdc
,
0xd8
,
0x49
,
0xd4
,
0x52
,
0x89
,
0x9d
,
0xcf
,
0x9d
,
0x33
,
0x1f
,
0xe7
,
0xcc
,
0x5e
,
0x0a
,
0x52
,
0x54
,
0x2c
,
0xd9
,
0x46
,
0xd2
,
0x00
,
0xbd
,
0x69
,
0x86
,
0x8f
,
0xe4
,
0xbc
,
0x37
,
0xb9
,
0x63
,
0x00
,
0x59
,
0xa6
,
0x38
,
0xce
,
0xa5
,
0x50
,
0x82
,
0x78
,
0x6a
,
0x9e
,
0x63
,
0x71
,
0xf0
,
0x6f
,
0x28
,
0x00
,
0x59
,
0xa6
,
0x38
,
0xce
,
0xa5
,
0x50
,
0x82
,
0x78
,
0x6a
,
0x9e
,
0x63
,
0x71
,
0xf0
,
0x57
,
0x1a
,
0x89
,
0x2c
,
0x13
,
0xbc
,
0xaa
,
0x86
,
0x3f
,
0x3a
,
0x30
,
0x78
,
0x55
,
0x2a
,
0xc1
,
0x45
,
0x4f
,
0x1a
,
0x89
,
0x2c
,
0x13
,
0xbc
,
0xca
,
0x86
,
0x3f
,
0x3b
,
0x30
,
0x78
,
0x55
,
0x2a
,
0xc1
,
0x45
,
0x36
,
0xff
,
0x20
,
0x45
,
0x2e
,
0x0a
,
0x96
,
0xd2
,
0x32
,
0x45
,
0xf2
,
0x08
,
0x36
,
0x72
,
0x29
,
0x72
,
0x36
,
0xff
,
0x28
,
0x45
,
0x2e
,
0x0a
,
0x96
,
0xd2
,
0x32
,
0x45
,
0xf2
,
0x08
,
0x36
,
0x72
,
0x29
,
0x72
,
0xfd
,
0x1d
,
0x38
,
0x43
,
0x67
,
0xb4
,
0xf9
,
0x64
,
0x6f
,
0x6c
,
0x56
,
0x18
,
0x37
,
0x69
,
0xf4
,
0x86
,
0xfd
,
0x1d
,
0x38
,
0x43
,
0x67
,
0xb4
,
0xf9
,
0x64
,
0x6f
,
0x6c
,
0x4e
,
0x18
,
0x37
,
0x61
,
0xf4
,
0x1a
,
0x44
,
0x1e
,
0x42
,
0x3f
,
0x2a
,
0xa5
,
0xe1
,
0x77
,
0x0c
,
0x7f
,
0xd7
,
0xf2
,
0x75
,
0x69
,
0x22
,
0xf8
,
0x44
,
0x1e
,
0x42
,
0x3f
,
0x2a
,
0xa5
,
0xc1
,
0x77
,
0x0c
,
0x7e
,
0xd7
,
0xe2
,
0x75
,
0x6a
,
0x22
,
0xf8
,
0x45
,
0x72
,
0x49
,
0x6b
,
0x06
,
0x79
,
0x0c
,
0x30
,
0x13
,
0x0a
,
0x29
,
0x16
,
0x65
,
0xaa
,
0x02
,
0xb7
,
0x79
,
0x72
,
0x41
,
0x6b
,
0x04
,
0x79
,
0x0c
,
0x30
,
0x13
,
0x0a
,
0x29
,
0x16
,
0x65
,
0xaa
,
0x02
,
0xb7
,
0xc5
,
0xff
,
0x7c
,
0x33
,
0x40
,
0x1b
,
0x24
,
0xb2
,
0x0f
,
0xbd
,
0x42
,
0x31
,
0x55
,
0x16
,
0x41
,
0x77
,
0x85
,
0xff
,
0x72
,
0xbd
,
0x40
,
0x1b
,
0x20
,
0xb2
,
0x0f
,
0xbd
,
0x42
,
0x31
,
0x55
,
0x16
,
0x41
,
0x77
,
0xe8
,
0x8c
,
0x3c
,
0x6a
,
0x11
,
0x09
,
0xa0
,
0xcf
,
0xe2
,
0x58
,
0x62
,
0x51
,
0x04
,
0xde
,
0xd0
,
0x19
,
0xe8
,
0x8c
,
0x3c
,
0x6a
,
0x23
,
0x12
,
0x40
,
0x9f
,
0xc5
,
0xb1
,
0xc4
,
0xa2
,
0x08
,
0xbc
,
0xa1
,
0x33
,
0xf9
,
0xb4
,
0x86
,
0x7a
,
0xc6
,
0x14
,
0x93
,
0xcb
,
0xa9
,
0x0a
,
0x7a
,
0x43
,
0x67
,
0xe4
,
0x52
,
0x8b
,
0xf2
,
0x69
,
0x1d
,
0xea
,
0x1d
,
0x53
,
0x4c
,
0x2e
,
0xa6
,
0x2a
,
0xe8
,
0x0d
,
0x9d
,
0x91
,
0x4b
,
0x6d
,
0xc8
,
0x00
,
0xbc
,
0x84
,
0xc7
,
0x78
,
0x1d
,
0xf4
,
0xcd
,
0x42
,
0x15
,
0x08
,
0x7f
,
0x3a
,
0xb0
,
0xd5
,
0x44
,
0x06
,
0xe0
,
0x25
,
0x3c
,
0xc6
,
0xab
,
0xa0
,
0x6f
,
0x0e
,
0xaa
,
0x82
,
0xf0
,
0x97
,
0x03
,
0x5b
,
0x72
,
0x80
,
0x40
,
0x77
,
0x8e
,
0x4c
,
0x1a
,
0xf5
,
0x1e
,
0x35
,
0xdf
,
0x7a
,
0x6a
,
0x26
,
0xb8
,
0x9a
,
0x2d
,
0x05
,
0x08
,
0x74
,
0xe7
,
0xc8
,
0xa4
,
0x61
,
0xef
,
0x51
,
0xf3
,
0xad
,
0xb7
,
0x66
,
0x82
,
0xab
,
0x1a
,
0x89
,
0x1e
,
0xad
,
0x00
,
0xd9
,
0x01
,
0x37
,
0x66
,
0x73
,
0x23
,
0xc3
,
0xa3
,
0xfa
,
0x53
,
0x9b
,
0xa9
,
0xa1
,
0xe8
,
0xd1
,
0x2a
,
0x20
,
0x3b
,
0xe0
,
0xc6
,
0x6c
,
0x6e
,
0x68
,
0x78
,
0x54
,
0x7f
,
0x6a
,
0xa1
,
0xad
,
0x9f
,
0x5c
,
0x5c
,
0x9a
,
0xd3
,
0xae
,
0x37
,
0xc3
,
0x32
,
0xc8
,
0x11
,
0xec
,
0x14
,
0x8a
,
0x31
,
0xb4
,
0xf4
,
0x93
,
0xf3
,
0x0b
,
0x53
,
0xed
,
0x7a
,
0x31
,
0x2c
,
0x82
,
0x1c
,
0xc1
,
0x4e
,
0xa1
,
0x49
,
0xf5
,
0x3a
,
0x15
,
0xd1
,
0xd5
,
0x69
,
0x75
,
0x62
,
0xcf
,
0x9c
,
0x78
,
0xa5
,
0x4e
,
0x1e
,
0xc0
,
0x98
,
0x54
,
0xaf
,
0x53
,
0x11
,
0x5d
,
0x9e
,
0x54
,
0x15
,
0x7b
,
0xa6
,
0xe2
,
0x95
,
0x3c
,
0x79
,
0x00
,
0x36
,
0xf2
,
0xb8
,
0xc9
,
0xac
,
0xb4
,
0x2d
,
0x55
,
0xc9
,
0x18
,
0x88
,
0x44
,
0x96
,
0xbe
,
0x6d
,
0x73
,
0xdb
,
0xc8
,
0xe3
,
0x26
,
0xb2
,
0xe2
,
0xb6
,
0x94
,
0x25
,
0x63
,
0x20
,
0x12
,
0x59
,
0xfa
,
0xb6
,
0x8d
,
0xfb
,
0x86
,
0xbb
,
0x66
,
0x24
,
0x7c
,
0x06
,
0x84
,
0xe2
,
0x4c
,
0x5c
,
0x61
,
0xcb
,
0x82
,
0x43
,
0x80
,
0xed
,
0x1b
,
0xec
,
0x9a
,
0x95
,
0xf0
,
0x19
,
0x10
,
0x8a
,
0x33
,
0x71
,
0x89
,
0x2d
,
0x09
,
0x0e
,
0x01
,
0xdc
,
0xe2
,
0xf7
,
0x6f
,
0x8c
,
0x11
,
0x3e
,
0x6d
,
0x54
,
0xc2
,
0x33
,
0xd8
,
0xd1
,
0xb7
,
0x75
,
0x9f
,
0x72
,
0x1b
,
0x7f
,
0x78
,
0x63
,
0x84
,
0xf0
,
0x69
,
0x23
,
0x13
,
0x9e
,
0xc2
,
0x8e
,
0xee
,
0xd6
,
0x5d
,
0x39
,
0xe6
,
0xbe
,
0xf2
,
0x5c
,
0x8a
,
0x59
,
0x95
,
0x93
,
0x0d
,
0x5a
,
0xc3
,
0xf0
,
0x18
,
0xfe
,
0x3e
,
0xf6
,
0x98
,
0x7e
,
0xe5
,
0xb9
,
0x14
,
0xb3
,
0xca
,
0x27
,
0x1b
,
0xb4
,
0x0e
,
0xc3
,
0x63
,
0xf8
,
0xf7
,
0x47
,
0x99
,
0x25
,
0x9c
,
0xdd
,
0x6f
,
0xc9
,
0xf0
,
0x1b
,
0xec
,
0x51
,
0x8c
,
0x30
,
0xc9
,
0xd5
,
0x52
,
0x0c
,
0x65
,
0x96
,
0x70
,
0x76
,
0xb7
,
0x23
,
0xc3
,
0xef
,
0xb0
,
0x47
,
0x31
,
0xc2
,
0x24
,
0x57
,
0x4b
,
0x84
,
0xbb
,
0xb9
,
0xc4
,
0x99
,
0x8d
,
0xef
,
0x7f
,
0xf6
,
0x06
,
0xd6
,
0xa5
,
0x9d
,
0x1a
,
0x22
,
0x79
,
0x16
,
0xee
,
0xe6
,
0x12
,
0x67
,
0xd6
,
0xbe
,
0xf7
,
0x6c
,
0x07
,
0xd6
,
0xb9
,
0x9d
,
0x1a
,
0x20
,
0x79
,
0x6e
,
0x22
,
0x2c
,
0x91
,
0x2b
,
0x1b
,
0xe1
,
0x5b
,
0xe7
,
0xd4
,
0xdc
,
0x70
,
0x0a
,
0xbb
,
0x67
,
0x22
,
0x6e
,
0x2c
,
0x2c
,
0x91
,
0x2b
,
0x6b
,
0xe1
,
0x1b
,
0xf7
,
0xd4
,
0xd8
,
0x70
,
0x0a
,
0xbb
,
0xa7
,
0x22
,
0x62
,
0x69
,
0x6b
,
0xf3
,
0xe3
,
0x95
,
0xfe
,
0xb9
,
0x75
,
0xb1
,
0x45
,
0x1f
,
0x1d
,
0xc0
,
0x86
,
0xee
,
0x62
,
0x69
,
0xeb
,
0xf2
,
0xe3
,
0x95
,
0xf9
,
0xb9
,
0xf1
,
0xb0
,
0xc5
,
0x1c
,
0x1d
,
0xc0
,
0x86
,
0x9e
,
0x50
,
0xe4
,
0xaa
,
0x08
,
0x3a
,
0x43
,
0x77
,
0xe4
,
0xd3
,
0x1b
,
0x1c
,
0x5e
,
0xc3
,
0x80
,
0xe2
,
0xd7
,
0x50
,
0xe4
,
0xaa
,
0x08
,
0x3a
,
0x43
,
0x77
,
0xe4
,
0xd3
,
0xeb
,
0x38
,
0xbc
,
0x82
,
0x01
,
0xc5
,
0x6f
,
0x8f
,
0x25
,
0xca
,
0x76
,
0xb3
,
0x2e
,
0x7a
,
0xc3
,
0x69
,
0xf5
,
0xc6
,
0x00
,
0xbc
,
0x48
,
0x94
,
0x56
,
0x9f
,
0x4a
,
0x94
,
0xed
,
0x61
,
0x5d
,
0xcc
,
0x86
,
0xd3
,
0x9a
,
0x8d
,
0x01
,
0x78
,
0x91
,
0x28
,
0x2d
,
0x8e
,
0x47
,
0x2b
,
0x40
,
0xfe
,
0x07
,
0x3f
,
0x4e
,
0x24
,
0x46
,
0x2a
,
0x11
,
0xdc
,
0x86
,
0x76
,
0x51
,
0x1d
,
0x8f
,
0x56
,
0x01
,
0xb9
,
0x0f
,
0x7e
,
0x9c
,
0x48
,
0x8c
,
0x54
,
0x22
,
0xb8
,
0x35
,
0xed
,
0x22
,
0x58
,
0x74
,
0x47
,
0xd7
,
0x84
,
0xc5
,
0x76
,
0xc7
,
0x27
,
0xd8
,
0xa7
,
0x98
,
0xa7
,
0xf3
,
0xd5
,
0xbd
,
0xb1
,
0x98
,
0x8e
,
0xae
,
0x31
,
0x8b
,
0x9d
,
0x8e
,
0xcf
,
0xb0
,
0x4f
,
0x31
,
0x4f
,
0xe7
,
0xab
,
0x77
,
0x5f
,
0x80
,
0x5f
,
0x9f
,
0x5d
,
0x6f
,
0xef
,
0xde
,
0xa5
,
0x74
,
0xc1
,
0x0e
,
0x5f
,
0xc2
,
0xd6
,
0xb9
,
0xbf
,
0x00
,
0xbf
,
0xae
,
0x5d
,
0x5f
,
0xef
,
0xde
,
0xc6
,
0x74
,
0x81
,
0x0e
,
0x5f
,
0xc2
,
0xd6
,
0x99
,
0x64
,
0xbc
,
0xb8
,
0x40
,
0xf9
,
0xae
,
0xe4
,
0xb1
,
0x96
,
0xc1
,
0x32
,
0x73
,
0x5e
,
0xa7
,
0x6a
,
0xd8
,
0x64
,
0xbc
,
0x38
,
0x47
,
0xf9
,
0xae
,
0xe4
,
0xb1
,
0xa6
,
0xc1
,
0x32
,
0x53
,
0xaf
,
0x53
,
0x0d
,
0x6c
,
0x0a
,
0xe9
,
0x4e
,
0xe4
,
0x42
,
0x55
,
0x79
,
0xf1
,
0xa9
,
0xf9
,
0x0e
,
0x23
,
0xe8
,
0x4f
,
0x2a
,
0x5b
,
0x15
,
0xe9
,
0x49
,
0xe4
,
0x42
,
0x55
,
0x7e
,
0xf1
,
0xa9
,
0xf9
,
0x0e
,
0x23
,
0xe8
,
0x4f
,
0x2a
,
0x59
,
0xee
,
0x4c
,
0xdc
,
0x21
,
0x80
,
0xc4
,
0x7c
,
0x92
,
0xa9
,
0x53
,
0x56
,
0x4c
,
0xed
,
0x22
,
0x8d
,
0x8a
,
0x6e
,
0x75
,
0xdc
,
0x21
,
0x80
,
0xc4
,
0x7c
,
0x92
,
0xa9
,
0x13
,
0x56
,
0x4c
,
0xed
,
0x21
,
0x8d
,
0x8c
,
0x4e
,
0xa4
,
0x75
,
0xd8
,
0xb8
,
0xe1
,
0xd3
,
0x1a
,
0x86
,
0x53
,
0xad
,
0xba
,
0x15
,
0xac
,
0x7a
,
0xcf
,
0x76
,
0xa4
,
0x55
,
0xd8
,
0xa8
,
0xe1
,
0xd3
,
0x3a
,
0x0c
,
0xa7
,
0x9a
,
0x75
,
0xcb
,
0x58
,
0xf5
,
0x9d
,
0x21
,
0xb8
,
0x51
,
0xa6
,
0xec
,
0xcd
,
0x6e
,
0x5b
,
0xbd
,
0x76
,
0x90
,
0xea
,
0xa1
,
0xc6
,
0xeb
,
0xd3
,
0x43
,
0x70
,
0xa3
,
0x4c
,
0xd9
,
0xce
,
0x6e
,
0x5b
,
0xbe
,
0x76
,
0x91
,
0xea
,
0xa5
,
0xc6
,
0xeb
,
0xd3
,
0x59
,
0xff
,
0xfa
,
0xb8
,
0xcd
,
0xd7
,
0xe7
,
0xbb
,
0x03
,
0xff
,
0x2c
,
0x5f
,
0xed
,
0xef
,
0xea
,
0xfb
,
0x59
,
0xff
,
0xfa
,
0xb8
,
0xcd
,
0xd7
,
0xe7
,
0x87
,
0x03
,
0xff
,
0x2d
,
0xb7
,
0xf6
,
0x4f
,
0xf9
,
0xfd
,
0x73
,
0xb7
,
0x7c
,
0x02
,
0x9b
,
0x14
,
0x53
,
0xa6
,
0x19
,
0x93
,
0x4c
,
0x2d
,
0x19
,
0xe7
,
0xdc
,
0x66
,
0xbd
,
0x2e
,
0x97
,
0xb0
,
0x49
,
0x31
,
0x65
,
0x1a
,
0x31
,
0xc9
,
0xd4
,
0x92
,
0x70
,
0xce
,
0x4d
,
0xc2
,
0x5c
,
0xa7
,
0x6d
,
0xdc
,
0x09
,
0xfc
,
0xbb
,
0x1a
,
0x97
,
0x5a
,
0xcf
,
0x11
,
0xf4
,
0x64
,
0xaa
,
0x26
,
0x75
,
0x5a
,
0xc2
,
0x35
,
0xc8
,
0xbb
,
0xeb
,
0xc9
,
0x77
,
0x9b
,
0xe4
,
0xdf
,
0xc3
,
0xff
,
0xab
,
0xe6
,
0xc6
,
0x3e
,
0x1d
,
0x17
,
0x52
,
0xbf
,
0x8d
,
0x8b
,
0xad
,
0xa9
,
0x65
,
0x7c
,
0xe9
,
0x99
,
0xdf
,
0xd4
,
0xaa
,
0xd9
,
0x1f
,
0x41
,
0x4f
,
0xa6
,
0x6a
,
0x62
,
0xc4
,
0xd6
,
0xe6
,
0x22
,
0xf5
,
0x4b
,
0xba
,
0x28
,
0xd3
,
0x5f
,
0x01
,
0x00
,
0x00
,
0xff
,
0xff
,
0x28
,
0x01
,
0x71
,
0xa1
,
0xca
,
0x06
,
0x00
,
0x00
,
0x94
,
0x5a
,
0xc4
,
0xd7
,
0x9e
,
0xf9
,
0xa9
,
0x3d
,
0xfd
,
0x1d
,
0x00
,
0x00
,
0xff
,
0xff
,
0x6d
,
0x03
,
0xbb
,
0x1b
,
0xf8
,
0x06
,
0x00
,
0x00
,
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment