Skip to content

Commit 29fe6a1

Browse files
Step 5, play on chain and off chain distribute rewards, allowing the framework to actually be used (#49)
* WIP rearranging slashing * Seems to be back * One more step: recognizing the move coming back from on chain that corresponds with the prior synchronization. We know stop at a move launched in response to having successfully recognized the other player's on chain move and need to reconcile our own turn with it. * WIP Checkpointing a lot of construction. We're doing the first native on chain move but args isn't aligned with the max move size we need. Investigating * Hold the program in GameHandler via rc * I feel like things are getting under control * removed a hack, better * Reaching accept state on chain * Prepare for clippy and fmt * Checkpoint clippy+fmt * WIP: Loops closed. We send accept and shutdown down the pipe and finish the simulation. Needed: verify outputs from referee (including check that mover shares total up properly in all cases), refactor how to call referee's verify method. * 1 remaining test failure which needs me to combine the validator args parameter objects and make a nice method of referee that gives one * fmt * clippy * fmt * clippy * Fix referee slash test * Fix up wasm * add decoding of the game outcome to the piss_off_peer_complete test. we need to ensure the correct side won the channel content * WIP, zeroing in on mover share * Make one move * suspend * Take other branch * fmt * fmt+clippy * fmt+clippy * fmt+clippy * Fix wasm * wip * add * One more * separate function to start on chain transition * Can be said to be 'working' for the first time. * lint * fmt * mask sim-tests feature * api drift * Add some commentary, align results to what should be expected (more tests required) * Give a name to index and card * Start removing diagnostics aids * remove more diagnostics * Remove more * Removing nodeptr from potentially stored values * Convert more clvm data to durable storage * Convert more storage * fmt * Squeeze out more NodePtr storage * Convert containers of big puzzle and program objects to Rc * Fix wasm * Fix wasm * Start pulling up referee * Branch * All tests pass * Add remove stray * Fixed this * Missed rebuild, propogate * remove diagnostics from chialisp
1 parent a1cfeb3 commit 29fe6a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+3034
-1997
lines changed

clsp/calpoker_generate.clinc

+28-12
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,22 @@
5252
(curry calpoker_alice_driver_c PREIMAGE move) PREIMAGE)
5353
)
5454

55+
(defun single-byte (raw-indices)
56+
(if raw-indices
57+
(assign
58+
indices-len (strlen raw-indices)
59+
(substr raw-indices (- indices-len 1) indices-len)
60+
)
61+
0x00
62+
)
63+
)
64+
5565
(defun bitify (mylist)
56-
(if (not mylist)
57-
0
58-
(logior (f mylist) (lsh (bitify (r mylist)) 1))
66+
(single-byte
67+
(if (not mylist)
68+
0
69+
(logior (f mylist) (lsh (bitify (r mylist)) 1))
70+
)
5971
)
6072
)
6173

@@ -84,13 +96,13 @@
8496
(if (not mylist)
8597
0
8698
(= (f mylist) index)
87-
(logior 1 (* 2 (indices_to_bitfield_inner (r mylist) (+ index 1))))
88-
(* 2 (indices_to_bitfield_inner mylist (+ index 1)))
99+
(logior 1 (lsh (indices_to_bitfield_inner (r mylist) (+ index 1)) 1))
100+
(lsh (indices_to_bitfield_inner mylist (+ index 1)) 1)
89101
)
90102
)
91103

92104
(defun indices_to_bitfield (mylist)
93-
(indices_to_bitfield_inner mylist 0)
105+
(single-byte (indices_to_bitfield_inner mylist 0))
94106
)
95107

96108
; We have composed cards as sublists but need them as pairs.
@@ -108,14 +120,16 @@
108120
bob_all_cards (map make_card (append bob_cards_bob my_cards_bob))
109121
(my_hand_value my_picks) (handcalc (map card_list_to_pair my_all_cards))
110122
(bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards))
123+
;; win_result is 1 if my_hand_value is greater than bob_hand_value
111124
win_result (list_compare my_hand_value bob_hand_value)
125+
;; split is captured in a their turn handler below so it's the opposite of what
126+
;; this turn would specify.
112127
split (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)
113128
(list MAKE_MOVE
114129
(list move (indices_to_bitfield my_picks) (indices_to_bitfield bob_picks)
115130
my_hand_value bob_hand_value win_result)
116-
(lambda ((& MY_SALT MY_PICKS split)) (list (concat MY_SALT MY_PICKS) 0 0 0 0 split 0 0)
131+
(lambda ((& MY_SALT MY_PICKS my_picks split amount)) (list (concat MY_SALT MY_PICKS (single-byte (indices_to_bitfield my_picks))) 0 0 0 0 split 0 0))
117132
0
118-
)
119133
)
120134
)
121135
)
@@ -192,7 +206,7 @@
192206
pokere
193207
pokere_hash
194208
(list my_move (list ALICE_CARDS BOB_CARDS) ALICE_COMMIT_2)
195-
17
209+
18
196210
0
197211
calpoker_bob_driver_e
198212
0
@@ -206,19 +220,21 @@
206220
(defun calpoker_bob_driver_e (amount (@ state (bob_selects (alice_cards bob_cards) alice_commit_2)) move
207221
validation_program_hash max_move_size split)
208222
(assign
209-
alice_selects (substr move 16 (strlen move))
210-
(alice_cards_alice alice_cards_bob) (split_cards alice_selects alice_cards)
223+
alice_my_picks (substr move 16 17)
224+
alice_selects (substr move 17 (strlen move))
225+
(alice_cards_alice alice_cards_bob) (split_cards alice_my_picks alice_cards)
211226
(bob_cards_bob bob_cards_alice) (split_cards bob_selects bob_cards)
212227
alice_all_cards (map make_card (append alice_cards_alice bob_cards_alice))
213228
bob_all_cards (map make_card (append bob_cards_bob alice_cards_bob))
214229
(alice_hand_value alice_picks) (handcalc (map card_list_to_pair alice_all_cards))
215230
(bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards))
216231
win_result (list_compare alice_hand_value bob_hand_value)
232+
;; win_result 1 means alice wins.
217233
correct_split (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)
218234
(if (!= split correct_split)
219235
(list SLASH (indices_to_bitfield bob_picks))
220236
(list MAKE_MOVE
221-
(list alice_selects (indices_to_bitfield bob_picks) (indices_to_bitfield alice_picks)
237+
(list alice_my_picks (indices_to_bitfield bob_picks) (indices_to_bitfield alice_picks)
222238
bob_hand_value alice_hand_value split)
223239
)
224240
)

clsp/calpoker_include.clsp

+75-73
Original file line numberDiff line numberDiff line change
@@ -7,108 +7,110 @@
77
(export calpoker_template)
88

99
(defun find-key-in-params (key params)
10-
(if (and params (= (f (f params)) key))
11-
(r (f params))
12-
(find-key-in-params key (r params))
13-
)
14-
)
10+
(if (and params (= (f (f params)) key))
11+
(r (f params))
12+
(find-key-in-params key (r params))
13+
)
14+
)
1515

1616
(defun maybe-default (setting default-setting)
17-
(i setting setting default-setting)
18-
)
17+
(i setting setting default-setting)
18+
)
1919

2020
(defun validation-program-of-template ((_ _ _ _ _ p)) p)
2121

22+
(defun validation-program-hash-of-template ((_ _ _ _ _ _ p)) p)
23+
2224
(defun max-move-size-of-template ((_ _ _ _ m)) m)
2325

24-
(defun calpoker_factory (amount my_contribution params)
25-
(assign
26+
(defun calpoker_factory (i_am_initiator my_contribution their_contribution params)
27+
(assign
28+
template (calpoker_template)
2629

27-
template (calpoker_template)
30+
amount (+ my_contribution their_contribution)
2831

29-
their-contribution (- amount my_contribution)
32+
(assert
33+
(= my_contribution (/ amount 2))
3034

31-
(assert
35+
(list
36+
;; My turn games
37+
(list
38+
;; One game
39+
(list
40+
;; Amount
41+
amount
3242

33-
(= my_contribution (/ amount 2))
43+
;; My turn
44+
1
3445

35-
(list
36-
;; My turn games
37-
(list
38-
;; One game
39-
(list
40-
;; GameID - will be replaced by caller
41-
()
42-
;; Amount
43-
amount
46+
;; Handler
47+
(f template)
4448

45-
;; Handler
46-
(f template)
49+
;; My contribution this game
50+
my_contribution
51+
;; Their contribution
52+
their_contribution
4753

48-
;; Timeout, specified as 0 since we'll populate it above
49-
()
54+
;; Initial validation program
55+
(validation-program-of-template template)
5056

51-
;; My contribution this game
52-
my_contribution
53-
;; Their contribution
54-
their-contribution
57+
;; Hash of initial validator program
58+
(validation-program-hash-of-template template)
5559

56-
;; Initial validation program
57-
(validation-program-of-template template)
60+
;; Initial state
61+
()
5862

59-
;; Initial state
60-
()
63+
;; Initial move
64+
()
6165

62-
;; Initial move
63-
()
66+
;; Initial max move size
67+
(max-move-size-of-template template)
6468

65-
;; Initial max move size
66-
(max-move-size-of-template template)
69+
;; Initial mover share
70+
0
71+
)
72+
)
6773

68-
;; Initial mover share
69-
amount
70-
)
71-
)
74+
;; Their turn games
75+
(list
76+
;; One game
77+
(list
78+
;; Amount
79+
amount
7280

73-
;; Their turn games
74-
(list
75-
;; One game
76-
(list
77-
;; GameID - will be replaced by caller
78-
()
79-
;; Amount
80-
amount
81+
;; Their turn
82+
()
8183

82-
;; Handler
83-
(f (r template))
84+
;; Handler
85+
(f (r template))
8486

85-
;; Timeout - specified as zero here since we'll fix it above.
86-
()
87+
;; My contribution this game
88+
their_contribution
89+
;; Their contribution
90+
my_contribution
8791

88-
;; My contribution this game
89-
their-contribution
90-
;; Their contribution
91-
my_contribution
92+
;; Initial validation program
93+
(validation-program-of-template template)
9294

93-
;; Initial validation program
94-
(validation-program-of-template template)
95+
;; Hash of initial validator program
96+
(validation-program-hash-of-template template)
9597

96-
;; Initial state
97-
()
98+
;; Initial state
99+
()
98100

99-
;; Initial move
100-
()
101+
;; Initial move
102+
()
101103

102-
;; Initial max move size
103-
(max-move-size-of-template template)
104+
;; Initial max move size
105+
(max-move-size-of-template template)
104106

105-
;; Initial mover share
106-
()
107-
)
108-
)
109-
)
107+
;; Initial mover share
108+
0
109+
)
110+
)
111+
)
112+
)
110113
)
111-
)
112-
)
114+
)
113115

114116
(export calpoker_factory)

clsp/calpoker_include_calpoker_factory.hex

+1-1
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
a024e6d61c722329f072f49807b92a92137007a48efa8990a8a8e892a07302a60c
1+
a0acd32980d4db741d89e6bd22fac8bcf868236353632429ae7e2aaa6983299555

clsp/calpoker_include_calpoker_template.hex

+1-1
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
a0a67bd98df995843ce7455e32c980b1313f06f9095c4ebd3d93ee2225aed3b480
1+
a0cccaed2b69d77e540361ba2fd5d2b1ad6641553f0ca12352c88ee2e620343fd4

clsp/onchain/calpoker/a.clsp

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
; state is empty
1010
; move is alice commit to a salted word
1111
; evidence is empty
12-
(export (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash
12+
; ME below is the object whose hash is mod_hash
13+
(export (mod_hash (move new_validation_hash mover_share previous_validation_hash
1314
mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash)
14-
state me mover_puzzle solution evidence)
15+
state me previous_validation_program mover_puzzle solution evidence)
1516

1617
(if_any_fail
1718
(= new_validation_hash (sha256 bhash (sha256 1 move)))

clsp/onchain/calpoker/a.hex

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180
1+
ff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a058adc514078f82ecf3819caa0309a59cc8815f47d3a64e096704599eec459d81ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff820bfdffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180

clsp/onchain/calpoker/b.clsp

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
; state is alice's commit
1111
; move is bob's seed
1212
; evidence is empty
13-
(export (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash
13+
(export (mod_hash (move new_validation_hash mover_share previous_validation_hash
1414
mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash)
15-
alice_commit me mover_puzzle solution evidence)
15+
alice_commit me previous_validation_program mover_puzzle solution evidence)
1616
(if_any_fail
1717
(= new_validation_hash (sha256 chash (shatree (list alice_commit move))))
1818
(= (strlen move) 16)

clsp/onchain/calpoker/b.hex

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0d76b54b465224694d5b6f7f3165668b705fc87c0d6c5dd039041b1c164d479b8ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080
1+
ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a044cb615df45187c99eb1ace0903b97e85460bfd22f7852fb8ac95e486949e699ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff8217fbffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080

clsp/onchain/calpoker/c.clsp

+4-5
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,16 @@
1212
; state is alice's commit and bob's seed
1313
; move is alice's reveal of her card generating seed and her commit to which cards she's picking
1414
; evidence is empty
15-
(export (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash
16-
mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash)
17-
(alice_commit bob_seed) me mover_puzzle solution evidence)
15+
(export (@ all_args (mod_hash (move new_validation_hash mover_share previous_validation_hash
16+
mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash)
17+
(alice_commit bob_seed) me previous_calidation_program mover_puzzle solution evidence))
1818
(if_any_fail
1919
(= (strlen move) 48)
2020
(= (sha256 (substr move 0 16)) alice_commit)
21-
(= new_validation_hash (sha256 dhash (shatree (list (make_cards
21+
(= new_validation_hash (sha256 dhash (shatree (list (make_cards
2222
(sha256 (substr move 0 16) bob_seed amount)) (substr move 16 48)))))
2323
(= max_move_size 1)
2424
0
2525
(x)
2626
)
2727
)
28-

clsp/onchain/calpoker/c.hex

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0a26f665f62b95611287a458c9e63ed131d9a364355e336c991857dfd1e8da690ffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080
1+
ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a04952337315e54a0224523703762ea9da3d1c80b0bbb97486dc056f0efdb38612ffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080

0 commit comments

Comments
 (0)