From 33edcba6946090fa9c8fe740b218a6a9110af668 Mon Sep 17 00:00:00 2001 From: arty Date: Tue, 3 Dec 2024 12:13:28 -0800 Subject: [PATCH 01/50] WIP rearranging slashing --- clsp/calpoker_include_calpoker_factory.hex | 2 +- ...calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- ...alpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/calpoker/a.clsp | 4 +- clsp/onchain/calpoker/a.hex | 2 +- clsp/onchain/calpoker/b.clsp | 3 +- clsp/onchain/calpoker/b.hex | 2 +- clsp/onchain/calpoker/c.clsp | 9 +- clsp/onchain/calpoker/c.hex | 2 +- clsp/onchain/calpoker/d.clsp | 3 +- clsp/onchain/calpoker/d.hex | 2 +- clsp/onchain/calpoker/e.clsp | 3 +- clsp/onchain/calpoker/e.hex | 2 +- clsp/onchain/referee.clsp | 10 +- src/referee.rs | 461 +++++++++++------- src/tests/peer/potato_handler_sim.rs | 2 +- src/tests/referee.rs | 12 +- 18 files changed, 313 insertions(+), 212 deletions(-) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 635dd19a..bcdcc539 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0d76b54b465224694d5b6f7f3165668b705fc87c0d6c5dd039041b1c164d479b8ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a005403605dcfa6a8cd8ba4d79c173a9ebe72a0727a980db1dd3d97b37cc56f53cffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0a26f665f62b95611287a458c9e63ed131d9a364355e336c991857dfd1e8da690ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0a26f665f62b95611287a458c9e63ed131d9a364355e336c991857dfd1e8da690ffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d76b54b465224694d5b6f7f3165668b705fc87c0d6c5dd039041b1c164d479b8ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a005403605dcfa6a8cd8ba4d79c173a9ebe72a0727a980db1dd3d97b37cc56f53cffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0a231e34d814d86273abf59273f65ea6c53499400de44212a776c32f4b26736c0ff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff0187706f6b65722064ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa073793a300d0f7624464a9282273030e066282362971ad1d60a935717ca678f82ff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 8388d634..056f45ce 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a024e6d61c722329f072f49807b92a92137007a48efa8990a8a8e892a07302a60c \ No newline at end of file +a0b173a3c2d5a533081b19917015fbb54cc682bf29d307923dea9d58b42c3d13a3 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index 13bdba80..9ddabfa6 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0a231e34d814d86273abf59273f65ea6c53499400de44212a776c32f4b26736c0ff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0d76b54b465224694d5b6f7f3165668b705fc87c0d6c5dd039041b1c164d479b8ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a005403605dcfa6a8cd8ba4d79c173a9ebe72a0727a980db1dd3d97b37cc56f53cffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0a26f665f62b95611287a458c9e63ed131d9a364355e336c991857dfd1e8da690ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0a26f665f62b95611287a458c9e63ed131d9a364355e336c991857dfd1e8da690ffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d76b54b465224694d5b6f7f3165668b705fc87c0d6c5dd039041b1c164d479b8ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a005403605dcfa6a8cd8ba4d79c173a9ebe72a0727a980db1dd3d97b37cc56f53cffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0a231e34d814d86273abf59273f65ea6c53499400de44212a776c32f4b26736c0ff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa073793a300d0f7624464a9282273030e066282362971ad1d60a935717ca678f82ff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff0187706f6b65722064ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa073793a300d0f7624464a9282273030e066282362971ad1d60a935717ca678f82ff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index a315f298..17d7a3ab 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a0a67bd98df995843ce7455e32c980b1313f06f9095c4ebd3d93ee2225aed3b480 \ No newline at end of file +a05dc0bed2408f15d0342dbcbe469393a3297f6e0dcf0489a5be58bb17be1f9ab5 \ No newline at end of file diff --git a/clsp/onchain/calpoker/a.clsp b/clsp/onchain/calpoker/a.clsp index e8f817a7..53c5030d 100644 --- a/clsp/onchain/calpoker/a.clsp +++ b/clsp/onchain/calpoker/a.clsp @@ -3,18 +3,20 @@ (import onchain.calpoker.b exposing (program_hash as bhash)) (import std.assert) (import std.and) +(import std.print) (import std.if_any_fail) ; Bob challenging ; state is empty ; move is alice commit to a salted word ; evidence is empty +; ME below is the object whose hash is mod_hash (export (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) state me mover_puzzle solution evidence) (if_any_fail - (= new_validation_hash (sha256 bhash (sha256 1 move))) + (print "poker a" (= new_validation_hash (sha256 bhash (sha256 1 move)))) (= (strlen move) 32) (= max_move_size 16) 0 diff --git a/clsp/onchain/calpoker/a.hex b/clsp/onchain/calpoker/a.hex index 1ea7b766..7dfde348 100644 --- a/clsp/onchain/calpoker/a.hex +++ b/clsp/onchain/calpoker/a.hex @@ -1 +1 @@ -ff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a017bebec00518a344e6689c1eb49da0fed674d08685e408a99cd1e070972fb6f4ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/b.clsp b/clsp/onchain/calpoker/b.clsp index 04b81114..bf62c92d 100644 --- a/clsp/onchain/calpoker/b.clsp +++ b/clsp/onchain/calpoker/b.clsp @@ -5,6 +5,7 @@ (import std.assert) (import std.if_any_fail) (import std.shatree) +(import std.print) ; Alice challenging ; state is alice's commit @@ -14,7 +15,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) alice_commit me mover_puzzle solution evidence) (if_any_fail - (= new_validation_hash (sha256 chash (shatree (list alice_commit move)))) + (print "poker b" (= new_validation_hash (sha256 chash (shatree (list alice_commit move))))) (= (strlen move) 16) (= max_move_size 48) 0 diff --git a/clsp/onchain/calpoker/b.hex b/clsp/onchain/calpoker/b.hex index 2debb70b..6ccc8a26 100644 --- a/clsp/onchain/calpoker/b.hex +++ b/clsp/onchain/calpoker/b.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0d76b54b465224694d5b6f7f3165668b705fc87c0d6c5dd039041b1c164d479b8ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.clsp b/clsp/onchain/calpoker/c.clsp index 1f664337..94172e4a 100644 --- a/clsp/onchain/calpoker/c.clsp +++ b/clsp/onchain/calpoker/c.clsp @@ -5,6 +5,7 @@ (import std.relops) (import std.and) (import std.if_any_fail) +(import std.print) (import onchain.calpoker.d exposing (program_hash as dhash)) (import onchain.calpoker.make_cards) @@ -12,11 +13,11 @@ ; state is alice's commit and bob's seed ; move is alice's reveal of her card generating seed and her commit to which cards she's picking ; evidence is empty -(export (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash - mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) - (alice_commit bob_seed) me mover_puzzle solution evidence) +(export (@ all_args (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash + mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) + (alice_commit bob_seed) me mover_puzzle solution evidence)) (if_any_fail - (= (strlen move) 48) + (print (list "poker c" move "all args" all_args) (= (strlen move) 48)) (= (sha256 (substr move 0 16)) alice_commit) (= new_validation_hash (sha256 dhash (shatree (list (make_cards (sha256 (substr move 0 16) bob_seed amount)) (substr move 16 48))))) diff --git a/clsp/onchain/calpoker/c.hex b/clsp/onchain/calpoker/c.hex index ca7a9f87..f87b6bc6 100644 --- a/clsp/onchain/calpoker/c.hex +++ b/clsp/onchain/calpoker/c.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0a26f665f62b95611287a458c9e63ed131d9a364355e336c991857dfd1e8da690ffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/d.clsp b/clsp/onchain/calpoker/d.clsp index 8e294f34..6f21d0e2 100644 --- a/clsp/onchain/calpoker/d.clsp +++ b/clsp/onchain/calpoker/d.clsp @@ -6,6 +6,7 @@ (import std.popcount) (import std.and) (import std.if_any_fail) +(import std.print) ; Alice challenging ; state is the cards for both players and alice's card pick commitment @@ -15,7 +16,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (cards alice_commit) me mover_puzzle solution evidence) (if_any_fail - (= (strlen bob_picks) 1) + (print "poker d" (= (strlen bob_picks) 1)) (= (popcount bob_picks) 4) (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) (= max_move_size 18) diff --git a/clsp/onchain/calpoker/d.hex b/clsp/onchain/calpoker/d.hex index 486c3eca..b52c3081 100644 --- a/clsp/onchain/calpoker/d.hex +++ b/clsp/onchain/calpoker/d.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a005403605dcfa6a8cd8ba4d79c173a9ebe72a0727a980db1dd3d97b37cc56f53cffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff0187706f6b65722064ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/e.clsp b/clsp/onchain/calpoker/e.clsp index dc37f65c..9fa4c99f 100644 --- a/clsp/onchain/calpoker/e.clsp +++ b/clsp/onchain/calpoker/e.clsp @@ -9,6 +9,7 @@ (import std.popcount) (import std.if_any_fail) (import std.and) +(import std.print) ; Bob challenging ; state is (Bob's picks (alice_cards bob_cards) alice_commit) @@ -18,7 +19,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (bob_picks (alice_cards bob_cards) alice_commit) me mover_puzzle solution bob_card_selections) (if_any_fail - (= (strlen move) 18) + (print "poker e" (= (strlen move) 18)) (assign alice_salted_picks (substr move 0 17) alice_picks (substr move 16 17) diff --git a/clsp/onchain/calpoker/e.hex b/clsp/onchain/calpoker/e.hex index 8c4ede10..d99a7355 100644 --- a/clsp/onchain/calpoker/e.hex +++ b/clsp/onchain/calpoker/e.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index 4bd336be..8e7b1308 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -40,11 +40,15 @@ previous_validation_program_hash (shatree previous_validation_program) (assert (= MOVER_PUZZLE_HASH (shatree mover_puzzle)) - (= PREVIOUS_VALIDATION_INFO_HASH (sha256 previous_validation_program_hash (shatree + (= PREVIOUS_VALIDATION_INFO_HASH (sha256 previous_validation_program_hash (shatree previous_state))) - ; usually returns the conditions verbatim + + ; Intention here: + ; An empty remark indicating slash + ; The conditions returned by previous_validation_program + ; The conditions returned by mover_puzzle (c (list REMARK) - (concat (a previous_validation_program (c previous_validation_program_hash all_args)) + (concat (a previous_validation_program (c previous_validation_program_hash all_args)) (a mover_puzzle solution)) ) ) diff --git a/src/referee.rs b/src/referee.rs index 3ff84e54..d0bf982e 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -26,7 +26,7 @@ use crate::common::standard_coin::{ standard_solution_partial, standard_solution_unsafe, ChiaIdentity, }; use crate::common::types::{ - u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, CoinCondition, CoinSpend, + u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, Program, Puzzle, PuzzleHash, Sha256tree, Spend, Timeout, chia_dialect, }; @@ -59,6 +59,7 @@ pub struct TheirTurnMoveResult { pub puzzle_hash_for_unroll: PuzzleHash, pub readable_move: NodePtr, pub message: Vec, + pub original: TheirTurnResult, } pub enum SlashOutcome { @@ -294,33 +295,20 @@ fn curry_referee_puzzle( /// is next to it. /// pub struct ValidatorMoveArgs { - pub game_move: GameMoveDetails, + pub state: NodePtr, pub mover_puzzle: Program, pub solution: NodePtr, + pub evidence: NodePtr, } impl ValidatorMoveArgs { - pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { + pub fn to_nodeptr(&self, allocator: &mut AllocEncoder, me: NodePtr) -> Result { let args: &[NodePtr] = &[ - allocator - .encode_atom(&self.game_move.basic.move_made) - .into_gen()?, - self.game_move - .validation_info_hash - .to_clvm(allocator) - .into_gen()?, - self.game_move - .basic - .mover_share - .to_clvm(allocator) - .into_gen()?, - self.game_move - .basic - .max_move_size - .to_clvm(allocator) - .into_gen()?, + self.state, + me, self.mover_puzzle.to_clvm(allocator).into_gen()?, self.solution, + self.evidence ]; let argvec: Vec = args.iter().map(|v| Node(*v)).collect(); argvec.to_clvm(allocator).into_gen() @@ -564,6 +552,43 @@ pub struct StoredGameState { state_number: usize, } +// validation programs get passed this: +// ((last_move next_validation_hash my_share me_hash my_puzzle_hash opponent_puzzle_hash +// amount timeout max_move_size referee_hash) +// state me mover_puzzle solution evidence) +// +// 'args' of referee was +// (previous_state previous_validation_program mover_puzzle solution evidence) +// +// and +// +// previous_validation_program_hash = (shatree previous_validation_program) +// +// we apply +// (a previous_validation_program (c previous_validation_program_hash all_args)) +// +// So the arguments to the validation program should match. +fn curried_args_for_validator( + allocator: &mut AllocEncoder, + referee_puzzle_hash: &PuzzleHash, + referee_args: &RefereePuzzleArgs, + validator_args: &ValidatorMoveArgs, +) -> Result, Error> { + let referee_args_node = referee_args.to_node_list( + allocator, + referee_puzzle_hash + )?; + todo!(); + // let previous_validation_program_hash = referee_args.game_move.validation_program +} + // clvm_curried_args!( + // state, + // Node(validation_program.to_nodeptr()), + // my_inner_puzzle, + // slash_spend_solution, + // 0 + // ) + // XXX break out state so we can have a previous state and easily swap them. // Referee coin has two inner puzzles. // Throughout channel handler, the one that's ours is the standard format puzzle @@ -1325,23 +1350,46 @@ impl RefereeMaker { } pub fn run_validator_for_their_move( - &mut self, + &self, allocator: &mut AllocEncoder, validator_move_args: &ValidatorMoveArgs, - ) -> Result<(), Error> { + ) -> Result { + let referee_args = self.spend_this_coin(); + let referee_list = referee_args.to_node_list( + allocator, + &self.fixed.referee_coin_puzzle_hash + )?; let (_state, validation_program) = self.get_validation_program_for_their_move()?; - let validator_move_converted = validator_move_args.to_nodeptr(allocator)?; + let validation_program_nodeptr = validation_program.to_nodeptr(); + let validation_program_hexer = Program::from_nodeptr(allocator, validation_program_nodeptr)?; + let validator_move_converted = validator_move_args.to_nodeptr( + allocator, + validation_program_nodeptr + )?; + let mod_hash = validation_program.hash(); + let validator_full_args_node = ( + mod_hash, + ( + referee_list, + Node(validator_move_converted) + ) + ).to_clvm(allocator).into_gen()?; + let validator_full_args = Program::from_nodeptr(allocator, validator_full_args_node)?; + + debug!("validator program {:?}", validation_program_hexer); + debug!("validator args {:?}", validator_full_args); + // Error means validation should not work. // It should be handled later. - run_program( + let result = run_program( allocator.allocator(), &chia_dialect(), validation_program.to_nodeptr(), - validator_move_converted, + validator_full_args_node, 0, ) .into_gen()?; - Ok(()) + Ok(result.1) } pub fn their_turn_move_off_chain( @@ -1383,7 +1431,7 @@ impl RefereeMaker { true, )); - let (readable_move, message) = match result { + let (readable_move, message) = match &result { TheirTurnResult::FinalMove(readable_move) => { self.accept_their_move( allocator, @@ -1394,7 +1442,7 @@ impl RefereeMaker { state_number, )?; - (readable_move, vec![]) + (readable_move.clone(), vec![]) } TheirTurnResult::MakeMove(readable_move, handler, message) => { // Mover puzzle turns the given solution into coin conditions @@ -1411,7 +1459,7 @@ impl RefereeMaker { // holding coin spendable by us. self.accept_their_move( allocator, - Some(handler), + Some(handler.clone()), args.clone(), puzzle_args.clone(), details, @@ -1420,11 +1468,11 @@ impl RefereeMaker { debug!( "readable_move {}", - disassemble(allocator.allocator(), readable_move, None) + disassemble(allocator.allocator(), *readable_move, None) ); debug!("message {message:?}"); - (readable_move, message) + (readable_move.clone(), message.clone()) } // Slash can't be used when we're off chain. TheirTurnResult::Slash(_evidence, _signature) => { @@ -1447,6 +1495,7 @@ impl RefereeMaker { puzzle_hash_for_unroll, readable_move, message: message.clone(), + original: result }) } @@ -1534,6 +1583,149 @@ impl RefereeMaker { ))) } + fn make_slash_conditions( + &self, + allocator: &mut AllocEncoder, + ) -> Result { + ( + CREATE_COIN, + ( + self.target_puzzle_hash_for_slash(), + (self.fixed.amount.clone(), ()), + ), + ) + .to_clvm(allocator) + .into_gen() + } + + fn make_slash_spend( + &self, + allocator: &mut AllocEncoder, + ) -> Result { + let slash_conditions = self.make_slash_conditions(allocator)?; + standard_solution_unsafe( + allocator, + &self.fixed.my_identity.private_key, + slash_conditions, + ) + } + + fn make_full_slash_solution( + &self, + allocator: &mut AllocEncoder, + ) -> Result { + assert!(!self.processing_my_turn()); + let args = self.spend_this_coin(); + let new_puzzle_hash = curry_referee_puzzle_hash( + allocator, + &self.fixed.referee_coin_puzzle_hash, + &args + )?; + let (state, validation_program) = { + let (s, v) = self.get_validation_program_for_their_move()?; + (s.clone(), v) + }; + + ( + &state, + ( + Node(validation_program.to_nodeptr()), + // No evidence here. + (new_puzzle_hash.clone(), ((), (0, ()))), + ), + ) + .to_clvm(allocator) + .into_gen() + } + + pub fn check_their_turn_for_slash( + &self, + allocator: &mut AllocEncoder, + coin_string: &CoinString, + details: &GameMoveDetails, + state_number: usize, + ) -> Result, Error> { + let args = self.spend_this_coin(); + let puzzle_args = Rc::new(RefereePuzzleArgs::new( + &self.fixed, + &details.basic, + Some(&args.game_move.validation_info_hash), + &details.validation_info_hash, + None, + false, + )); + let new_puzzle = curry_referee_puzzle( + allocator, + &self.fixed.referee_coin_puzzle, + &self.fixed.referee_coin_puzzle_hash, + &puzzle_args, + )?; + let new_puzzle_hash = curry_referee_puzzle_hash( + allocator, + &self.fixed.referee_coin_puzzle_hash, + &puzzle_args, + )?; + + let game_handler = self.get_game_handler(); + let referee_args = self.args_for_this_coin(); + let nil = allocator.allocator().null(); + let validator_args = ValidatorMoveArgs { + evidence: nil, + state: self.get_game_state().to_nodeptr(allocator)?, + mover_puzzle: self.fixed.my_identity.puzzle.to_program(), + solution: self.fixed + .my_identity + .standard_solution( + allocator, + &[(self.fixed.my_identity.puzzle_hash.clone(), Amount::default())], + ) + .expect("should create"), + }; + + // my_inner_solution maker is just in charge of making aggsigs from + // conditions. + let slash_conditions = self.make_slash_conditions(allocator)?; + let slash_spend = self.make_slash_spend(allocator)?; + + let slash_spend_solution: &Program = slash_spend.solution.borrow(); + let referee_args = self.args_for_this_coin(); + + let full_slash_result = self.run_validator_for_their_move( + allocator, + &validator_args, + ); + match full_slash_result { + Ok(slash) => { + debug!( + "slash was allowed: {}", + disassemble(allocator.allocator(), slash, None) + ); + + // Ultimately each of these cases returns some kind of + // TheirTurnCoinSpentResult. + let nil_evidence = Evidence::nil(allocator); + + // result is NodePtr containing solution and aggsig. + // The aggsig for the nil slash is the same as the slash + // below, having been created for the reward coin by using + // the standard solution signer. + let full_slash_solution = self.make_full_slash_solution(allocator)?; + self.make_slash_for_their_turn( + allocator, + coin_string, + &new_puzzle, + &new_puzzle_hash, + full_slash_solution, + nil_evidence, + &slash_spend.signature, + ).map(Some) + } + Err(_) => { + Ok(None) + } + } + } + pub fn their_turn_coin_spent( &mut self, allocator: &mut AllocEncoder, @@ -1585,7 +1777,7 @@ impl RefereeMaker { let my_inner_puzzle = puzzle_for_pk(allocator, &self.fixed.my_identity.public_key)?; let new_move = &rem_condition[0]; - let new_validation_info_hash = Hash::from_slice(&rem_condition[1]); + let validation_info_hash = Hash::from_slice(&rem_condition[1]); let (new_mover_share, new_max_move_size) = if let (Some(share), Some(max_size)) = ( u64_from_atom(&rem_condition[2]), usize_from_atom(&rem_condition[3]), @@ -1597,172 +1789,44 @@ impl RefereeMaker { )); }; - let basic_move = GameMoveStateInfo { - move_made: new_move.clone(), - max_move_size: new_max_move_size, - mover_share: new_mover_share.clone(), + let details = GameMoveDetails { + basic: GameMoveStateInfo { + move_made: new_move.clone(), + max_move_size: new_max_move_size, + mover_share: new_mover_share.clone(), + }, + validation_info_hash, }; - let to_spend_args = self.spend_this_coin(); - let puzzle_args = Rc::new(RefereePuzzleArgs::new( - &self.fixed, - &basic_move, - Some(&new_validation_info_hash), - &to_spend_args.game_move.validation_info_hash, - None, - true, - )); + + let result = self.their_turn_move_off_chain( + allocator, + &details, + state_number, + )?; + + let args = self.spend_this_coin(); + let new_puzzle = curry_referee_puzzle( allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, - &puzzle_args, + &args )?; let new_puzzle_hash = curry_referee_puzzle_hash( allocator, &self.fixed.referee_coin_puzzle_hash, - &puzzle_args, + &args )?; - let game_handler = self.get_game_handler(); - - // my_inner_solution maker is just in charge of making aggsigs from - // conditions. - let slash_conditions = ( - CREATE_COIN, - ( - self.target_puzzle_hash_for_slash(), - (self.fixed.amount.clone(), ()), - ), - ) - .to_clvm(allocator) - .into_gen()?; - - let slash_spend = standard_solution_unsafe( - allocator, - &self.fixed.my_identity.private_key, - slash_conditions, - )?; - - let (state, validation_program) = self.get_validation_program_for_their_move()?; - let slash_spend_solution: &Program = slash_spend.solution.borrow(); - let full_slash_program = CurriedProgram { - program: Node(validation_program.to_nodeptr()), - args: clvm_curried_args!( - state, - Node(validation_program.to_nodeptr()), - my_inner_puzzle, - slash_spend_solution, - 0 - ), - } - .to_clvm(allocator) - .into_gen()?; - - let nil = allocator.allocator().null(); - let full_slash_result = run_program( - allocator.allocator(), - &chia_dialect(), - full_slash_program, - nil, - 0, - ); - - let full_slash_solution = ( - state, - ( - Node(validation_program.to_nodeptr()), - // No evidence here. - (new_puzzle_hash.clone(), ((), (0, ()))), - ), - ) - .to_clvm(allocator) - .into_gen()?; - - match full_slash_result { - Ok(slash) => { - debug!( - "slash was allowed: {}", - disassemble(allocator.allocator(), slash.1, None) - ); - - // Ultimately each of these cases returns some kind of - // TheirTurnCoinSpentResult. - let nil_evidence = Evidence::nil(allocator); - - // result is NodePtr containing solution and aggsig. - // The aggsig for the nil slash is the same as the slash - // below, having been created for the reward coin by using - // the standard solution signer. - self.make_slash_for_their_turn( - allocator, - coin_string, - &new_puzzle, - &new_puzzle_hash, - full_slash_solution, - nil_evidence, - &slash_spend.signature, - ) - } - Err(_) => { - // Slash wasn't allowed. Run the move handler. - let details = GameMoveDetails { - basic: GameMoveStateInfo { - move_made: new_move.clone(), - max_move_size: new_max_move_size, - mover_share: new_mover_share.clone(), - }, - validation_info_hash: new_validation_info_hash.clone(), - }; - debug!("referee move details {details:?}"); - let last_state_nodeptr = state.to_nodeptr(allocator)?; - let (readable_move, game_handler) = match game_handler.call_their_turn_driver( - allocator, - &TheirTurnInputs { - amount: self.fixed.amount.clone(), - last_state: last_state_nodeptr, - last_move: &to_spend_args.game_move.basic.move_made, - last_mover_share: to_spend_args.game_move.basic.mover_share.clone(), - - new_move: details, - - #[cfg(test)] - run_debug: self.run_debug, - }, - )? { - TheirTurnResult::Slash(evidence, sig) => { - return self.make_slash_for_their_turn( - allocator, - coin_string, - &new_puzzle, - &new_puzzle_hash, - full_slash_solution, - evidence, - &(slash_spend.signature + *sig), - ); - } - TheirTurnResult::FinalMove(readable_move) => (readable_move, None), - TheirTurnResult::MakeMove(readable_move, game_handler, _message) => { - (readable_move, Some(game_handler)) - } - }; - - // Otherwise accept move by updating our state - self.accept_their_move( - allocator, - game_handler, - to_spend_args.clone(), - puzzle_args.clone(), - &GameMoveDetails { - basic: GameMoveStateInfo { - move_made: new_move.clone(), - max_move_size: new_max_move_size, - mover_share: new_mover_share.clone(), - }, - validation_info_hash: new_validation_info_hash.clone(), - }, - state_number, - )?; - + let mut check_and_report_slash = |readable_move: NodePtr| { + if let Some(result) = self.check_their_turn_for_slash( + allocator, + coin_string, + &details, + state_number)? + { + Ok(result) + } else { Ok(TheirTurnCoinSpentResult::Moved { new_coin_string: CoinString::from_parts( &coin_string.to_coin_id(), @@ -1772,6 +1836,29 @@ impl RefereeMaker { readable: readable_move, }) } + }; + debug!("referee move details {details:?}"); + match result.original { + TheirTurnResult::Slash(evidence, sig) => { + let slash_spend = self.make_slash_spend(allocator)?; + let full_slash_solution = self.make_full_slash_solution(allocator)?; + return self.make_slash_for_their_turn( + allocator, + coin_string, + &new_puzzle, + &new_puzzle_hash, + full_slash_solution, + evidence, + &(slash_spend.signature + *sig), + ); + } + TheirTurnResult::FinalMove(readable_move) => { + check_and_report_slash(readable_move) + } + TheirTurnResult::MakeMove(readable_move, _, _) => { + check_and_report_slash(readable_move) + } } + } } diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 06247e93..864372d4 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -1030,7 +1030,7 @@ fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { fn sim_test_with_peer_container_piss_off_peer_complete() { let mut allocator = AllocEncoder::new(); - let mut moves = test_moves_1(&mut allocator); + let mut moves = test_moves_1(&mut allocator).to_vec(); if let GameAction::Move(_player, readable, _) = moves[2].clone() { moves[3] = GameAction::FakeMove(1, readable, vec![0; 500]); } else { diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 3b8b2e11..664bd668 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -224,6 +224,7 @@ fn test_referee_smoke() { .my_referee .my_turn_make_move(&mut allocator, &readable_my_move, rng.gen(), 0) .expect("should move"); + let state = reftest.my_referee.get_game_state().clone(); assert!(my_move_wire_data.details.basic.move_made.is_empty()); let mut off_chain_slash_gives_error = reftest.my_referee.clone(); @@ -254,8 +255,11 @@ fn test_referee_smoke() { debug!("their_move_wire_data {their_move_local_update:?}"); + let state_node = state.to_nodeptr(&mut allocator).expect("should cvt"); + let nil = allocator.allocator().null(); let validator_move_args = ValidatorMoveArgs { - game_move: my_move_wire_data.details.clone(), + state: state_node, + evidence: allocator.allocator().null(), mover_puzzle: reftest.my_identity.puzzle.to_program(), solution: reftest .my_identity @@ -266,10 +270,10 @@ fn test_referee_smoke() { .expect("should create"), }; - reftest + let validator_result = reftest .their_referee - .run_validator_for_their_move(&mut allocator, &validator_move_args) - .expect("should run"); + .run_validator_for_their_move(&mut allocator, &validator_move_args); + assert!(validator_result.is_err()); assert!(reftest.my_referee.processing_my_turn()); let their_move_result = reftest From 8f277a252e3a453de760212fc74c054f28fd2c78 Mon Sep 17 00:00:00 2001 From: arty Date: Tue, 3 Dec 2024 13:02:00 -0800 Subject: [PATCH 02/50] Seems to be back --- src/channel_handler/mod.rs | 3 ++- src/channel_handler/types.rs | 2 +- src/referee.rs | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 350c0c1a..6ca5c062 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -1503,7 +1503,7 @@ impl ChannelHandler { let reward_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; let game_puzzle_hash = self.live_games[live_game_idx].outcome_puzzle_hash(env.allocator)?; - if self.live_games[live_game_idx].processing_my_turn() { + if !self.live_games[live_game_idx].processing_my_turn() { // Try to determine if the spend was us. let expected_creation = conditions.iter().filter_map(|c| { @@ -1533,6 +1533,7 @@ impl ChannelHandler { todo!(); } + // Check whether this is for a spend that already happened. Ok(CoinSpentInformation::TheirSpend(self.live_games[live_game_idx].their_turn_coin_spent( env.allocator, coin_string, diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index e881b4a0..20f86534 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -1082,7 +1082,7 @@ impl LiveGame { conditions: &[CoinCondition], current_state: usize, ) -> Result { - assert!(!self.referee_maker.processing_my_turn()); + assert!(self.referee_maker.processing_my_turn()); self.referee_maker .their_turn_coin_spent(allocator, coin_string, conditions, current_state) } diff --git a/src/referee.rs b/src/referee.rs index d0bf982e..50782e1b 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -1733,6 +1733,7 @@ impl RefereeMaker { conditions: &[CoinCondition], state_number: usize, ) -> Result { + assert!(!self.is_my_turn()); debug!("rems in spend {conditions:?}"); // Read parameters off conditions From fef22851fc9144724a968731b50e4d3e48159638 Mon Sep 17 00:00:00 2001 From: arty Date: Wed, 4 Dec 2024 03:43:06 -0800 Subject: [PATCH 03/50] 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. --- clsp/calpoker_include_calpoker_factory.hex | 2 +- ...calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- ...alpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/calpoker/a.hex | 2 +- clsp/onchain/calpoker/b.hex | 2 +- clsp/onchain/calpoker/c.hex | 2 +- clsp/onchain/calpoker/d.clsp | 2 +- clsp/onchain/calpoker/d.hex | 2 +- src/channel_handler/mod.rs | 15 +- src/channel_handler/types.rs | 19 ++- src/potato_handler.rs | 41 ++++- src/referee.rs | 152 ++++++++---------- src/tests/referee.rs | 6 +- 14 files changed, 144 insertions(+), 107 deletions(-) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index bcdcc539..e11992c4 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff0187706f6b65722064ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa073793a300d0f7624464a9282273030e066282362971ad1d60a935717ca678f82ff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa08ee3c8d95323bc3569cfc60c89e41aa8ba8d9b3f4db0fb71673f37e0969bf09cff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 056f45ce..832f09c6 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a0b173a3c2d5a533081b19917015fbb54cc682bf29d307923dea9d58b42c3d13a3 \ No newline at end of file +a006cfbfa8bee142a2aa934d374f6d4f73c6a44284355cb2a0dea75569cb08bd36 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index 9ddabfa6..ace200d2 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa073793a300d0f7624464a9282273030e066282362971ad1d60a935717ca678f82ff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff0187706f6b65722064ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa073793a300d0f7624464a9282273030e066282362971ad1d60a935717ca678f82ff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa08ee3c8d95323bc3569cfc60c89e41aa8ba8d9b3f4db0fb71673f37e0969bf09cff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa08ee3c8d95323bc3569cfc60c89e41aa8ba8d9b3f4db0fb71673f37e0969bf09cff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index 17d7a3ab..7ba2591b 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a05dc0bed2408f15d0342dbcbe469393a3297f6e0dcf0489a5be58bb17be1f9ab5 \ No newline at end of file +a0c42a3d098c1789f9eaa2315e98931480870f0a6a84127544a62b85a6c2d078e8 \ No newline at end of file diff --git a/clsp/onchain/calpoker/a.hex b/clsp/onchain/calpoker/a.hex index 7dfde348..e6d63842 100644 --- a/clsp/onchain/calpoker/a.hex +++ b/clsp/onchain/calpoker/a.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0c72e07d63182d7075607ae548c2d3b0ccdc6b38c5d8be6fd053fbcc9a6f879e3ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/b.hex b/clsp/onchain/calpoker/b.hex index 6ccc8a26..9b334b59 100644 --- a/clsp/onchain/calpoker/b.hex +++ b/clsp/onchain/calpoker/b.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0f25e9ce5bd13914ae0a803e982be741052b7387078fbe9bb39a076f5d974f233ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.hex b/clsp/onchain/calpoker/c.hex index f87b6bc6..fc2aa0de 100644 --- a/clsp/onchain/calpoker/c.hex +++ b/clsp/onchain/calpoker/c.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0ef3a327a25a1bec602350f99fd3dfc018e79f647d24d21260f5086da67a3ae3cffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/d.clsp b/clsp/onchain/calpoker/d.clsp index 6f21d0e2..28c0d9c5 100644 --- a/clsp/onchain/calpoker/d.clsp +++ b/clsp/onchain/calpoker/d.clsp @@ -16,7 +16,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (cards alice_commit) me mover_puzzle solution evidence) (if_any_fail - (print "poker d" (= (strlen bob_picks) 1)) + (print (list "poker d" bob_picks) (= (strlen bob_picks) 1)) (= (popcount bob_picks) 4) (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) (= max_move_size 18) diff --git a/clsp/onchain/calpoker/d.hex b/clsp/onchain/calpoker/d.hex index b52c3081..6202c15a 100644 --- a/clsp/onchain/calpoker/d.hex +++ b/clsp/onchain/calpoker/d.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff0187706f6b65722064ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 6ca5c062..bca18040 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -1502,6 +1502,7 @@ impl ChannelHandler { let referee_pk = private_to_public_key(&self.referee_private_key()); let reward_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; let game_puzzle_hash = self.live_games[live_game_idx].outcome_puzzle_hash(env.allocator)?; + let prev_puzzle_hash = self.live_games[live_game_idx].current_puzzle_hash(env.allocator)?; if !self.live_games[live_game_idx].processing_my_turn() { // Try to determine if the spend was us. @@ -1533,12 +1534,24 @@ impl ChannelHandler { todo!(); } - // Check whether this is for a spend that already happened. + if let Some((_, ph, _)) = coin_string.to_parts() { + if prev_puzzle_hash == ph { + return Ok(CoinSpentInformation::Expected(game_puzzle_hash.clone(), self.live_games[live_game_idx].get_amount(), self.live_games[live_game_idx].their_turn_coin_spent( + env.allocator, + coin_string, + conditions, + self.current_state_number, + true, + )?)); + } + } + Ok(CoinSpentInformation::TheirSpend(self.live_games[live_game_idx].their_turn_coin_spent( env.allocator, coin_string, conditions, self.current_state_number, + false, )?)) } diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 20f86534..fb10aaa9 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -1003,6 +1003,10 @@ impl LiveGame { self.referee_maker.processing_my_turn() } + pub fn last_puzzle_hash(&self) -> PuzzleHash { + self.last_referee_puzzle_hash.clone() + } + pub fn current_puzzle_hash(&self, allocator: &mut AllocEncoder) -> Result { self.referee_maker.on_chain_referee_puzzle_hash(allocator) } @@ -1038,7 +1042,7 @@ impl LiveGame { assert!(!self.referee_maker.is_my_turn()); let their_move_result = self.referee_maker - .their_turn_move_off_chain(allocator, game_move, state_number)?; + .their_turn_move_off_chain(allocator, game_move, state_number, true)?; self.last_referee_puzzle_hash = their_move_result.puzzle_hash_for_unroll.clone(); Ok(their_move_result) } @@ -1081,10 +1085,13 @@ impl LiveGame { coin_string: &CoinString, conditions: &[CoinCondition], current_state: usize, + expected: bool, ) -> Result { assert!(self.referee_maker.processing_my_turn()); - self.referee_maker - .their_turn_coin_spent(allocator, coin_string, conditions, current_state) + let res = self.referee_maker + .their_turn_coin_spent(allocator, coin_string, conditions, current_state, expected)?; + self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; + Ok(res) } /// Regress the live game state to the state we know so that we can generate the puzzle @@ -1100,13 +1107,14 @@ impl LiveGame { debug!("live game: current state is {referee_puzzle_hash:?} want {want_ph:?}"); let result = self.referee_maker.rewind(allocator, want_ph)?; if let Some(current_state) = &result { - assert!(self.is_my_turn()); self.rewind_outcome = Some(*current_state); + self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; return Ok(Some((self.is_my_turn(), *current_state))); } if referee_puzzle_hash == *want_ph { self.rewind_outcome = Some(current_state); + self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; return Ok(Some((self.is_my_turn(), current_state))); } @@ -1119,7 +1127,8 @@ impl LiveGame { pub enum CoinSpentInformation { OurReward(PuzzleHash, Amount), OurSpend(PuzzleHash, Amount), - TheirSpend(TheirTurnCoinSpentResult) + TheirSpend(TheirTurnCoinSpentResult), + Expected(PuzzleHash, Amount, TheirTurnCoinSpentResult), } pub enum CoinIdentificationByPuzzleHash { diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 04559038..c008131b 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -2049,7 +2049,7 @@ impl PotatoHandler { if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { if game_map.contains_key(coin_id) { // Check how it got spent. - let (env, system_interface) = penv.env(); + let (_env, system_interface) = penv.env(); system_interface.request_puzzle_and_solution(coin_id)?; return Ok(true); } @@ -2097,7 +2097,7 @@ impl PotatoHandler { // A game coin was spent and we have the puzzle and solution. let player_ch = self.channel_handler_mut()?; - let (env, system_interface) = penv.env(); + let (env, _system_interface) = penv.env(); let conditions = CoinCondition::from_puzzle_and_solution( env.allocator, puzzle, @@ -2110,13 +2110,42 @@ impl PotatoHandler { &conditions, )?; match their_turn_result { - CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Timedout { my_reward_coin_string }) => { + CoinSpentInformation::Expected(ph, amt, moved) => { + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + // An expected their spend arrived. We can do our next action. + match moved { + TheirTurnCoinSpentResult::Timedout { .. } => { + todo!(); + } + TheirTurnCoinSpentResult::Moved { new_coin_string, readable } => { + debug!("setting new coin to {new_coin_string:?}"); + let game_id = old_definition.game_id.clone(); + let (env, system_interface) = penv.env(); + game_map.insert(new_coin_string, OnChainGameState { + puzzle_hash: ph, + our_turn: true, + .. old_definition + }); + system_interface.opponent_moved( + &mut env.allocator, + &game_id, + readable, + )?; + } + TheirTurnCoinSpentResult::Slash(_) => { + todo!(); + } + } + unblock_queue = true; + } + } + CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Timedout { /*my_reward_coin_string*/ .. }) => { todo!(); } - CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable }) => { + CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { /*new_coin_string, readable*/ .. }) => { todo!(); } - CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Slash(outcome)) => { + CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Slash(_outcome)) => { todo!(); } CoinSpentInformation::OurReward(_, _) => { @@ -2432,7 +2461,7 @@ impl { Some(ConditionWaitKind::Unroll(unroll_id.clone())) } - HandshakeState::OnChain(game_map) => { + HandshakeState::OnChain(_game_map) => { Some(ConditionWaitKind::Game) } _ => None, diff --git a/src/referee.rs b/src/referee.rs index 50782e1b..2fac3f3a 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -22,7 +22,7 @@ use crate::channel_handler::types::{ }; use crate::common::constants::CREATE_COIN; use crate::common::standard_coin::{ - calculate_hash_of_quoted_mod_hash, curry_and_treehash, puzzle_for_pk, + calculate_hash_of_quoted_mod_hash, curry_and_treehash, standard_solution_partial, standard_solution_unsafe, ChiaIdentity, }; use crate::common::types::{ @@ -89,7 +89,7 @@ pub enum TheirTurnCoinSpentResult { Moved { // New iteration of the game coin. new_coin_string: CoinString, - readable: NodePtr, + readable: ReadableMove, }, Slash(Box), } @@ -552,43 +552,6 @@ pub struct StoredGameState { state_number: usize, } -// validation programs get passed this: -// ((last_move next_validation_hash my_share me_hash my_puzzle_hash opponent_puzzle_hash -// amount timeout max_move_size referee_hash) -// state me mover_puzzle solution evidence) -// -// 'args' of referee was -// (previous_state previous_validation_program mover_puzzle solution evidence) -// -// and -// -// previous_validation_program_hash = (shatree previous_validation_program) -// -// we apply -// (a previous_validation_program (c previous_validation_program_hash all_args)) -// -// So the arguments to the validation program should match. -fn curried_args_for_validator( - allocator: &mut AllocEncoder, - referee_puzzle_hash: &PuzzleHash, - referee_args: &RefereePuzzleArgs, - validator_args: &ValidatorMoveArgs, -) -> Result, Error> { - let referee_args_node = referee_args.to_node_list( - allocator, - referee_puzzle_hash - )?; - todo!(); - // let previous_validation_program_hash = referee_args.game_move.validation_program -} - // clvm_curried_args!( - // state, - // Node(validation_program.to_nodeptr()), - // my_inner_puzzle, - // slash_spend_solution, - // 0 - // ) - // XXX break out state so we can have a previous state and easily swap them. // Referee coin has two inner puzzles. // Throughout channel handler, the one that's ours is the standard format puzzle @@ -734,12 +697,17 @@ impl RefereeMaker { ); } - for old_state in self.old_states.iter().skip(1).rev() { + for (i, old_state) in self.old_states.iter().enumerate().skip(1).rev() { let have_puzzle_hash = curry_referee_puzzle_hash( allocator, &self.fixed.referee_coin_puzzle_hash, &old_state.state.args_for_this_coin(), )?; + let after_puzzle_hash = curry_referee_puzzle_hash( + allocator, + &self.fixed.referee_coin_puzzle_hash, + &old_state.state.spend_this_coin(), + )?; debug!( "referee rewind: {} my turn {} try state {have_puzzle_hash:?} want {puzzle_hash:?}", old_state.state.is_my_turn(), @@ -1397,6 +1365,7 @@ impl RefereeMaker { allocator: &mut AllocEncoder, details: &GameMoveDetails, state_number: usize, + really_update: bool, ) -> Result { debug!("do their turn {details:?}"); @@ -1433,14 +1402,16 @@ impl RefereeMaker { let (readable_move, message) = match &result { TheirTurnResult::FinalMove(readable_move) => { - self.accept_their_move( - allocator, - None, - args.clone(), - puzzle_args.clone(), - details, - state_number, - )?; + if really_update { + self.accept_their_move( + allocator, + None, + args.clone(), + puzzle_args.clone(), + details, + state_number, + )?; + } (readable_move.clone(), vec![]) } @@ -1457,14 +1428,16 @@ impl RefereeMaker { // In case this succeeds, we'll direct the result to our mover // puzzle, which sets our identity for the game and is a value- // holding coin spendable by us. - self.accept_their_move( - allocator, - Some(handler.clone()), - args.clone(), - puzzle_args.clone(), - details, - state_number, - )?; + if really_update { + self.accept_their_move( + allocator, + Some(handler.clone()), + args.clone(), + puzzle_args.clone(), + details, + state_number, + )?; + } debug!( "readable_move {}", @@ -1642,32 +1615,25 @@ impl RefereeMaker { &self, allocator: &mut AllocEncoder, coin_string: &CoinString, - details: &GameMoveDetails, - state_number: usize, + _state_number: usize, ) -> Result, Error> { - let args = self.spend_this_coin(); - let puzzle_args = Rc::new(RefereePuzzleArgs::new( - &self.fixed, - &details.basic, - Some(&args.game_move.validation_info_hash), - &details.validation_info_hash, - None, - false, - )); + let puzzle_args = self.spend_this_coin(); let new_puzzle = curry_referee_puzzle( allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, &puzzle_args, )?; + debug!("prior move was {:?}", self.args_for_this_coin().game_move.basic); + debug!("move from previous turn is {:?}", puzzle_args.game_move.basic); + assert_ne!(self.args_for_this_coin().game_move, puzzle_args.game_move); let new_puzzle_hash = curry_referee_puzzle_hash( allocator, &self.fixed.referee_coin_puzzle_hash, &puzzle_args, )?; - let game_handler = self.get_game_handler(); - let referee_args = self.args_for_this_coin(); + let _game_handler = self.get_game_handler(); let nil = allocator.allocator().null(); let validator_args = ValidatorMoveArgs { evidence: nil, @@ -1684,12 +1650,6 @@ impl RefereeMaker { // my_inner_solution maker is just in charge of making aggsigs from // conditions. - let slash_conditions = self.make_slash_conditions(allocator)?; - let slash_spend = self.make_slash_spend(allocator)?; - - let slash_spend_solution: &Program = slash_spend.solution.borrow(); - let referee_args = self.args_for_this_coin(); - let full_slash_result = self.run_validator_for_their_move( allocator, &validator_args, @@ -1710,6 +1670,7 @@ impl RefereeMaker { // below, having been created for the reward coin by using // the standard solution signer. let full_slash_solution = self.make_full_slash_solution(allocator)?; + let slash_spend = self.make_slash_spend(allocator)?; self.make_slash_for_their_turn( allocator, coin_string, @@ -1732,9 +1693,12 @@ impl RefereeMaker { coin_string: &CoinString, conditions: &[CoinCondition], state_number: usize, + expected: bool, ) -> Result { assert!(!self.is_my_turn()); debug!("rems in spend {conditions:?}"); + debug!("current state {:?}", self.state); + assert_ne!(self.args_for_this_coin().game_move, self.spend_this_coin().game_move); // Read parameters off conditions let rem_condition = if let Some(CoinCondition::Rem(rem_condition)) = @@ -1775,8 +1739,6 @@ impl RefereeMaker { )); } - let my_inner_puzzle = puzzle_for_pk(allocator, &self.fixed.my_identity.public_key)?; - let new_move = &rem_condition[0]; let validation_info_hash = Hash::from_slice(&rem_condition[1]); let (new_mover_share, new_max_move_size) = if let (Some(share), Some(max_size)) = ( @@ -1799,10 +1761,16 @@ impl RefereeMaker { validation_info_hash, }; + assert_ne!(details, self.args_for_this_coin().game_move); + if !expected { + assert_ne!(details, self.spend_this_coin().game_move); + assert_ne!(self.args_for_this_coin().game_move, self.spend_this_coin().game_move); + } let result = self.their_turn_move_off_chain( allocator, &details, state_number, + !expected, )?; let args = self.spend_this_coin(); @@ -1819,11 +1787,10 @@ impl RefereeMaker { &args )?; - let mut check_and_report_slash = |readable_move: NodePtr| { + let mut check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr| { if let Some(result) = self.check_their_turn_for_slash( allocator, coin_string, - &details, state_number)? { Ok(result) @@ -1834,10 +1801,22 @@ impl RefereeMaker { &new_puzzle_hash, &self.fixed.amount, ), - readable: readable_move, + readable: ReadableMove::from_nodeptr(allocator, readable_move)?, }) } }; + + let dont_enforce = |allocator: &mut AllocEncoder, readable_move: NodePtr| { + Ok(TheirTurnCoinSpentResult::Moved { + new_coin_string: CoinString::from_parts( + &coin_string.to_coin_id(), + &new_puzzle_hash, + &self.fixed.amount, + ), + readable: ReadableMove::from_nodeptr(allocator, readable_move)?, + }) + }; + debug!("referee move details {details:?}"); match result.original { TheirTurnResult::Slash(evidence, sig) => { @@ -1854,12 +1833,19 @@ impl RefereeMaker { ); } TheirTurnResult::FinalMove(readable_move) => { - check_and_report_slash(readable_move) + if expected { + dont_enforce(allocator, readable_move) + } else { + check_and_report_slash(allocator, readable_move) + } } TheirTurnResult::MakeMove(readable_move, _, _) => { - check_and_report_slash(readable_move) + if expected { + dont_enforce(allocator, readable_move) + } else { + check_and_report_slash(allocator, readable_move) + } } } - } } diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 664bd668..27a961b6 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -239,6 +239,7 @@ fn test_referee_smoke() { validation_info_hash: my_move_wire_data.details.validation_info_hash.clone(), }, 0, + true, ); debug!("their move result {their_move_result:?}"); if let Err(Error::StrErr(s)) = their_move_result { @@ -250,13 +251,12 @@ fn test_referee_smoke() { let their_move_local_update = reftest .their_referee - .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0) + .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0, true) .expect("should move"); debug!("their_move_wire_data {their_move_local_update:?}"); let state_node = state.to_nodeptr(&mut allocator).expect("should cvt"); - let nil = allocator.allocator().null(); let validator_move_args = ValidatorMoveArgs { state: state_node, evidence: allocator.allocator().null(), @@ -278,7 +278,7 @@ fn test_referee_smoke() { assert!(reftest.my_referee.processing_my_turn()); let their_move_result = reftest .my_referee - .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0) + .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0, true) .expect("should run"); assert_eq!(their_move_result.message, b"message data"); assert_eq!( From 0e4069a3a8e71fccd7ada671b11d301d631e363c Mon Sep 17 00:00:00 2001 From: arty Date: Tue, 10 Dec 2024 06:44:00 -0800 Subject: [PATCH 04/50] 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 --- clsp/calpoker_include_calpoker_factory.hex | 2 +- ...calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- ...alpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/calpoker/a.hex | 2 +- clsp/onchain/calpoker/b.hex | 2 +- clsp/onchain/calpoker/c.clsp | 11 +- clsp/onchain/calpoker/c.hex | 2 +- clsp/onchain/referee.clsp | 13 +- clsp/onchain/referee.hex | 2 +- src/channel_handler/game.rs | 4 +- src/channel_handler/game_handler.rs | 79 ++++---- src/channel_handler/mod.rs | 133 +++++++++----- src/channel_handler/types.rs | 44 ++--- src/common/types.rs | 2 +- src/potato_handler.rs | 169 ++++++++++++------ src/referee.rs | 138 +++++++++----- src/tests/channel_handler.rs | 5 +- src/tests/game_handler.rs | 12 +- src/tests/peer/potato_handler_sim.rs | 12 +- src/tests/referee.rs | 22 ++- 21 files changed, 400 insertions(+), 260 deletions(-) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index e11992c4..5ab302a9 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa08ee3c8d95323bc3569cfc60c89e41aa8ba8d9b3f4db0fb71673f37e0969bf09cff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff5bffff01808080ffff04ffff09ff5bffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa01144de5f9457246d94b2d136879e3058006d6d5aeea03967db81b2035905df45ff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 832f09c6..69b8350c 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a006cfbfa8bee142a2aa934d374f6d4f73c6a44284355cb2a0dea75569cb08bd36 \ No newline at end of file +a00b396420532320ca14c939388f45e582e46a73f4e15af03410df31758c38378b \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index ace200d2..5102d6ab 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa08ee3c8d95323bc3569cfc60c89e41aa8ba8d9b3f4db0fb71673f37e0969bf09cff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa08ee3c8d95323bc3569cfc60c89e41aa8ba8d9b3f4db0fb71673f37e0969bf09cff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa01144de5f9457246d94b2d136879e3058006d6d5aeea03967db81b2035905df45ff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff5bffff01808080ffff04ffff09ff5bffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa01144de5f9457246d94b2d136879e3058006d6d5aeea03967db81b2035905df45ff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index 7ba2591b..d7ea2a86 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a0c42a3d098c1789f9eaa2315e98931480870f0a6a84127544a62b85a6c2d078e8 \ No newline at end of file +a07c47f8ffca21f2a2a5b01439b721a87c86484a948ef451a020de3e92ede3e942 \ No newline at end of file diff --git a/clsp/onchain/calpoker/a.hex b/clsp/onchain/calpoker/a.hex index e6d63842..744f695d 100644 --- a/clsp/onchain/calpoker/a.hex +++ b/clsp/onchain/calpoker/a.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a03bc53ab9e7c5fe7e6a58f7b3104bd46252b94eb6f07ed2d766be431815cde784ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/b.hex b/clsp/onchain/calpoker/b.hex index 9b334b59..aeea7d15 100644 --- a/clsp/onchain/calpoker/b.hex +++ b/clsp/onchain/calpoker/b.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a048c906a18d9856a2c5587d47a54e5a5ade958390da21d185ec265542d2f6f09affff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.clsp b/clsp/onchain/calpoker/c.clsp index 94172e4a..8efbdd86 100644 --- a/clsp/onchain/calpoker/c.clsp +++ b/clsp/onchain/calpoker/c.clsp @@ -17,13 +17,14 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (alice_commit bob_seed) me mover_puzzle solution evidence)) (if_any_fail - (print (list "poker c" move "all args" all_args) (= (strlen move) 48)) - (= (sha256 (substr move 0 16)) alice_commit) - (= new_validation_hash (sha256 dhash (shatree (list (make_cards - (sha256 (substr move 0 16) bob_seed amount)) (substr move 16 48))))) - (= max_move_size 1) + (print (list "poker c" move "all args" move (strlen move)) (= (strlen move) 48)) + (print (list "check hash of move 0..16" (substr move 0 16) alice_commit) (= (sha256 (substr move 0 16)) alice_commit)) + (print (list "check new validation hash" new_validation_hash) (= new_validation_hash (sha256 dhash (shatree (list (make_cards + (sha256 (substr move 0 16) bob_seed amount)) (substr move 16 48)))))) + (print (list "check max move size" max_move_size) (= max_move_size 1)) 0 (x) ) ) +o \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.hex b/clsp/onchain/calpoker/c.hex index fc2aa0de..dfec19c4 100644 --- a/clsp/onchain/calpoker/c.hex +++ b/clsp/onchain/calpoker/c.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff03ffff018080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff5bffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff5bffff01808080ffff04ffff09ff5bffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index 8e7b1308..98041d45 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -8,6 +8,7 @@ (import std.condition_codes) (import std.match) (import std.li) +(import std.print) (import onchain.game_codes) ; Adjudicates a two player turn based game @@ -61,19 +62,19 @@ VALIDATION_INFO_HASH))) conditions (a mover_puzzle solution) (assert - VALIDATION_INFO_HASH - (<= (strlen MOVE) MAX_MOVE_SIZE) + (print (list "referee data" all_args) VALIDATION_INFO_HASH) + (print (list "strlen" MOVE MAX_MOVE_SIZE) (<= (strlen MOVE) MAX_MOVE_SIZE)) (<= new_mover_share AMOUNT) (>= new_mover_share 0) - (logior (not new_validation_info_hash) (= 32 (strlen new_validation_info_hash))) - (= MOVER_PUZZLE_HASH (shatree mover_puzzle)) + (print (list "logior test" (logior (not new_validation_info_hash))) (= 32 (strlen new_validation_info_hash))) + (print (list "matching mover puzzle hash" MOVER_PUZZLE_HASH (shatree mover_puzzle)) (= MOVER_PUZZLE_HASH (shatree mover_puzzle))) ; Check that the child output is made - (match + (print "matching output" (match (lambda ((& new_puzzle_hash AMOUNT) (condname arg1 arg2)) (logand (= condname CREATE_COIN) (= arg1 new_puzzle_hash) (= arg2 AMOUNT)) ) conditions - ) + )) (li (list REMARK new_move new_validation_info_hash new_mover_share new_max_move_size) (list ASSERT_BEFORE_HEIGHT_RELATIVE TIMEOUT) &rest conditions) ) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index e807b846..a7446a4d 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff2cffff04ff02ffff04ffff05ff0580ffff04ffff02ff18ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ffff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff2cffff04ff02ffff04ff05ffff04ffff02ff18ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff3cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff2bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8200b5ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff55ffff04ff0bff098080ffff04ffff02ff8200b5ff82017580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff14ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0dff820bf180ff8217f18080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ffff01ff02ffff01ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff2bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8200b5ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff55ffff04ff0bff098080ffff04ffff02ff8200b5ff82017580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018c726566657265652064617461ffff04ff09ff808080ffff04ff822ff1ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff01867374726c656effff04ff820bf1ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff820bf180ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018b6c6f67696f722074657374ffff04ffff19ffff20ff558080ffff01808080ffff04ffff09ffff0120ffff0dff558080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019a6d61746368696e67206d6f7665722070757a7a6c652068617368ffff04ff21ffff04ffff02ff12ffff04ff02ffff04ff8202f5ff80808080ffff0180808080ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018f6d61746368696e67206f7574707574ffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file diff --git a/src/channel_handler/game.rs b/src/channel_handler/game.rs index 47d8c1f6..23e37fe0 100644 --- a/src/channel_handler/game.rs +++ b/src/channel_handler/game.rs @@ -58,8 +58,8 @@ impl Game { )); } - let initial_mover_handler = GameHandler::my_driver_from_nodeptr(template_list[0]); - let initial_waiter_handler = GameHandler::their_driver_from_nodeptr(template_list[1]); + let initial_mover_handler = GameHandler::my_driver_from_nodeptr(allocator, template_list[0])?; + let initial_waiter_handler = GameHandler::their_driver_from_nodeptr(allocator, template_list[1])?; let whether_paired = atom_from_clvm(allocator, template_list[2]) .map(|a| !a.is_empty()) .expect("should be an atom"); diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index f87f6f5e..763a24a4 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -14,7 +14,7 @@ use clvm_tools_rs::compiler::clvm::{convert_from_clvm_rs, convert_to_clvm_rs, ru use clvm_tools_rs::compiler::comptypes::CompilerOpts; #[cfg(test)] use clvm_tools_rs::compiler::srcloc::Srcloc; -use clvm_traits::{ClvmEncoder, ToClvm}; +use clvm_traits::{ClvmEncoder, ToClvm, ToClvmError}; use clvmr::allocator::NodePtr; use clvmr::run_program; @@ -39,29 +39,21 @@ use crate::referee::{GameMoveDetails, GameMoveStateInfo}; // (MAKE_MOVE moving_driver readable_info message) or // (SLASH evidence aggsig) -#[derive(Clone, Debug)] -pub enum GameHandler { - MyTurnHandler(NodePtr), - TheirTurnHandler(NodePtr), -} - #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] -pub struct FlatGameHandler { - pub my_turn: bool, - pub serialized: Program, +pub enum GameHandler { + MyTurnHandler(Program), + TheirTurnHandler(Program), } -impl GameHandler { - pub fn to_serializable(&self, allocator: &mut AllocEncoder) -> Result { - let (my_turn, nodeptr) = match self { - GameHandler::MyTurnHandler(n) => (true, n), - GameHandler::TheirTurnHandler(n) => (false, n), - }; - - Ok(FlatGameHandler { - my_turn, - serialized: Program::from_nodeptr(allocator, *nodeptr)?, - }) +impl ToClvm for GameHandler { + fn to_clvm( + &self, + encoder: &mut impl ClvmEncoder, + ) -> Result { + match self { + GameHandler::MyTurnHandler(p) => p.to_clvm(encoder), + GameHandler::TheirTurnHandler(p) => p.to_clvm(encoder), + } } } @@ -179,36 +171,38 @@ pub enum TheirTurnResult { } impl GameHandler { - pub fn their_driver_from_nodeptr(n: NodePtr) -> GameHandler { - GameHandler::TheirTurnHandler(n) + pub fn their_driver_from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { + Ok(GameHandler::TheirTurnHandler(Program::from_nodeptr(allocator, n)?)) } - pub fn my_driver_from_nodeptr(n: NodePtr) -> GameHandler { - GameHandler::MyTurnHandler(n) + pub fn my_driver_from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { + Ok(GameHandler::MyTurnHandler(Program::from_nodeptr(allocator, n)?)) } - pub fn to_nodeptr(&self) -> NodePtr { + pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { match self { - GameHandler::MyTurnHandler(n) => *n, - GameHandler::TheirTurnHandler(n) => *n, + GameHandler::MyTurnHandler(n) => n.to_nodeptr(allocator), + GameHandler::TheirTurnHandler(n) => n.to_nodeptr(allocator), } } pub fn is_my_turn(&self) -> bool { matches!(self, GameHandler::MyTurnHandler(_)) } - pub fn get_my_turn_driver(&self) -> Result { + pub fn get_my_turn_driver(&self, allocator: &mut AllocEncoder) -> Result { if let GameHandler::MyTurnHandler(res) = self { - Ok(*res) + res.to_nodeptr(allocator) } else { + todo!(); Err(Error::StrErr( "my turn called on a their turn driver".to_string(), )) } } - pub fn get_their_turn_driver(&self) -> Result { + pub fn get_their_turn_driver(&self, allocator: &mut AllocEncoder) -> Result { if let GameHandler::TheirTurnHandler(res) = self { - Ok(*res) + res.to_nodeptr(allocator) } else { + todo!(); Err(Error::StrErr( "my turn called on a their turn driver".to_string(), )) @@ -238,9 +232,10 @@ impl GameHandler { disassemble(allocator.allocator(), driver_args, None) ); + let driver_node = self.get_my_turn_driver(allocator)?; let run_result = run_code( allocator, - self.get_my_turn_driver()?, + driver_node, driver_args, get_my_turn_debug_flag(inputs), )?; @@ -283,7 +278,7 @@ impl GameHandler { let message_parser = if pl[7] == allocator.allocator().null() { None } else { - Some(MessageHandler::from_nodeptr(pl[7])) + Some(MessageHandler::from_nodeptr(allocator, pl[7])?) }; let validation_program_hash = if let Some(h) = atom_from_clvm(allocator, pl[2]).map(Hash::from_slice) { @@ -300,7 +295,7 @@ impl GameHandler { let validation_program = ValidationProgram::new(allocator, pl[1]); let state = Rc::new(Program::from_nodeptr(allocator, pl[3])?); Ok(MyTurnResult { - waiting_driver: GameHandler::their_driver_from_nodeptr(pl[6]), + waiting_driver: GameHandler::their_driver_from_nodeptr(allocator, pl[6])?, validation_program, validation_program_hash: validation_program_hash.clone(), state, @@ -350,9 +345,10 @@ impl GameHandler { .to_clvm(allocator) .into_gen()?; + let driver_node = self.get_their_turn_driver(allocator)?; let run_result = run_code( allocator, - self.get_their_turn_driver()?, + driver_node, driver_args, get_their_turn_debug_flag(inputs), )?; @@ -398,7 +394,7 @@ impl GameHandler { }; Ok(TheirTurnResult::MakeMove( pl[1], - GameHandler::my_driver_from_nodeptr(pl[2]), + GameHandler::my_driver_from_nodeptr(allocator, pl[2])?, message_data, )) } @@ -429,11 +425,11 @@ pub struct MessageInputs { } #[derive(Clone, Debug)] -pub struct MessageHandler(pub NodePtr); +pub struct MessageHandler(pub Program); impl MessageHandler { - pub fn from_nodeptr(n: NodePtr) -> Self { - MessageHandler(n) + pub fn from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { + Ok(MessageHandler(Program::from_nodeptr(allocator, n)?)) } pub fn run( &self, @@ -451,7 +447,8 @@ impl MessageHandler { "running message handler on args {}", disassemble(allocator.allocator(), args, None) ); - let run_result = run_code(allocator, self.0, args, false)?; + let run_prog = self.0.to_nodeptr(allocator)?; + let run_result = run_code(allocator, run_prog, args, false)?; ReadableMove::from_nodeptr(allocator, run_result) } diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index bca18040..bb1808fc 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -789,6 +789,8 @@ impl ChannelHandler { self.current_state_number ); let game_idx = self.get_game_by_id(game_id)?; + let match_puzzle_hash = self.live_games[game_idx].current_puzzle_hash(env.allocator)?; + let referee_result = self.live_games[game_idx].internal_make_move( env.allocator, readable_move, @@ -811,6 +813,7 @@ impl ChannelHandler { CachedPotatoRegenerateLastHop::PotatoMoveHappening(PotatoMoveCachedData { state_number: self.current_state_number, game_id: game_id.clone(), + match_puzzle_hash, puzzle_hash, move_data: readable_move.clone(), move_entropy: new_entropy, @@ -1418,7 +1421,7 @@ impl ChannelHandler { OnChainGameState { game_id: live_game.game_id.clone(), puzzle_hash: game_coin.clone(), - our_turn: live_game.processing_my_turn(), + our_turn: live_game.is_my_turn(), }, ); } @@ -1430,6 +1433,16 @@ impl ChannelHandler { Ok(res) } + pub fn game_is_my_turn(&self, game_id: &GameID) -> Option { + for g in self.live_games.iter() { + if g.game_id == *game_id { + return Some(g.is_my_turn()); + } + } + + None + } + pub fn on_chain_our_move( &mut self, env: &mut ChannelHandlerEnv, @@ -1454,10 +1467,22 @@ impl ChannelHandler { existing_coin ); let game_idx = self.get_game_by_id(game_id)?; + + let last_puzzle_hash = self.live_games[game_idx].last_puzzle_hash(); let start_puzzle_hash = self.live_games[game_idx].current_puzzle_hash(env.allocator)?; - if let Some((_, existing_ph, _)) = existing_coin.to_parts() { - assert_eq!(start_puzzle_hash, existing_ph); - } + let end_puzzle_hash = self.live_games[game_idx].outcome_puzzle_hash(env.allocator)?; + let existing_ph = + if let Some((_, existing_ph, _)) = existing_coin.to_parts() { + existing_ph + } else { + return Err(Error::StrErr("broken coin".to_string())); + }; + + assert_eq!(last_puzzle_hash, existing_ph); + + debug!("last puzzle hash {last_puzzle_hash:?}"); + debug!("start puzzle hash {start_puzzle_hash:?}"); + debug!("outcome puzzle hash {end_puzzle_hash:?}"); debug!( "on chain our turn {} processing our turn {}", @@ -1465,6 +1490,7 @@ impl ChannelHandler { self.live_games[game_idx].processing_my_turn() ); + // assert_eq!(self.game_is_my_turn(game_id), Some(true)); let move_result = self.live_games[game_idx].internal_make_move( env.allocator, readable_move, @@ -1484,13 +1510,34 @@ impl ChannelHandler { )?; Ok(( - start_puzzle_hash, + last_puzzle_hash, self.live_games[game_idx].last_referee_puzzle_hash.clone(), move_result.details.clone(), tx, )) } + pub fn is_our_spend( + &self, + env: &mut ChannelHandlerEnv, + game_id: &GameID, + coin_string: &CoinString, + ) -> Result { + let live_game_idx = self.get_game_by_id(game_id)?; + let game_puzzle_hash = self.live_games[live_game_idx].outcome_puzzle_hash(env.allocator)?; + let prev_puzzle_hash = self.live_games[live_game_idx].current_puzzle_hash(env.allocator)?; + let last_puzzle_hash = self.live_games[live_game_idx].last_puzzle_hash(); + if !self.live_games[live_game_idx].processing_my_turn() { + return Ok(false); + } + + if let Some((_, ph, _)) = coin_string.to_parts() { + return Ok(prev_puzzle_hash == ph); + } + + Ok(false) + } + pub fn game_coin_spent( &mut self, env: &mut ChannelHandlerEnv, @@ -1498,52 +1545,37 @@ impl ChannelHandler { coin_string: &CoinString, conditions: &[CoinCondition] ) -> Result { + debug!( + "{} GAME COIN SPENT {:?} {:?} {:?}", + self.is_initial_potato(), + coin_string, + conditions, + self.game_is_my_turn(game_id) + ); + let live_game_idx = self.get_game_by_id(game_id)?; let referee_pk = private_to_public_key(&self.referee_private_key()); - let reward_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; let game_puzzle_hash = self.live_games[live_game_idx].outcome_puzzle_hash(env.allocator)?; let prev_puzzle_hash = self.live_games[live_game_idx].current_puzzle_hash(env.allocator)?; + let last_puzzle_hash = self.live_games[live_game_idx].last_puzzle_hash(); + let reward_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; - if !self.live_games[live_game_idx].processing_my_turn() { - // Try to determine if the spend was us. - let expected_creation = - conditions.iter().filter_map(|c| { - if let CoinCondition::CreateCoin(ph, amt) = c { - if game_puzzle_hash == *ph { - - return Some(CoinIdentificationByPuzzleHash::Game(ph.clone(), amt.clone())); - } else if reward_puzzle_hash == *ph { - return Some(CoinIdentificationByPuzzleHash::Reward(ph.clone(), amt.clone())); - } - } - None - }).next(); - { - // It was the spend we expected from our own actions to continue the game. - match expected_creation { - Some(CoinIdentificationByPuzzleHash::Reward(ph, amt)) => { - return Ok(CoinSpentInformation::OurReward(ph.clone(), amt.clone())); - } - Some(CoinIdentificationByPuzzleHash::Game(ph, amt)) => { - return Ok(CoinSpentInformation::OurSpend(ph.clone(), amt.clone())); - } - _ => { } + let (ph, amt) = + if let Some((ph, amt)) = conditions.iter().filter_map(|c| { + if let CoinCondition::CreateCoin(ph, amt) = c { + return Some((ph.clone(), amt.clone())); } - } - todo!(); - } + None + }).next() { + (ph, amt) + } else { + return Err(Error::StrErr("bad coin".to_string())); + }; - if let Some((_, ph, _)) = coin_string.to_parts() { - if prev_puzzle_hash == ph { - return Ok(CoinSpentInformation::Expected(game_puzzle_hash.clone(), self.live_games[live_game_idx].get_amount(), self.live_games[live_game_idx].their_turn_coin_spent( - env.allocator, - coin_string, - conditions, - self.current_state_number, - true, - )?)); - } + if reward_puzzle_hash == ph { + debug!("was our turn, reward {ph:?} {amt:?}"); + return Ok(CoinSpentInformation::OurReward(ph.clone(), amt.clone())); } Ok(CoinSpentInformation::TheirSpend(self.live_games[live_game_idx].their_turn_coin_spent( @@ -1567,6 +1599,12 @@ impl ChannelHandler { self.unroll.coin.state_number ); + let new_ph = if let Some((_, ph, _)) = coin.to_parts() { + ph + } else { + return Err(Error::StrErr("malformed coin".to_string())); + }; + // We're on chain due to error. let mut cla = None; swap(&mut cla, &mut self.cached_last_action); @@ -1583,13 +1621,19 @@ impl ChannelHandler { "{} have cached move {move_data:?}", self.is_initial_potato() ); + debug!("redo if move matches puzzle hash {:?}", move_data.match_puzzle_hash); + debug!("redo for coin {coin:?}"); + if let Some(rewind_state) = self.live_games[game_idx].get_rewind_outcome() { // We should have odd parity between the rewind and the current state. debug!("{} getting redo move: move_data.state_number {} rewind_state {rewind_state}", self.is_initial_potato(), move_data.state_number); - if !self.live_games[game_idx].processing_my_turn() { + let rewind_ph = self.live_games[game_idx].current_puzzle_hash(env.allocator)?; + if self.live_games[game_idx].is_my_turn() { + debug!("{} not matched rewind state {new_ph:?} vs {rewind_ph:?}", self.is_initial_potato()); return Ok(None); } + debug!("{} matched rewind state {new_ph:?} vs {rewind_ph:?}", self.is_initial_potato()); let transaction = self.live_games[game_idx].get_transaction_for_move( env.allocator, coin, @@ -1601,6 +1645,7 @@ impl ChannelHandler { return Ok(Some(GameAction::RedoMove( move_data.game_id.clone(), coin.clone(), + self.live_games[game_idx].current_puzzle_hash(env.allocator)?, Box::new(transaction), ))); } diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index fb10aaa9..26fdf773 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -16,7 +16,7 @@ use rand::prelude::*; use serde::{Deserialize, Serialize}; -use crate::channel_handler::game_handler::{FlatGameHandler, GameHandler}; +use crate::channel_handler::game_handler::GameHandler; use crate::common::constants::{CREATE_COIN, REM}; use crate::common::standard_coin::{ private_to_public_key, puzzle_hash_for_pk, read_hex_puzzle, standard_solution_partial, @@ -76,13 +76,12 @@ pub struct PotatoSignatures { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct GenericGameStartInfo< - H: std::fmt::Debug + Clone, VP: std::fmt::Debug + Clone, S: std::fmt::Debug + Clone, > { pub game_id: GameID, pub amount: Amount, - pub game_handler: H, + pub game_handler: GameHandler, pub timeout: Timeout, pub my_contribution_this_game: Amount, @@ -95,8 +94,8 @@ pub struct GenericGameStartInfo< pub initial_mover_share: Amount, } -pub type GameStartInfo = GenericGameStartInfo; -pub type FlatGameStartInfo = GenericGameStartInfo; +pub type GameStartInfo = GenericGameStartInfo; +pub type FlatGameStartInfo = GenericGameStartInfo; pub struct PrintableGameStartInfo<'a> { pub allocator: &'a mut Allocator, @@ -109,9 +108,9 @@ impl<'a> std::fmt::Debug for PrintableGameStartInfo<'a> { writeln!(formatter, "- amount: {:?}", self.info.amount)?; writeln!( formatter, - "- game_handler: {} {}", + "- game_handler: {} {:?}", self.info.game_handler.is_my_turn(), - disassemble(self.allocator, self.info.game_handler.to_nodeptr(), None) + self.info.game_handler, )?; writeln!(formatter, "- timeout: {:?}", self.info.timeout)?; writeln!( @@ -154,7 +153,7 @@ impl<'a> std::fmt::Debug for PrintableGameStartInfo<'a> { } } -impl GenericGameStartInfo { +impl GenericGameStartInfo { pub fn is_my_turn(&self) -> bool { matches!(self.game_handler, GameHandler::MyTurnHandler(_)) } @@ -163,16 +162,7 @@ impl GenericGameStartInfo { allocator: &mut AllocEncoder, serializable: &FlatGameStartInfo, ) -> Result { - let game_handler_nodeptr = node_from_bytes( - allocator.allocator(), - &serializable.game_handler.serialized.0, - ) - .into_gen()?; - let game_handler = if serializable.game_handler.my_turn { - GameHandler::MyTurnHandler(game_handler_nodeptr) - } else { - GameHandler::TheirTurnHandler(game_handler_nodeptr) - }; + let game_handler = serializable.game_handler.clone(); let initial_validation_program_nodeptr = node_from_bytes( allocator.allocator(), &serializable.initial_validation_program.0, @@ -201,7 +191,6 @@ impl GenericGameStartInfo { &self, allocator: &mut AllocEncoder, ) -> Result { - let flat_game_handler = self.game_handler.to_serializable(allocator)?; let flat_validation_program = Program::from_nodeptr(allocator, self.initial_validation_program.to_nodeptr())?; let flat_state = Program::from_nodeptr(allocator, self.initial_state)?; @@ -209,7 +198,7 @@ impl GenericGameStartInfo { Ok(GenericGameStartInfo { game_id: self.game_id.clone(), amount: self.amount.clone(), - game_handler: flat_game_handler, + game_handler: self.game_handler.clone(), timeout: self.timeout.clone(), my_contribution_this_game: self.my_contribution_this_game.clone(), their_contribution_this_game: self.their_contribution_this_game.clone(), @@ -243,9 +232,9 @@ impl GenericGameStartInfo { let returned_game_id = GameID::from_clvm(allocator, lst[0])?; let returned_amount = Amount::from_clvm(allocator, lst[1])?; let returned_handler = if my_turn { - GameHandler::MyTurnHandler(lst[2]) + GameHandler::MyTurnHandler(Program::from_nodeptr(allocator, lst[2])?) } else { - GameHandler::TheirTurnHandler(lst[2]) + GameHandler::TheirTurnHandler(Program::from_nodeptr(allocator, lst[2])?) }; let returned_timeout = Timeout::from_clvm(allocator, lst[3])?; let returned_my_contribution = Amount::from_clvm(allocator, lst[4])?; @@ -428,6 +417,7 @@ pub struct PotatoMoveCachedData { pub state_number: usize, pub game_id: GameID, pub puzzle_hash: PuzzleHash, + pub match_puzzle_hash: PuzzleHash, pub move_data: ReadableMove, pub move_entropy: Hash, pub amount: Amount, @@ -1066,7 +1056,7 @@ impl LiveGame { agg_sig_me: &Hash, on_chain: bool, ) -> Result { - assert!(self.referee_maker.processing_my_turn()); + // assert!(self.referee_maker.processing_my_turn()); self.referee_maker .get_transaction_for_move(allocator, game_coin, agg_sig_me, on_chain) } @@ -1087,7 +1077,7 @@ impl LiveGame { current_state: usize, expected: bool, ) -> Result { - assert!(self.referee_maker.processing_my_turn()); + // assert!(self.referee_maker.processing_my_turn()); let res = self.referee_maker .their_turn_coin_spent(allocator, coin_string, conditions, current_state, expected)?; self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; @@ -1105,7 +1095,7 @@ impl LiveGame { let referee_puzzle_hash = self.referee_maker.on_chain_referee_puzzle_hash(allocator)?; debug!("live game: current state is {referee_puzzle_hash:?} want {want_ph:?}"); - let result = self.referee_maker.rewind(allocator, want_ph)?; + let result = self.referee_maker.rewind(allocator, want_ph, current_state)?; if let Some(current_state) = &result { self.rewind_outcome = Some(*current_state); self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; @@ -1124,13 +1114,15 @@ impl LiveGame { /// Identifies the game phase that an on chain spend represented. /// If their turn, gives a referee TheirTurnCoinSpentResult, otherwise gives the new coin. +#[derive(Debug)] pub enum CoinSpentInformation { OurReward(PuzzleHash, Amount), OurSpend(PuzzleHash, Amount), TheirSpend(TheirTurnCoinSpentResult), - Expected(PuzzleHash, Amount, TheirTurnCoinSpentResult), + Expected(PuzzleHash, Amount), } +#[derive(Debug)] pub enum CoinIdentificationByPuzzleHash { Reward(PuzzleHash, Amount), Game(PuzzleHash, Amount), diff --git a/src/common/types.rs b/src/common/types.rs index d7d178ee..01f61407 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -541,7 +541,7 @@ impl<'a> Sha256Input<'a> { } /// Puzzle hash -#[derive(Default, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] +#[derive(Default, Clone, Eq, PartialEq, Debug, Serialize, Deserialize, Hash)] pub struct PuzzleHash(Hash); impl PuzzleHash { diff --git a/src/potato_handler.rs b/src/potato_handler.rs index c008131b..05baad3e 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, HashMap, VecDeque}; +use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::mem::swap; use std::rc::Rc; @@ -422,7 +422,7 @@ enum PotatoState { #[derive(Debug)] pub enum GameAction { Move(GameID, ReadableMove, Hash), - RedoMove(GameID, CoinString, Box), + RedoMove(GameID, CoinString, PuzzleHash, Box), Accept(GameID), Shutdown(NodePtr), } @@ -500,6 +500,8 @@ pub struct PotatoHandler { channel_timeout: Timeout, // Unroll timeout unroll_timeout: Timeout, + + my_game_spends: HashSet, } fn init_game_id(private_keys: &ChannelHandlerPrivateKeys) -> Vec { @@ -567,6 +569,7 @@ impl PotatoHandler { channel_timeout: phi.channel_timeout, unroll_timeout: phi.unroll_timeout, reward_puzzle_hash: phi.reward_puzzle_hash, + my_game_spends: HashSet::default(), } } @@ -963,7 +966,7 @@ impl PotatoHandler { Ok(true) } - Some(GameAction::RedoMove(_game_id, _coin, _transaction)) => { + Some(GameAction::RedoMove(_game_id, _coin, _new_ph, _transaction)) => { todo!(); } Some(GameAction::Accept(game_id)) => { @@ -1584,11 +1587,6 @@ impl PotatoHandler { // Channel coin was spent so we're going on chain. assert!(!matches!(self.handshake_state, HandshakeState::StepA)); let player_ch = self.channel_handler()?; - debug!( - "{} check unroll spent {coin_id:?} in state {:?}", - player_ch.is_initial_potato(), - self.handshake_state - ); let is_unroll_coin = match &self.handshake_state { HandshakeState::OnChainWaitingForUnrollSpend(unroll_coin) => coin_id == unroll_coin, HandshakeState::OnChainWaitingForUnrollTimeoutOrSpend(unroll_coin, _) => { @@ -1790,11 +1788,22 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { + let initial_potato = + { + let player_ch = self.channel_handler()?; + player_ch.is_initial_potato() + }; + let (game_id, readable_move, hash, current) = if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { match action { GameAction::Move(game_id, readable_move, hash) => { + { + let (env, _) = penv.env(); + let readable_node = readable_move.to_nodeptr(env.allocator)?; + debug!("{initial_potato} doing a move {}\n", disassemble(env.allocator.allocator(), readable_node, None)); + } if let Some((current, _game)) = game_map.iter().find(|g| g.1.game_id == game_id) { ( @@ -1807,7 +1816,13 @@ impl PotatoHandler { return Err(Error::StrErr("no matching game".to_string())); } } - GameAction::RedoMove(_game_id, coin, tx) => { + GameAction::RedoMove(_game_id, coin, new_ph, tx) => { + // Remember that we spent this one. + { + let player_ch = self.channel_handler()?; + debug!("{} created puzzle hash for redo {new_ph:?}", player_ch.is_initial_potato()); + self.my_game_spends.insert(new_ph); + } let (_env, system_interface) = penv.env(); system_interface.spend_transaction_and_add_fee(&SpendBundle { spends: vec![CoinSpend { @@ -1823,16 +1838,19 @@ impl PotatoHandler { return Err(Error::StrErr("not on chain".to_string())); }; - let (old_ph, move_result, transaction) = { + let (old_ph, new_ph, move_result, transaction) = { let (env, _system_interface) = penv.env(); let player_ch = self.channel_handler_mut()?; - let (old_ph, _new_ph, move_result, transaction) = - player_ch.on_chain_our_move(env, &game_id, &readable_move, hash, ¤t)?; - (old_ph, move_result, transaction) + player_ch.on_chain_our_move(env, &game_id, &readable_move, hash, ¤t)? }; + debug!("old_ph {old_ph:?}"); + debug!("new_ph {new_ph:?}"); // Assert that our idea of what's being spent matches the coin. if let HandshakeState::OnChain(game_map) = &self.handshake_state { + let coin_keys: Vec<&CoinString> = game_map.keys().collect(); + let player_ch = self.channel_handler()?; + debug!("{} coin keys {coin_keys:?}", player_ch.is_initial_potato()); let matching_keys = game_map .keys() .filter(|k| { @@ -1848,6 +1866,13 @@ impl PotatoHandler { assert_eq!(matching_keys, 1); } + // Remember that we spent this one. + { + let player_ch = self.channel_handler()?; + debug!("{} created puzzle hash for move {new_ph:?}", player_ch.is_initial_potato()); + self.my_game_spends.insert(new_ph); + } + let (env, system_interface) = penv.env(); let solution_nodeptr = transaction.bundle.solution.to_nodeptr(env.allocator)?; debug!( @@ -1973,7 +1998,7 @@ impl PotatoHandler { return Err(Error::StrErr("no conditions for unroll coin".to_string())); }; - let game_map = { + let mut game_map = { let player_ch = self.channel_handler_mut()?; debug!( "{} FINISH ON CHAIN TRANSITION", @@ -2005,6 +2030,12 @@ impl PotatoHandler { let mut actions = Vec::new(); + for (coin, def) in game_map.iter() { + let player_ch = self.channel_handler()?; + debug!("{}: game {:?} our turn {:?}", player_ch.is_initial_potato(), def.game_id, player_ch.game_is_my_turn(&def.game_id)); + assert_eq!(player_ch.game_is_my_turn(&def.game_id), Some(def.our_turn)); + } + // Register each coin that corresponds to a game. for coin in game_map.keys() { let (_env, system_interface) = penv.env(); @@ -2015,12 +2046,14 @@ impl PotatoHandler { )?; } + let mut redo_change = None; for coin in game_map.keys() { let player_ch = self.channel_handler_mut()?; let (env, _system_interface) = penv.env(); if let Some(redo_move) = player_ch.get_redo_action(env, coin)? { debug!("redo move: {redo_move:?}"); actions.push(redo_move); + redo_change = Some(coin.clone()); } } @@ -2084,20 +2117,33 @@ impl PotatoHandler { { let mut unblock_queue = false; + debug!("handle game coin spent {coin_id:?}"); + let old_definition = if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { if let Some(old_definition) = game_map.remove(coin_id) { + debug!("we have game coin {old_definition:?}"); old_definition } else { + debug!("we don't have game coin!"); return Ok(()); } } else { + debug!("game coin spent not on chain!"); return Ok(()); }; + if let Some((_, ph, _)) = coin_id.to_parts() { + let ch = self.channel_handler()?; + debug!("{} our spends are {:?}", ch.is_initial_potato(), self.my_game_spends); + debug!("spent coin was {ph:?}"); + let (env, _) = penv.env(); + assert_eq!(ch.is_our_spend(env, &old_definition.game_id, coin_id)?, self.my_game_spends.contains(&ph)); + } + // A game coin was spent and we have the puzzle and solution. let player_ch = self.channel_handler_mut()?; - let (env, _system_interface) = penv.env(); + let (env, system_interface) = penv.env(); let conditions = CoinCondition::from_puzzle_and_solution( env.allocator, puzzle, @@ -2109,41 +2155,66 @@ impl PotatoHandler { coin_id, &conditions, )?; + debug!("game coin spent: {their_turn_result:?}"); match their_turn_result { - CoinSpentInformation::Expected(ph, amt, moved) => { + CoinSpentInformation::Expected(ph, amt) => { + debug!("{} got an expected spend {ph:?} {amt:?}", player_ch.is_initial_potato()); + let new_coin_id = CoinString::from_parts( + &coin_id.to_coin_id(), + &ph, + &amt + ); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { // An expected their spend arrived. We can do our next action. - match moved { - TheirTurnCoinSpentResult::Timedout { .. } => { - todo!(); - } - TheirTurnCoinSpentResult::Moved { new_coin_string, readable } => { - debug!("setting new coin to {new_coin_string:?}"); - let game_id = old_definition.game_id.clone(); - let (env, system_interface) = penv.env(); - game_map.insert(new_coin_string, OnChainGameState { - puzzle_hash: ph, - our_turn: true, - .. old_definition - }); - system_interface.opponent_moved( - &mut env.allocator, - &game_id, - readable, - )?; - } - TheirTurnCoinSpentResult::Slash(_) => { - todo!(); - } - } - unblock_queue = true; + game_map.insert(new_coin_id.clone(), OnChainGameState { + puzzle_hash: ph, + our_turn: false, + .. old_definition + }); } + + let (_, system_interface) = penv.env(); + system_interface.register_coin( + &new_coin_id, + &self.channel_timeout, + Some("coin gives their turn") + )?; } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Timedout { /*my_reward_coin_string*/ .. }) => { todo!(); } - CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { /*new_coin_string, readable*/ .. }) => { - todo!(); + CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable, .. }) => { + debug!("{} got a their spend {new_coin_string:?} from ph {:?}", player_ch.is_initial_potato(), old_definition.puzzle_hash); + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + let (puzzle_hash, amt) = + if let Some((_, ph, amt)) = new_coin_string.to_parts() { + (ph, amt) + } else { + return Err(Error::StrErr("bad coin explode".to_string())); + }; + + let game_id = old_definition.game_id.clone(); + game_map.insert(new_coin_string.clone(), OnChainGameState { + puzzle_hash, + our_turn: true, + .. old_definition + }); + + system_interface.opponent_moved( + env.allocator, + &game_id, + readable + )?; + system_interface.register_coin( + &new_coin_string, + &self.channel_timeout, + Some("coin gives my turn") + )?; + + unblock_queue = true; + } else { + return Err(Error::StrErr("not on chain".to_string())); + } } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Slash(_outcome)) => { todo!(); @@ -2152,6 +2223,7 @@ impl PotatoHandler { todo!(); } CoinSpentInformation::OurSpend(ph, amt) => { + debug!("{} got an our spend {ph:?} {amt:?}", player_ch.is_initial_potato()); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { game_map.insert(CoinString::from_parts( &coin_id.to_coin_id(), @@ -2446,11 +2518,6 @@ impl { Some(ConditionWaitKind::Channel(state_coin_id.clone())) @@ -2467,16 +2534,8 @@ impl None, }; - debug!( - "{} coin_puzzle_and_solution for {coin_id:?} got {state_coin_id:?}", - player_ch.is_initial_potato() - ); match state_coin_id { Some(ConditionWaitKind::Channel(state_coin_id)) => { - debug!( - "{} channel have {coin_id:?} want {state_coin_id:?}", - player_ch.is_initial_potato() - ); if *coin_id == state_coin_id { return self.handle_channel_coin_spent(penv, coin_id, puzzle_and_solution); } diff --git a/src/referee.rs b/src/referee.rs index 2fac3f3a..cd17f3e0 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -62,6 +62,7 @@ pub struct TheirTurnMoveResult { pub original: TheirTurnResult, } +#[derive(Debug)] pub enum SlashOutcome { NoReward, Reward { @@ -82,6 +83,7 @@ pub struct LiveGameReplay { game_id: GameID, } +#[derive(Debug)] pub enum TheirTurnCoinSpentResult { Timedout { my_reward_coin_string: Option, @@ -669,6 +671,7 @@ impl RefereeMaker { &mut self, allocator: &mut AllocEncoder, puzzle_hash: &PuzzleHash, + state_number: usize, ) -> Result, Error> { debug!("REWIND: find a way to proceed from {puzzle_hash:?}"); for old_state in self.old_states.iter().skip(1).rev() { @@ -703,24 +706,20 @@ impl RefereeMaker { &self.fixed.referee_coin_puzzle_hash, &old_state.state.args_for_this_coin(), )?; - let after_puzzle_hash = curry_referee_puzzle_hash( - allocator, - &self.fixed.referee_coin_puzzle_hash, - &old_state.state.spend_this_coin(), - )?; debug!( "referee rewind: {} my turn {} try state {have_puzzle_hash:?} want {puzzle_hash:?}", old_state.state.is_my_turn(), old_state.state_number ); if *puzzle_hash == have_puzzle_hash && old_state.state.is_my_turn() { - self.state = old_state.state.clone(); - debug!("referee rewind: reassume state {:?}", self.state); + self.state = self.old_states[self.old_states.len() - 1].state.clone(); + debug!("referee rewind my turn: reassume state {:?}", self.state); return Ok(Some(old_state.state_number)); } } debug!("referee rewind: no matching state"); + debug!("still in state {:?}", self.state); Ok(None) } @@ -868,7 +867,7 @@ impl RefereeMaker { g.clone() } else { let nil = allocator.encode_atom(&[]).into_gen()?; - GameHandler::MyTurnHandler(nil) + GameHandler::MyTurnHandler(Program::from_nodeptr(allocator, nil)?) }; let new_state = match self.state.borrow() { @@ -1087,9 +1086,10 @@ impl RefereeMaker { coin_string: &CoinString, puzzle: &Puzzle, always_produce_transaction: bool, + targs: &RefereePuzzleArgs, args: &OnChainRefereeSolution, ) -> Result, Error> { - let my_mover_share = self.get_our_current_share(); + let my_mover_share = targs.game_move.basic.mover_share.clone(); if always_produce_transaction || my_mover_share != Amount::default() { let signature = args.get_signature().unwrap_or_default(); @@ -1099,6 +1099,7 @@ impl RefereeMaker { // // OnChainRefereeSolution encodes this properly. let transaction_solution = args.to_clvm(allocator).into_gen()?; + debug!("transaction solution inputs {args:?}"); debug!( "transaction_solution {}", disassemble(allocator.allocator(), transaction_solution, None) @@ -1137,6 +1138,7 @@ impl RefereeMaker { coin_string, &spend_puzzle, false, + &self.spend_this_coin(), &OnChainRefereeSolution::Timeout, ) } @@ -1176,6 +1178,30 @@ impl RefereeMaker { ) -> Result { // We can only do a move to replicate our turn. assert!(self.processing_my_turn()); + let args = self.spend_this_coin(); + + let state_node = self.get_game_state().to_nodeptr(allocator)?; + let nil = allocator.allocator().null(); + let prog = ValidationProgram::new(allocator, nil); + debug!( + "referee maker: get transaction for move {:?}", + PrintableGameStartInfo { + allocator: allocator.allocator(), + info: &GameStartInfo { + game_handler: self.get_game_handler(), + game_id: GameID::default(), + amount: self.get_amount(), + initial_state: state_node, + initial_max_move_size: args.game_move.basic.max_move_size, + initial_move: args.game_move.basic.move_made.clone(), + initial_mover_share: args.game_move.basic.mover_share.clone(), + my_contribution_this_game: Amount::default(), + their_contribution_this_game: Amount::default(), + initial_validation_program: prog, + timeout: self.fixed.timeout.clone(), + } + } + ); // Get the puzzle hash for the next referee state. // This reflects a "their turn" state with the updated state from the @@ -1204,8 +1230,9 @@ impl RefereeMaker { ); debug!("transaction for move: state {:?}", self.state); - debug!("get_transaction_for_move: target curry"); + debug!("get_transaction_for_move: source curry {args:?}"); let target_args = self.spend_this_coin(); + debug!("get_transaction_for_move: target curry {target_args:?}"); assert_ne!( target_args.mover_puzzle_hash, self.fixed.my_identity.puzzle_hash @@ -1306,7 +1333,7 @@ impl RefereeMaker { }); if let Some(transaction) = - self.get_transaction(allocator, coin_string, &spend_puzzle, true, &args_list)? + self.get_transaction(allocator, coin_string, &spend_puzzle, true, &target_args, &args_list)? { Ok(transaction) } else { @@ -1375,6 +1402,7 @@ impl RefereeMaker { // Retrieve evidence from their turn handler. let state_nodeptr = last_state.to_nodeptr(allocator)?; + assert!(args.game_move.basic.move_made.len() <= self.args_for_this_coin().game_move.basic.max_move_size); let result = handler.call_their_turn_driver( allocator, &TheirTurnInputs { @@ -1402,16 +1430,14 @@ impl RefereeMaker { let (readable_move, message) = match &result { TheirTurnResult::FinalMove(readable_move) => { - if really_update { - self.accept_their_move( - allocator, - None, - args.clone(), - puzzle_args.clone(), - details, - state_number, - )?; - } + self.accept_their_move( + allocator, + None, + args.clone(), + puzzle_args.clone(), + details, + state_number, + )?; (readable_move.clone(), vec![]) } @@ -1428,16 +1454,14 @@ impl RefereeMaker { // In case this succeeds, we'll direct the result to our mover // puzzle, which sets our identity for the game and is a value- // holding coin spendable by us. - if really_update { - self.accept_their_move( - allocator, - Some(handler.clone()), - args.clone(), - puzzle_args.clone(), - details, - state_number, - )?; - } + self.accept_their_move( + allocator, + Some(handler.clone()), + args.clone(), + puzzle_args.clone(), + details, + state_number, + )?; debug!( "readable_move {}", @@ -1624,16 +1648,14 @@ impl RefereeMaker { &self.fixed.referee_coin_puzzle_hash, &puzzle_args, )?; - debug!("prior move was {:?}", self.args_for_this_coin().game_move.basic); - debug!("move from previous turn is {:?}", puzzle_args.game_move.basic); - assert_ne!(self.args_for_this_coin().game_move, puzzle_args.game_move); + // assert_ne!(self.args_for_this_coin().game_move, puzzle_args.game_move); + let new_puzzle_hash = curry_referee_puzzle_hash( allocator, &self.fixed.referee_coin_puzzle_hash, &puzzle_args, )?; - let _game_handler = self.get_game_handler(); let nil = allocator.allocator().null(); let validator_args = ValidatorMoveArgs { evidence: nil, @@ -1695,10 +1717,29 @@ impl RefereeMaker { state_number: usize, expected: bool, ) -> Result { - assert!(!self.is_my_turn()); - debug!("rems in spend {conditions:?}"); - debug!("current state {:?}", self.state); - assert_ne!(self.args_for_this_coin().game_move, self.spend_this_coin().game_move); + let after_puzzle_hash = curry_referee_puzzle_hash( + allocator, + &self.fixed.referee_coin_puzzle_hash, + &self.spend_this_coin() + )?; + + // XXX Revisit this in conjuction with rewind. There is a better way to do this. + let repeat = + if let Some(CoinCondition::CreateCoin(ph, amt)) = + conditions + .iter() + .find(|cond| matches!(cond, CoinCondition::CreateCoin(_, _))) + { + after_puzzle_hash == *ph + } else { + false + }; + + if repeat { + debug!("rems in spend {conditions:?}"); + debug!("current state {:?}", self.state); + debug!("stored state number {}", self.old_states[self.old_states.len()-1].state_number); + } // Read parameters off conditions let rem_condition = if let Some(CoinCondition::Rem(rem_condition)) = @@ -1761,10 +1802,10 @@ impl RefereeMaker { validation_info_hash, }; - assert_ne!(details, self.args_for_this_coin().game_move); - if !expected { - assert_ne!(details, self.spend_this_coin().game_move); - assert_ne!(self.args_for_this_coin().game_move, self.spend_this_coin().game_move); + let state = self.state.clone(); + if repeat { + self.state = self.old_states[self.old_states.len() - 2].state.clone(); + debug!("repeat {repeat} new state {:?}", self.state); } let result = self.their_turn_move_off_chain( allocator, @@ -1786,6 +1827,7 @@ impl RefereeMaker { &self.fixed.referee_coin_puzzle_hash, &args )?; + debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); let mut check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr| { if let Some(result) = self.check_their_turn_for_slash( @@ -1818,7 +1860,7 @@ impl RefereeMaker { }; debug!("referee move details {details:?}"); - match result.original { + let final_result = match result.original { TheirTurnResult::Slash(evidence, sig) => { let slash_spend = self.make_slash_spend(allocator)?; let full_slash_solution = self.make_full_slash_solution(allocator)?; @@ -1833,19 +1875,21 @@ impl RefereeMaker { ); } TheirTurnResult::FinalMove(readable_move) => { - if expected { + if repeat { dont_enforce(allocator, readable_move) } else { check_and_report_slash(allocator, readable_move) } } TheirTurnResult::MakeMove(readable_move, _, _) => { - if expected { + if repeat { dont_enforce(allocator, readable_move) } else { check_and_report_slash(allocator, readable_move) } } - } + }; + self.state = state; + final_result } } diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index 58fad3e2..a3a0cd75 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -14,7 +14,7 @@ use crate::common::standard_coin::{ get_standard_coin_puzzle, private_to_public_key, puzzle_hash_for_pk, }; use crate::common::types::{ - AllocEncoder, Amount, CoinID, GameID, Hash, Puzzle, PuzzleHash, Sha256tree, Timeout, + AllocEncoder, Amount, CoinID, GameID, Hash, Program, Puzzle, PuzzleHash, Sha256tree, Timeout, }; use crate::tests::game::DEFAULT_UNROLL_TIME_LOCK; @@ -134,11 +134,12 @@ fn test_smoke_can_start_game() { ValidationProgram::new(env.allocator, initial_validation_puzzle); let timeout = Timeout::new(1337); + let game_handler = GameHandler::TheirTurnHandler(Program::from_nodeptr(env.allocator, game_handler).expect("should cvt")); let _game_start_potato_sigs = game.player(1).ch.send_potato_start_game( &mut env, &[GameStartInfo { game_id: GameID::new(vec![0]), - game_handler: GameHandler::TheirTurnHandler(game_handler), + game_handler: game_handler, timeout: timeout.clone(), my_contribution_this_game: our_share.clone(), their_contribution_this_game: their_share.clone(), diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index eff9b374..bd45a1d4 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -24,7 +24,7 @@ fn test_game_handler_their_move_slash() { ) .expect("should assemble"); - let their_turn_handler = GameHandler::their_driver_from_nodeptr(program); + let their_turn_handler = GameHandler::their_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); assert!(!their_turn_handler.is_my_turn()); let nil = allocator.allocator().null(); let result = their_turn_handler @@ -66,7 +66,7 @@ fn test_game_handler_their_make_move() { ) .expect("should assemble"); - let their_turn_handler = GameHandler::their_driver_from_nodeptr(program); + let their_turn_handler = GameHandler::their_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); let nil = allocator.allocator().null(); let result = their_turn_handler .call_their_turn_driver( @@ -90,9 +90,10 @@ fn test_game_handler_their_make_move() { ) .expect("should run"); if let TheirTurnResult::MakeMove(state, game_handler, msg) = result { + let game_handler_node = game_handler.to_nodeptr(&mut allocator).expect("should cvt"); assert_eq!(msg, b"test"); assert_eq!(disassemble(allocator.allocator(), state, None), "999"); - assert_eq!(disassemble(allocator.allocator(), game_handler.to_nodeptr(), None), "(1337 () () () 0x0000000000000000000000000000000000000000000000000000000000000000 () ())"); + assert_eq!(disassemble(allocator.allocator(), game_handler_node, None), "(1337 () () () 0x0000000000000000000000000000000000000000000000000000000000000000 () ())"); } else { unreachable!(); } @@ -107,7 +108,7 @@ fn test_game_handler_my_turn() { "(c (1 . 1) (c (1 . 2) (c (1 . 3) (c (1 . 4) (c (1 . 5) (c (1 . 6) (c (c (1 . 1337) 1) (c (1 . 8) ()))))))))" ).expect("should assemble"); - let my_turn_handler = GameHandler::my_driver_from_nodeptr(program); + let my_turn_handler = GameHandler::my_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); let result = my_turn_handler .call_my_turn_driver( &mut allocator, @@ -123,10 +124,11 @@ fn test_game_handler_my_turn() { }, ) .expect("should run"); + let waiting_driver_node = result.waiting_driver.to_nodeptr(&mut allocator).expect("should cvt"); assert_eq!( disassemble( allocator.allocator(), - result.waiting_driver.to_nodeptr(), + waiting_driver_node, None ), "(1337 () () () 100 0x0000000000000000000000000000000000000000000000000000000000000000)" diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 864372d4..984886e9 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -979,7 +979,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( }; let mut fake_move = m.clone(); - fake_move.game_move.basic.move_made = move_data.clone(); + fake_move.game_move.basic.move_made.append(&mut move_data.clone()); Ok(PeerMessage::Move(game_id.clone(), fake_move)) }) .expect("should be able to sabotage"); @@ -1012,9 +1012,9 @@ fn sim_test_with_peer_container() { fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { let mut allocator = AllocEncoder::new(); - let mut moves = test_moves_1(&mut allocator); - if let GameAction::Move(_player, readable, _) = moves[2].clone() { - moves[3] = GameAction::FakeMove(1, readable, vec![0; 500]); + let mut moves = test_moves_1(&mut allocator).to_vec(); + if let GameAction::Move(player, readable, _) = moves[3].clone() { + moves.insert(3, GameAction::FakeMove(player, readable, vec![0; 500])); } else { panic!("no move 1 to replace"); } @@ -1031,8 +1031,8 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { let mut allocator = AllocEncoder::new(); let mut moves = test_moves_1(&mut allocator).to_vec(); - if let GameAction::Move(_player, readable, _) = moves[2].clone() { - moves[3] = GameAction::FakeMove(1, readable, vec![0; 500]); + if let GameAction::Move(player, readable, _) = moves[3].clone() { + moves.insert(3, GameAction::FakeMove(player, readable, vec![0; 500])); } else { panic!("no move 1 to replace"); } diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 27a961b6..476122b6 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -61,25 +61,23 @@ pub fn make_debug_game_handler( } }; - let my_turn_handler = GameHandler::my_driver_from_nodeptr( - make_curried_game_handler(true) - .to_clvm(allocator) - .expect("should curry"), - ); + let my_driver_node = make_curried_game_handler(true) + .to_clvm(allocator) + .expect("should curry"); + let my_turn_handler = GameHandler::my_driver_from_nodeptr(allocator, my_driver_node).expect("should cvt"); let my_validation_program = CurriedProgram { - program: Node(my_turn_handler.to_nodeptr()), + program: my_turn_handler.clone(), args: clvm_curried_args!(1337), } .to_clvm(allocator) .expect("should curry"); - let their_turn_handler = GameHandler::their_driver_from_nodeptr( - make_curried_game_handler(false) - .to_clvm(allocator) - .expect("should curry"), - ); + let their_turn_node = make_curried_game_handler(false) + .to_clvm(allocator) + .expect("should curry"); + let their_turn_handler = GameHandler::their_driver_from_nodeptr(allocator, their_turn_node).expect("should cvt"); let their_validation_program = CurriedProgram { - program: Node(their_turn_handler.to_nodeptr()), + program: their_turn_handler.clone(), args: clvm_curried_args!(1337), } .to_clvm(allocator) From b0ca67a7eac6220d618c736dc08ab1a3978495e3 Mon Sep 17 00:00:00 2001 From: arty Date: Tue, 10 Dec 2024 06:46:30 -0800 Subject: [PATCH 05/50] Hold the program in GameHandler via rc --- src/channel_handler/game_handler.rs | 8 ++++---- src/channel_handler/types.rs | 4 ++-- src/referee.rs | 2 +- src/tests/channel_handler.rs | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 763a24a4..54fc0f4a 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -41,8 +41,8 @@ use crate::referee::{GameMoveDetails, GameMoveStateInfo}; #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum GameHandler { - MyTurnHandler(Program), - TheirTurnHandler(Program), + MyTurnHandler(Rc), + TheirTurnHandler(Rc), } impl ToClvm for GameHandler { @@ -172,10 +172,10 @@ pub enum TheirTurnResult { impl GameHandler { pub fn their_driver_from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { - Ok(GameHandler::TheirTurnHandler(Program::from_nodeptr(allocator, n)?)) + Ok(GameHandler::TheirTurnHandler(Rc::new(Program::from_nodeptr(allocator, n)?))) } pub fn my_driver_from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { - Ok(GameHandler::MyTurnHandler(Program::from_nodeptr(allocator, n)?)) + Ok(GameHandler::MyTurnHandler(Rc::new(Program::from_nodeptr(allocator, n)?))) } pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { match self { diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 26fdf773..14070425 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -232,9 +232,9 @@ impl GenericGameStartInfo { let returned_game_id = GameID::from_clvm(allocator, lst[0])?; let returned_amount = Amount::from_clvm(allocator, lst[1])?; let returned_handler = if my_turn { - GameHandler::MyTurnHandler(Program::from_nodeptr(allocator, lst[2])?) + GameHandler::MyTurnHandler(Rc::new(Program::from_nodeptr(allocator, lst[2])?)) } else { - GameHandler::TheirTurnHandler(Program::from_nodeptr(allocator, lst[2])?) + GameHandler::TheirTurnHandler(Rc::new(Program::from_nodeptr(allocator, lst[2])?)) }; let returned_timeout = Timeout::from_clvm(allocator, lst[3])?; let returned_my_contribution = Amount::from_clvm(allocator, lst[4])?; diff --git a/src/referee.rs b/src/referee.rs index cd17f3e0..0793134a 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -867,7 +867,7 @@ impl RefereeMaker { g.clone() } else { let nil = allocator.encode_atom(&[]).into_gen()?; - GameHandler::MyTurnHandler(Program::from_nodeptr(allocator, nil)?) + GameHandler::MyTurnHandler(Rc::new(Program::from_nodeptr(allocator, nil)?)) }; let new_state = match self.state.borrow() { diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index a3a0cd75..135cfc50 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use rand::prelude::*; use rand_chacha::ChaCha8Rng; @@ -134,7 +136,7 @@ fn test_smoke_can_start_game() { ValidationProgram::new(env.allocator, initial_validation_puzzle); let timeout = Timeout::new(1337); - let game_handler = GameHandler::TheirTurnHandler(Program::from_nodeptr(env.allocator, game_handler).expect("should cvt")); + let game_handler = GameHandler::TheirTurnHandler(Rc::new(Program::from_nodeptr(env.allocator, game_handler).expect("should cvt"))); let _game_start_potato_sigs = game.player(1).ch.send_potato_start_game( &mut env, &[GameStartInfo { From b2ac3c60b3cde7110c11a4a9266470dbc3c6f68e Mon Sep 17 00:00:00 2001 From: arty Date: Wed, 11 Dec 2024 19:18:07 -0800 Subject: [PATCH 06/50] I feel like things are getting under control --- clsp/onchain/calpoker/c.clsp | 2 - clsp/onchain/referee.clsp | 2 +- clsp/onchain/referee.hex | 2 +- src/channel_handler/mod.rs | 22 ++- src/common/types.rs | 1 + src/peer_container.rs | 4 +- src/potato_handler.rs | 236 ++++++++++++++++----------- src/referee.rs | 18 +- src/simulator.rs | 7 - src/tests/peer/potato_handler.rs | 1 + src/tests/peer/potato_handler_sim.rs | 12 +- 11 files changed, 183 insertions(+), 124 deletions(-) diff --git a/clsp/onchain/calpoker/c.clsp b/clsp/onchain/calpoker/c.clsp index 8efbdd86..7695edbe 100644 --- a/clsp/onchain/calpoker/c.clsp +++ b/clsp/onchain/calpoker/c.clsp @@ -26,5 +26,3 @@ (x) ) ) - -o \ No newline at end of file diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index 98041d45..3c054598 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -63,7 +63,7 @@ conditions (a mover_puzzle solution) (assert (print (list "referee data" all_args) VALIDATION_INFO_HASH) - (print (list "strlen" MOVE MAX_MOVE_SIZE) (<= (strlen MOVE) MAX_MOVE_SIZE)) + (print (list "strlen" new_move MAX_MOVE_SIZE) (<= (strlen new_move) MAX_MOVE_SIZE)) (<= new_mover_share AMOUNT) (>= new_mover_share 0) (print (list "logior test" (logior (not new_validation_info_hash))) (= 32 (strlen new_validation_info_hash))) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index a7446a4d..a5c6169a 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff2bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8200b5ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff55ffff04ff0bff098080ffff04ffff02ff8200b5ff82017580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018c726566657265652064617461ffff04ff09ff808080ffff04ff822ff1ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff01867374726c656effff04ff820bf1ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff820bf180ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018b6c6f67696f722074657374ffff04ffff19ffff20ff558080ffff01808080ffff04ffff09ffff0120ffff0dff558080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019a6d61746368696e67206d6f7665722070757a7a6c652068617368ffff04ff21ffff04ffff02ff12ffff04ff02ffff04ff8202f5ff80808080ffff0180808080ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018f6d61746368696e67206f7574707574ffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff2bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8200b5ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff55ffff04ff0bff098080ffff04ffff02ff8200b5ff82017580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018c726566657265652064617461ffff04ff09ff808080ffff04ff822ff1ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff01867374726c656effff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018b6c6f67696f722074657374ffff04ffff19ffff20ff558080ffff01808080ffff04ffff09ffff0120ffff0dff558080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019a6d61746368696e67206d6f7665722070757a7a6c652068617368ffff04ff21ffff04ffff02ff12ffff04ff02ffff04ff8202f5ff80808080ffff0180808080ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018f6d61746368696e67206f7574707574ffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index bb1808fc..a27ffd60 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -798,6 +798,17 @@ impl ChannelHandler { self.current_state_number, )?; + let _ = self.live_games[game_idx].get_transaction_for_move( + env.allocator, + &CoinString::from_parts( + &CoinID::default(), + &PuzzleHash::default(), + &Amount::default() + ), + &env.agg_sig_me_additional_data, + false, + ); + self.live_games[game_idx].last_referee_puzzle_hash = referee_result.puzzle_hash_for_unroll.clone(); @@ -1294,7 +1305,7 @@ impl ChannelHandler { coin: unroll_coin.clone(), bundle: spend_transaction.bundle.clone(), }, - reward_coin: spend_transaction.reward_coin, + reward_coin: spend_transaction.coin, }), skip_game: Vec::default(), skip_coin_id: None, @@ -1325,7 +1336,7 @@ impl ChannelHandler { coin: game_coin.clone(), bundle: spend_transaction.bundle.clone(), }, - after_update_game_coin: spend_transaction.reward_coin.clone(), + after_update_game_coin: spend_transaction.coin.clone(), }), skip_coin_id: Some(cached.game_id.clone()), skip_game: Vec::default(), @@ -1416,6 +1427,7 @@ impl ChannelHandler { &live_game.get_amount(), ); + debug!("{initial_potato} new game coin {coin_id:?} for game_id {:?}", live_game.game_id); res.insert( coin_id, OnChainGameState { @@ -1478,12 +1490,12 @@ impl ChannelHandler { return Err(Error::StrErr("broken coin".to_string())); }; - assert_eq!(last_puzzle_hash, existing_ph); - debug!("last puzzle hash {last_puzzle_hash:?}"); debug!("start puzzle hash {start_puzzle_hash:?}"); debug!("outcome puzzle hash {end_puzzle_hash:?}"); + // assert_eq!(start_puzzle_hash, existing_ph); + debug!( "on chain our turn {} processing our turn {}", self.live_games[game_idx].is_my_turn(), @@ -1645,7 +1657,7 @@ impl ChannelHandler { return Ok(Some(GameAction::RedoMove( move_data.game_id.clone(), coin.clone(), - self.live_games[game_idx].current_puzzle_hash(env.allocator)?, + self.live_games[game_idx].outcome_puzzle_hash(env.allocator)?, Box::new(transaction), ))); } diff --git a/src/common/types.rs b/src/common/types.rs index 01f61407..fdd19e64 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -1043,6 +1043,7 @@ pub struct SpendRewardResult { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SpendBundle { + pub name: Option, pub spends: Vec, } diff --git a/src/peer_container.rs b/src/peer_container.rs index ee65fbab..398a9d66 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -529,6 +529,7 @@ impl SynchronousGameCradle { )?; let bundle = SpendBundle { + name: Some("create channel".to_string()), spends: vec![CoinSpend { coin: parent.clone(), bundle: Spend { @@ -632,7 +633,6 @@ impl SynchronousGameCradle { .cloned() .collect(); for d in deleted_watched.iter() { - debug!("filter: spent coin {:?}", self.state.watching_coins.get(d)); self.state.watching_coins.remove(d); } let created_watched: HashSet = watch_report @@ -643,7 +643,6 @@ impl SynchronousGameCradle { .collect(); for c in created_watched.iter() { if let Some(w) = self.state.watching_coins.get_mut(c) { - debug!("filter: created coin {w:?}"); w.timeout_at = Some(w.timeout_blocks.to_u64() + block); } } @@ -653,7 +652,6 @@ impl SynchronousGameCradle { for (k, w) in self.state.watching_coins.iter_mut() { if let Some(t) = w.timeout_at { if t <= block { - debug!("filter: timeout on coin: {w:?}"); w.timeout_at = None; timed_out.insert(k.clone()); } diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 05baad3e..77700641 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -791,6 +791,7 @@ impl PotatoHandler { &channel_puzzle_public_key, )?; system_interface.spend_transaction_and_add_fee(&SpendBundle { + name: Some("Create channel 2".to_string()), spends: vec![CoinSpend { coin: coin.clone(), bundle: Spend { @@ -1732,6 +1733,7 @@ impl PotatoHandler { ); system_interface.spend_transaction_and_add_fee(&SpendBundle { + name: Some("create unroll".to_string()), spends: vec![CoinSpend { bundle: Spend { puzzle: curried_unroll_program, @@ -1780,6 +1782,87 @@ impl PotatoHandler { } } + fn do_on_chain_move<'a, G, R: Rng + 'a>( + &mut self, + penv: &mut dyn PeerEnv<'a, G, R>, + current_coin: &CoinString, + game_id: GameID, + readable_move: ReadableMove, + entropy: Hash, + ) -> Result<(), Error> + where + G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, + { + let (initial_potato, (old_ph, new_ph, move_result, transaction)) = + { + let player_ch = self.channel_handler_mut()?; + let initial_potato = player_ch.is_initial_potato(); + let my_turn = player_ch.game_is_my_turn(&game_id); + if my_turn != Some(true) { + debug!("{initial_potato} trying to do game action when not my turn"); + self.game_action_queue.push_front(GameAction::Move(game_id, readable_move, entropy)); + return Ok(()); + } + + let (env, _system_interface) = penv.env(); + (initial_potato, player_ch.on_chain_our_move(env, &game_id, &readable_move, entropy, current_coin)?) + }; + + debug!("{initial_potato} old_ph {old_ph:?}"); + debug!("{initial_potato} new_ph {new_ph:?}"); + + if let Some((_, ph, _)) = current_coin.to_parts() { + assert_eq!(old_ph, ph); + } + + debug!("{initial_potato} created puzzle hash for move {new_ph:?}"); + // No mutable this borrows below. + let game_map = + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + game_map + } else { + return Err(Error::StrErr("not on chain".to_string())); + }; + + let old_definition = + if let Some(old_def) = game_map.remove(¤t_coin) { + old_def + } else { + return Err(Error::StrErr("no such game".to_string())); + }; + + let new_coin = CoinString::from_parts( + ¤t_coin.to_coin_id(), + &new_ph, + &transaction.amount, + ); + + self.my_game_spends.insert(new_ph.clone()); + game_map.insert(new_coin.clone(), OnChainGameState { + puzzle_hash: new_ph, + our_turn: false, + .. old_definition + }); + + let (env, system_interface) = penv.env(); + system_interface.register_coin( + &new_coin, + &self.channel_timeout, + Some("game coin for my turn") + )?; + + system_interface.spend_transaction_and_add_fee(&SpendBundle { + name: Some("on chain move".to_string()), + spends: vec![CoinSpend { + coin: current_coin.clone(), + bundle: transaction.bundle.clone(), + }], + })?; + system_interface.self_move(&game_id, &move_result.basic.move_made)?; + + Ok(()) + } + fn do_on_chain_action<'a, G, R: Rng + 'a>( &mut self, penv: &mut dyn PeerEnv<'a, G, R>, @@ -1794,101 +1877,63 @@ impl PotatoHandler { player_ch.is_initial_potato() }; - let (game_id, readable_move, hash, current) = if let HandshakeState::OnChain(game_map) = + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { match action { GameAction::Move(game_id, readable_move, hash) => { - { - let (env, _) = penv.env(); - let readable_node = readable_move.to_nodeptr(env.allocator)?; - debug!("{initial_potato} doing a move {}\n", disassemble(env.allocator.allocator(), readable_node, None)); - } - if let Some((current, _game)) = game_map.iter().find(|g| g.1.game_id == game_id) - { - ( - game_id.clone(), - readable_move.clone(), - hash.clone(), - current.clone(), - ) - } else { - return Err(Error::StrErr("no matching game".to_string())); - } + let current_coin = + if let HandshakeState::OnChain(game_map) = &self.handshake_state { + if let Some((current, _game)) = game_map.iter().find(|g| g.1.game_id == game_id) { + current.clone() + } else { + return Err(Error::StrErr("no matching game".to_string())); + } + } else { + return Err(Error::StrErr("not on chain".to_string())); + }; + + self.do_on_chain_move(penv, ¤t_coin, game_id, readable_move, hash) } GameAction::RedoMove(_game_id, coin, new_ph, tx) => { // Remember that we spent this one. { let player_ch = self.channel_handler()?; debug!("{} created puzzle hash for redo {new_ph:?}", player_ch.is_initial_potato()); - self.my_game_spends.insert(new_ph); + self.my_game_spends.insert(new_ph.clone()); } let (_env, system_interface) = penv.env(); system_interface.spend_transaction_and_add_fee(&SpendBundle { + name: Some("redo move".to_string()), spends: vec![CoinSpend { coin: coin.clone(), bundle: tx.bundle.clone(), }], })?; - return Ok(()); + let amt = + if let Some((_, _, amt)) = coin.to_parts() { + amt + } else { + return Err(Error::StrErr("bad coin".to_string())); + }; + + let new_coin = CoinString::from_parts( + &coin.to_coin_id(), + &new_ph, + &amt, + ); + system_interface.register_coin( + &new_coin, + &self.channel_timeout, + Some("post redo game coin") + )?; + Ok(()) } _ => todo!(), } } else { - return Err(Error::StrErr("not on chain".to_string())); - }; - - let (old_ph, new_ph, move_result, transaction) = { - let (env, _system_interface) = penv.env(); - let player_ch = self.channel_handler_mut()?; - player_ch.on_chain_our_move(env, &game_id, &readable_move, hash, ¤t)? - }; - debug!("old_ph {old_ph:?}"); - debug!("new_ph {new_ph:?}"); - - // Assert that our idea of what's being spent matches the coin. - if let HandshakeState::OnChain(game_map) = &self.handshake_state { - let coin_keys: Vec<&CoinString> = game_map.keys().collect(); - let player_ch = self.channel_handler()?; - debug!("{} coin keys {coin_keys:?}", player_ch.is_initial_potato()); - let matching_keys = game_map - .keys() - .filter(|k| { - if let Some((_, ph, _)) = k.to_parts() { - if ph == old_ph { - return true; - } - } - - false - }) - .count(); - assert_eq!(matching_keys, 1); - } - - // Remember that we spent this one. - { - let player_ch = self.channel_handler()?; - debug!("{} created puzzle hash for move {new_ph:?}", player_ch.is_initial_potato()); - self.my_game_spends.insert(new_ph); + Err(Error::StrErr("not on chain".to_string())) } - - let (env, system_interface) = penv.env(); - let solution_nodeptr = transaction.bundle.solution.to_nodeptr(env.allocator)?; - debug!( - "referee solution {}", - disassemble(env.allocator.allocator(), solution_nodeptr, None) - ); - system_interface.spend_transaction_and_add_fee(&SpendBundle { - spends: vec![CoinSpend { - coin: current.clone(), - bundle: transaction.bundle.clone(), - }], - })?; - - system_interface.self_move(&game_id, &move_result.basic.move_made)?; - - Ok(()) } fn do_game_action<'a, G, R: Rng + 'a>( @@ -2116,31 +2161,28 @@ impl PotatoHandler { G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { let mut unblock_queue = false; + let initial_potato = + { + let ch = self.channel_handler()?; + ch.is_initial_potato() + }; - debug!("handle game coin spent {coin_id:?}"); + debug!("{initial_potato} handle game coin spent {coin_id:?}"); let old_definition = if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { if let Some(old_definition) = game_map.remove(coin_id) { - debug!("we have game coin {old_definition:?}"); + debug!("{initial_potato} we have game coin {old_definition:?}"); old_definition } else { - debug!("we don't have game coin!"); + debug!("{initial_potato} we don't have game coin!", ); return Ok(()); } } else { - debug!("game coin spent not on chain!"); + debug!("{initial_potato} game coin spent not on chain!"); return Ok(()); }; - if let Some((_, ph, _)) = coin_id.to_parts() { - let ch = self.channel_handler()?; - debug!("{} our spends are {:?}", ch.is_initial_potato(), self.my_game_spends); - debug!("spent coin was {ph:?}"); - let (env, _) = penv.env(); - assert_eq!(ch.is_our_spend(env, &old_definition.game_id, coin_id)?, self.my_game_spends.contains(&ph)); - } - // A game coin was spent and we have the puzzle and solution. let player_ch = self.channel_handler_mut()?; let (env, system_interface) = penv.env(); @@ -2155,10 +2197,10 @@ impl PotatoHandler { coin_id, &conditions, )?; - debug!("game coin spent: {their_turn_result:?}"); + debug!("{initial_potato} game coin spent result from channel handler {their_turn_result:?}"); match their_turn_result { CoinSpentInformation::Expected(ph, amt) => { - debug!("{} got an expected spend {ph:?} {amt:?}", player_ch.is_initial_potato()); + debug!("{initial_potato} got an expected spend {ph:?} {amt:?}"); let new_coin_id = CoinString::from_parts( &coin_id.to_coin_id(), &ph, @@ -2184,16 +2226,18 @@ impl PotatoHandler { todo!(); } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable, .. }) => { - debug!("{} got a their spend {new_coin_string:?} from ph {:?}", player_ch.is_initial_potato(), old_definition.puzzle_hash); + debug!("{initial_potato} got a their spend {new_coin_string:?} from ph {:?}", old_definition.puzzle_hash); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { let (puzzle_hash, amt) = - if let Some((_, ph, amt)) = new_coin_string.to_parts() { + if let Some((orig_coin_id, ph, amt)) = new_coin_string.to_parts() { + assert_eq!(coin_id.to_coin_id(), orig_coin_id); (ph, amt) } else { return Err(Error::StrErr("bad coin explode".to_string())); }; let game_id = old_definition.game_id.clone(); + debug!("{initial_potato} got their coin spend with new puzzle hash {puzzle_hash:?} {amt:?}"); game_map.insert(new_coin_string.clone(), OnChainGameState { puzzle_hash, our_turn: true, @@ -2223,17 +2267,26 @@ impl PotatoHandler { todo!(); } CoinSpentInformation::OurSpend(ph, amt) => { - debug!("{} got an our spend {ph:?} {amt:?}", player_ch.is_initial_potato()); + debug!("{initial_potato} got an our spend {ph:?} {amt:?}"); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { - game_map.insert(CoinString::from_parts( + let new_coin_id = CoinString::from_parts( &coin_id.to_coin_id(), &ph, &amt - ), OnChainGameState { + ); + game_map.insert(new_coin_id.clone(), OnChainGameState { puzzle_hash: ph, our_turn: false, .. old_definition }); + + let (_, system_interface) = penv.env(); + system_interface.register_coin( + &new_coin_id, + &self.channel_timeout, + Some("coin gives their turn") + )?; + // Do some kind of UI indication. unblock_queue = true; } @@ -2529,6 +2582,7 @@ impl { + debug!("{coin_id:?} is a game spend"); Some(ConditionWaitKind::Game) } _ => None, diff --git a/src/referee.rs b/src/referee.rs index 0793134a..5d32336e 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -71,10 +71,17 @@ pub enum SlashOutcome { }, } +#[derive(Debug, Clone)] +pub enum RefereeOutputKind { + Game, + Reward, +} + #[derive(Debug, Clone)] pub struct RefereeOnChainTransaction { pub bundle: Spend, - pub reward_coin: CoinString, + pub amount: Amount, + pub coin: CoinString, } #[allow(dead_code)] @@ -712,7 +719,7 @@ impl RefereeMaker { old_state.state_number ); if *puzzle_hash == have_puzzle_hash && old_state.state.is_my_turn() { - self.state = self.old_states[self.old_states.len() - 1].state.clone(); + self.state = old_state.state.clone(); debug!("referee rewind my turn: reassume state {:?}", self.state); return Ok(Some(old_state.state_number)); } @@ -922,6 +929,8 @@ impl RefereeMaker { new_entropy: Hash, state_number: usize, ) -> Result { + assert!(self.is_my_turn()); + let game_handler = self.get_game_handler(); let args = self.spend_this_coin(); @@ -1116,7 +1125,8 @@ impl RefereeMaker { ); return Ok(Some(RefereeOnChainTransaction { bundle: transaction_bundle, - reward_coin: output_coin_string, + amount: self.fixed.amount.clone(), + coin: output_coin_string, })); } @@ -1263,7 +1273,7 @@ impl RefereeMaker { debug!("spend puzzle hash {ph:?}"); debug!("this coin start {start_ph:?}"); debug!("this coin end {end_ph:?}"); - assert_eq!(ph, start_ph); + // assert_eq!(ph, start_ph); } } diff --git a/src/simulator.rs b/src/simulator.rs index 7f47a21a..de611028 100644 --- a/src/simulator.rs +++ b/src/simulator.rs @@ -291,7 +291,6 @@ impl Simulator { ) -> PyResult> { Python::with_gil(|py| -> PyResult<_> { let items: Vec = coins.extract(py)?; - debug!("num coins {}", items.len()); let mut result_coins = Vec::new(); for i in items.iter() { let coin_of_item: PyObject = if let Ok(res) = i.getattr(py, "coin") { @@ -300,7 +299,6 @@ impl Simulator { i.extract(py)? }; let as_list_str: String = coin_of_item.call_method0(py, "__repr__")?.extract(py)?; - debug!("as_list_str {as_list_str}"); let as_list: Vec = self.coin_as_list.call1(py, (coin_of_item,))?.extract(py)?; let parent_coin_info: &PyBytes = as_list[0].downcast(py)?; @@ -315,7 +313,6 @@ impl Simulator { &PuzzleHash::from_hash(puzzle_hash), &Amount::new(amount), ); - debug!("coin with id {:?}", new_coin.to_coin_id()); result_coins.push(new_coin); } Ok(result_coins) @@ -402,10 +399,8 @@ impl Simulator { solution: NodePtr, ) -> PyResult { let coin = self.make_coin(parent_coin)?; - debug!("coin = {coin:?}"); let puzzle_hex = puzzle_reveal.to_hex(); let puzzle_program = self.hex_to_program(&puzzle_hex)?; - debug!("puzzle_program = {puzzle_program:?}"); let solution_hex = Node(solution).to_hex(allocator).map_err(|_| { PyErr::from_value( PyIndexError::new_err("failed hex conversion") @@ -420,7 +415,6 @@ impl Simulator { .into(), ) })?; - debug!("solution_program = {solution_program:?}"); self.make_spend .call1(py, (coin, puzzle_program, solution_program)) } @@ -467,7 +461,6 @@ impl Simulator { ) -> PyResult { let spend_bundle = self.make_spend_bundle(allocator, txs)?; Python::with_gil(|py| { - debug!("spend_bundle {:?}", spend_bundle); let spend_res: PyObject = self .async_client(py, "push_tx", (spend_bundle,))? .extract(py)?; diff --git a/src/tests/peer/potato_handler.rs b/src/tests/peer/potato_handler.rs index d49d86f1..99ad923e 100644 --- a/src/tests/peer/potato_handler.rs +++ b/src/tests/peer/potato_handler.rs @@ -230,6 +230,7 @@ where peer.channel_offer( self, SpendBundle { + name: None, spends: vec![CoinSpend { coin: parent.clone(), bundle: Spend { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 984886e9..8d7ade84 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -81,10 +81,8 @@ pub fn update_and_report_coins<'a, R: Rng>( ) -> Result { let current_height = simulator.get_current_height(); let current_coins = simulator.get_all_coins().into_gen()?; - debug!("current coins {current_height} {current_coins:?}"); let watch_report = coinset_adapter.make_report_from_coin_set_update(current_height as u64, ¤t_coins)?; - debug!("coinset adapter result {watch_report:?}"); // Report timed out coins for who in 0..=1 { @@ -120,7 +118,7 @@ impl SimulatedWalletSpend { timeout: &Timeout, name: Option<&'static str>, ) -> Result<(), Error> { - debug!("register coin"); + debug!("register coin {name:?}"); self.watching_coins.insert( coin_id.clone(), WatchEntry { @@ -274,6 +272,7 @@ impl<'a, 'b: 'a, R: Rng> SimulatedPeerSystem<'a, 'b, R> { peer.channel_offer( self, SpendBundle { + name: None, spends: vec![CoinSpend { coin: parent.clone(), bundle: Spend { @@ -807,7 +806,6 @@ fn run_calpoker_container_with_action_list_with_success_predicate( simulator.farm_block(&neutral_identity.puzzle_hash); let current_height = simulator.get_current_height(); let current_coins = simulator.get_all_coins().expect("should work"); - debug!("current coins {current_height} {current_coins:?}"); let watch_report = coinset_adapter .make_report_from_coin_set_update(current_height as u64, ¤t_coins) .expect("should work"); @@ -838,12 +836,6 @@ fn run_calpoker_container_with_action_list_with_success_predicate( let result = cradles[i] .idle(allocator, &mut rng, &mut local_uis[i]) .expect("should work"); - debug!( - "cradle {i}: continue_on {} outbound {}", - result.continue_on, - result.outbound_messages.len() - ); - for coin in result.coin_solution_requests.iter() { let ps_res = simulator .get_puzzle_and_solution(coin) From defa0dd131e43357b1d6009b853eb736c208b356 Mon Sep 17 00:00:00 2001 From: arty Date: Thu, 12 Dec 2024 01:47:17 -0800 Subject: [PATCH 07/50] removed a hack, better --- src/potato_handler.rs | 5 ++++- src/referee.rs | 37 +++++++++++-------------------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 77700641..08c1f5de 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1903,6 +1903,7 @@ impl PotatoHandler { self.my_game_spends.insert(new_ph.clone()); } let (_env, system_interface) = penv.env(); + self.have_potato = PotatoState::Absent; system_interface.spend_transaction_and_add_fee(&SpendBundle { name: Some("redo move".to_string()), spends: vec![CoinSpend { @@ -2172,6 +2173,7 @@ impl PotatoHandler { let old_definition = if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { if let Some(old_definition) = game_map.remove(coin_id) { + self.have_potato = PotatoState::Present; debug!("{initial_potato} we have game coin {old_definition:?}"); old_definition } else { @@ -2582,12 +2584,13 @@ impl { - debug!("{coin_id:?} is a game spend"); Some(ConditionWaitKind::Game) } _ => None, }; + debug!("{} coin puzzle and solution {coin_id:?} = {state_coin_id:?}", player_ch.is_initial_potato()); + match state_coin_id { Some(ConditionWaitKind::Channel(state_coin_id)) => { if *coin_id == state_coin_id { diff --git a/src/referee.rs b/src/referee.rs index 5d32336e..50353d18 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -1746,9 +1746,17 @@ impl RefereeMaker { }; if repeat { + let nil = allocator.allocator().null(); debug!("rems in spend {conditions:?}"); debug!("current state {:?}", self.state); - debug!("stored state number {}", self.old_states[self.old_states.len()-1].state_number); + return Ok(TheirTurnCoinSpentResult::Moved { + new_coin_string: CoinString::from_parts( + &coin_string.to_coin_id(), + &after_puzzle_hash, + &self.fixed.amount, + ), + readable: ReadableMove::from_nodeptr(allocator, nil)? + }); } // Read parameters off conditions @@ -1813,10 +1821,6 @@ impl RefereeMaker { }; let state = self.state.clone(); - if repeat { - self.state = self.old_states[self.old_states.len() - 2].state.clone(); - debug!("repeat {repeat} new state {:?}", self.state); - } let result = self.their_turn_move_off_chain( allocator, &details, @@ -1858,17 +1862,6 @@ impl RefereeMaker { } }; - let dont_enforce = |allocator: &mut AllocEncoder, readable_move: NodePtr| { - Ok(TheirTurnCoinSpentResult::Moved { - new_coin_string: CoinString::from_parts( - &coin_string.to_coin_id(), - &new_puzzle_hash, - &self.fixed.amount, - ), - readable: ReadableMove::from_nodeptr(allocator, readable_move)?, - }) - }; - debug!("referee move details {details:?}"); let final_result = match result.original { TheirTurnResult::Slash(evidence, sig) => { @@ -1885,18 +1878,10 @@ impl RefereeMaker { ); } TheirTurnResult::FinalMove(readable_move) => { - if repeat { - dont_enforce(allocator, readable_move) - } else { - check_and_report_slash(allocator, readable_move) - } + check_and_report_slash(allocator, readable_move) } TheirTurnResult::MakeMove(readable_move, _, _) => { - if repeat { - dont_enforce(allocator, readable_move) - } else { - check_and_report_slash(allocator, readable_move) - } + check_and_report_slash(allocator, readable_move) } }; self.state = state; From 8340a721b543c9b7d3d894888f7940af407f6489 Mon Sep 17 00:00:00 2001 From: arty Date: Thu, 12 Dec 2024 11:10:52 -0800 Subject: [PATCH 08/50] Reaching accept state on chain --- clsp/calpoker_include_calpoker_factory.hex | 2 +- ...calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- ...alpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/calpoker/a.hex | 2 +- clsp/onchain/calpoker/b.hex | 2 +- clsp/onchain/calpoker/c.clsp | 2 +- clsp/onchain/calpoker/c.hex | 2 +- clsp/onchain/calpoker/d.clsp | 8 +- clsp/onchain/calpoker/d.hex | 2 +- clsp/onchain/referee.clsp | 50 ++++++++-- clsp/onchain/referee.hex | 2 +- src/potato_handler.rs | 7 +- src/referee.rs | 98 ++++++++++++++++--- src/tests/referee.rs | 33 ++++--- 15 files changed, 165 insertions(+), 51 deletions(-) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 5ab302a9..75dd8045 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff5bffff01808080ffff04ffff09ff5bffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa01144de5f9457246d94b2d136879e3058006d6d5aeea03967db81b2035905df45ff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 69b8350c..9b90a0f6 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a00b396420532320ca14c939388f45e582e46a73f4e15af03410df31758c38378b \ No newline at end of file +a0e5154df052fcb3719c469878b56d0e1e19e564e0208f9394e269f48fb5e8c988 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index 5102d6ab..5e2acffd 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa01144de5f9457246d94b2d136879e3058006d6d5aeea03967db81b2035905df45ff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff5bffff01808080ffff04ffff09ff5bffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa01144de5f9457246d94b2d136879e3058006d6d5aeea03967db81b2035905df45ff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index d7ea2a86..2e17f95f 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a07c47f8ffca21f2a2a5b01439b721a87c86484a948ef451a020de3e92ede3e942 \ No newline at end of file +a0b887641f3a15295401d78ce837176e41ec13c04b913d9d433848baa654ecc969 \ No newline at end of file diff --git a/clsp/onchain/calpoker/a.hex b/clsp/onchain/calpoker/a.hex index 744f695d..9b3d5835 100644 --- a/clsp/onchain/calpoker/a.hex +++ b/clsp/onchain/calpoker/a.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0ed95dbbbde5ab95529f87a01fcace3b7a95021ca9fc5376f5d359d5a1a252224ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/b.hex b/clsp/onchain/calpoker/b.hex index aeea7d15..b1a341ab 100644 --- a/clsp/onchain/calpoker/b.hex +++ b/clsp/onchain/calpoker/b.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0580552caf205956251e0db886e0c04abe8b2eefe3f1e5279b77fbd6331f05230ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.clsp b/clsp/onchain/calpoker/c.clsp index 7695edbe..771e4f3d 100644 --- a/clsp/onchain/calpoker/c.clsp +++ b/clsp/onchain/calpoker/c.clsp @@ -13,7 +13,7 @@ ; state is alice's commit and bob's seed ; move is alice's reveal of her card generating seed and her commit to which cards she's picking ; evidence is empty -(export (@ all_args (mod_hash (move new_validation_hash max_move_size mover_share previous_validation_hash +(export (@ all_args (mod_hash (move new_validation_hash mover_share previous_validation_hash mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (alice_commit bob_seed) me mover_puzzle solution evidence)) (if_any_fail diff --git a/clsp/onchain/calpoker/c.hex b/clsp/onchain/calpoker/c.hex index dfec19c4..b3b1f480 100644 --- a/clsp/onchain/calpoker/c.hex +++ b/clsp/onchain/calpoker/c.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a09517df8d80a448d69206d999e7219d84798e90af04ecc4cf56d68555f681a6e7ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff820bfb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff5bffff01808080ffff04ffff09ff5bffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/d.clsp b/clsp/onchain/calpoker/d.clsp index 28c0d9c5..2d2c440a 100644 --- a/clsp/onchain/calpoker/d.clsp +++ b/clsp/onchain/calpoker/d.clsp @@ -12,14 +12,14 @@ ; state is the cards for both players and alice's card pick commitment ; move is Bob's picks ; evidence is empty -(export (mod_hash (bob_picks new_validation_hash max_move_size mover_share previous_validation_hash +(export (mod_hash (bob_picks new_validation_hash mover_share previous_validation_hash mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (cards alice_commit) me mover_puzzle solution evidence) (if_any_fail (print (list "poker d" bob_picks) (= (strlen bob_picks) 1)) - (= (popcount bob_picks) 4) - (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) - (= max_move_size 18) + (print "check popcount" (= (popcount bob_picks) 4)) + (print (list "check validation hash" new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit))))) + (print (list "check new max move size" max_move_size) (= max_move_size 17)) 0 (x) ) diff --git a/clsp/onchain/calpoker/d.hex b/clsp/onchain/calpoker/d.hex index 6202c15a..9613b822 100644 --- a/clsp/onchain/calpoker/d.hex +++ b/clsp/onchain/calpoker/d.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff5bffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index 3c054598..2070b722 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -11,20 +11,32 @@ (import std.print) (import onchain.game_codes) +; ; Adjudicates a two player turn based game +; ; MOVE, VALIDATION_HASH and MOVER_SHARE were all accepted optimistically from the last move ; Both VALIDATION_HASH values are a sha256 of a validation program hash and the shatree of a state +; ; The next validation program hash may be nil which means no futher moves are allowed ; MOVER_SHARE is how much the mover will get if they fold/accept ; MOD_HASH should be the shatree of referee itself ; NONCE is for anti-replay prevention +; ; If action is timeout args is nil -; If action is slash args is (state validation_program mover_puzzle solution evidence) +; +; If action is slash args is (move state me validation_program mover_puzzle solution evidence) +; ; If action is move args is (new_move new_validation_info_hash new_mover_share mover_puzzle solution) +; ; validation programs get passed this: -; ((last_move next_validation_hash my_share me_hash my_puzzle_hash opponent_puzzle_hash -; amount timeout max_move_size referee_hash) -; state me mover_puzzle solution evidence) +; +; (mod_hash +; (move new_validation_hash max_move_size mover_share previous_validation_hash +; mover_puzzle_hash waiter_puzzle_hash amount timeout referee_hash +; ) +; state me mover_puzzle solution evidence +; ) +; (export (@ all_args ((MOVER_PUZZLE_HASH WAITER_PUZZLE_HASH TIMEOUT AMOUNT MOD_HASH NONCE MOVE MAX_MOVE_SIZE VALIDATION_INFO_HASH MOVER_SHARE PREVIOUS_VALIDATION_INFO_HASH) . args)) (if (not args) @@ -37,8 +49,9 @@ (l (f (r args))) ; slash (assign - (previous_state previous_validation_program mover_puzzle solution evidence) args + (previous_state me previous_validation_program mover_puzzle solution evidence) args previous_validation_program_hash (shatree previous_validation_program) + (assert (= MOVER_PUZZLE_HASH (shatree mover_puzzle)) (= PREVIOUS_VALIDATION_INFO_HASH (sha256 previous_validation_program_hash (shatree @@ -49,8 +62,31 @@ ; The conditions returned by previous_validation_program ; The conditions returned by mover_puzzle (c (list REMARK) - (concat (a previous_validation_program (c previous_validation_program_hash all_args)) - (a mover_puzzle solution)) + (concat + (a previous_validation_program + (c previous_validation_program_hash + (c + (list + ;; The items from the onchain validators in + ;; clsp/onchain/calpoker/a-e.clsp + ;; (and above at line 33) + MOVE + VALIDATION_INFO_HASH + MOVER_SHARE + PREVIOUS_VALIDATION_INFO_HASH + MOVER_PUZZLE_HASH + WAITER_PUZZLE_HASH + AMOUNT + TIMEOUT + MAX_MOVE_SIZE + MOD_HASH ; referee_hash + ) + args + ) + ) + ) + (a mover_puzzle solution) + ) ) ) ) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index a5c6169a..cec9f6da 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff2bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8200b5ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff55ffff04ff0bff098080ffff04ffff02ff8200b5ff82017580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018c726566657265652064617461ffff04ff09ff808080ffff04ff822ff1ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff01867374726c656effff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018b6c6f67696f722074657374ffff04ffff19ffff20ff558080ffff01808080ffff04ffff09ffff0120ffff0dff558080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019a6d61746368696e67206d6f7665722070757a7a6c652068617368ffff04ff21ffff04ffff02ff12ffff04ff02ffff04ff8202f5ff80808080ffff0180808080ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018f6d61746368696e67206f7574707574ffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018c726566657265652064617461ffff04ff09ff808080ffff04ff822ff1ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff01867374726c656effff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018b6c6f67696f722074657374ffff04ffff19ffff20ff558080ffff01808080ffff04ffff09ffff0120ffff0dff558080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019a6d61746368696e67206d6f7665722070757a7a6c652068617368ffff04ff21ffff04ffff02ff12ffff04ff02ffff04ff8202f5ff80808080ffff0180808080ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018f6d61746368696e67206f7574707574ffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 08c1f5de..0e3ff2f9 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1930,7 +1930,12 @@ impl PotatoHandler { )?; Ok(()) } - _ => todo!(), + GameAction::Accept(game_id) => { + + } + x => { + todo!("unexpected move type {x:?}"); + } } } else { Err(Error::StrErr("not on chain".to_string())) diff --git a/src/referee.rs b/src/referee.rs index 50353d18..5f931f70 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -314,7 +314,6 @@ impl ValidatorMoveArgs { pub fn to_nodeptr(&self, allocator: &mut AllocEncoder, me: NodePtr) -> Result { let args: &[NodePtr] = &[ self.state, - me, self.mover_puzzle.to_clvm(allocator).into_gen()?, self.solution, self.evidence @@ -324,6 +323,69 @@ impl ValidatorMoveArgs { } } +struct InternalValidatorArgs { + move_made: Vec, + new_validation_info_hash: Hash, + mover_share: Amount, + previous_validation_info_hash: Hash, + mover_puzzle_hash: PuzzleHash, + waiter_puzzle_hash: PuzzleHash, + amount: Amount, + timeout: Timeout, + max_move_size: usize, + referee_hash: PuzzleHash, +} + +impl InternalValidatorArgs { + pub fn to_nodeptr( + &self, + allocator: &mut AllocEncoder, + me: NodePtr, + validator_mod_hash: PuzzleHash, + move_args: &ValidatorMoveArgs + ) -> Result { + let converted_vma = move_args.to_nodeptr(allocator, me)?; + let move_node = allocator.encode_atom(&self.move_made).into_gen()?; + ( + validator_mod_hash, + ( + ( + Node(move_node), + ( + self.new_validation_info_hash.clone(), + ( + self.mover_share.clone(), + ( + self.previous_validation_info_hash.clone(), + ( + self.mover_puzzle_hash.clone(), + ( + self.waiter_puzzle_hash.clone(), + ( + self.amount.clone(), + ( + self.timeout.clone(), + ( + self.max_move_size, + ( + self.referee_hash.clone(), + () + ) + ) + ) + ) + ) + ) + ) + ) + ) + ), + Node(converted_vma) + ) + ).to_clvm(allocator).into_gen() + } +} + #[allow(dead_code)] pub enum Validation { ValidationByState(ValidationInfo), @@ -1357,7 +1419,8 @@ impl RefereeMaker { pub fn run_validator_for_their_move( &self, allocator: &mut AllocEncoder, - validator_move_args: &ValidatorMoveArgs, + validator_move_args: &InternalValidatorArgs, + move_args: &ValidatorMoveArgs, ) -> Result { let referee_args = self.spend_this_coin(); let referee_list = referee_args.to_node_list( @@ -1367,18 +1430,13 @@ impl RefereeMaker { let (_state, validation_program) = self.get_validation_program_for_their_move()?; let validation_program_nodeptr = validation_program.to_nodeptr(); let validation_program_hexer = Program::from_nodeptr(allocator, validation_program_nodeptr)?; - let validator_move_converted = validator_move_args.to_nodeptr( + let validation_program_mod_hash = validation_program.hash(); + let validator_full_args_node = validator_move_args.to_nodeptr( allocator, - validation_program_nodeptr + validation_program_nodeptr, + PuzzleHash::from_hash(validation_program_mod_hash.clone()), + &move_args, )?; - let mod_hash = validation_program.hash(); - let validator_full_args_node = ( - mod_hash, - ( - referee_list, - Node(validator_move_converted) - ) - ).to_clvm(allocator).into_gen()?; let validator_full_args = Program::from_nodeptr(allocator, validator_full_args_node)?; debug!("validator program {:?}", validation_program_hexer); @@ -1651,6 +1709,7 @@ impl RefereeMaker { coin_string: &CoinString, _state_number: usize, ) -> Result, Error> { + let previous_puzzle_args = self.args_for_this_coin(); let puzzle_args = self.spend_this_coin(); let new_puzzle = curry_referee_puzzle( allocator, @@ -1658,7 +1717,6 @@ impl RefereeMaker { &self.fixed.referee_coin_puzzle_hash, &puzzle_args, )?; - // assert_ne!(self.args_for_this_coin().game_move, puzzle_args.game_move); let new_puzzle_hash = curry_referee_puzzle_hash( allocator, @@ -1679,11 +1737,25 @@ impl RefereeMaker { ) .expect("should create"), }; + let internal_validator_args = InternalValidatorArgs { + move_made: puzzle_args.game_move.basic.move_made.clone(), + new_validation_info_hash: puzzle_args.game_move.validation_info_hash.clone(), + mover_share: puzzle_args.game_move.basic.mover_share.clone(), + previous_validation_info_hash: previous_puzzle_args.game_move.validation_info_hash.clone(), + mover_puzzle_hash: puzzle_args.mover_puzzle_hash.clone(), + waiter_puzzle_hash: puzzle_args.waiter_puzzle_hash.clone(), + amount: self.fixed.amount.clone(), + timeout: self.fixed.timeout.clone(), + max_move_size: puzzle_args.game_move.basic.max_move_size, + referee_hash: new_puzzle_hash.clone(), + }; + debug!("max_move_size {}", internal_validator_args.max_move_size); // my_inner_solution maker is just in charge of making aggsigs from // conditions. let full_slash_result = self.run_validator_for_their_move( allocator, + &internal_validator_args, &validator_args, ); match full_slash_result { diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 476122b6..229ebed5 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -268,20 +268,21 @@ fn test_referee_smoke() { .expect("should create"), }; - let validator_result = reftest - .their_referee - .run_validator_for_their_move(&mut allocator, &validator_move_args); - assert!(validator_result.is_err()); - - assert!(reftest.my_referee.processing_my_turn()); - let their_move_result = reftest - .my_referee - .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0, true) - .expect("should run"); - assert_eq!(their_move_result.message, b"message data"); - assert_eq!( - disassemble(allocator.allocator(), their_move_result.readable_move, None), - "(())" - ); - assert!(!reftest.my_referee.processing_my_turn()); + todo!(); + // let validator_result = reftest + // .their_referee + // .run_validator_for_their_move(&mut allocator, &validator_move_args); + // assert!(validator_result.is_err()); + + // assert!(reftest.my_referee.processing_my_turn()); + // let their_move_result = reftest + // .my_referee + // .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0, true) + // .expect("should run"); + // assert_eq!(their_move_result.message, b"message data"); + // assert_eq!( + // disassemble(allocator.allocator(), their_move_result.readable_move, None), + // "(())" + // ); + // assert!(!reftest.my_referee.processing_my_turn()); } From d5d25dd9a61e099be232ee3c911d08ddb7354cf3 Mon Sep 17 00:00:00 2001 From: arty Date: Thu, 12 Dec 2024 11:28:18 -0800 Subject: [PATCH 09/50] Prepare for clippy and fmt --- clsp/onchain/referee.clsp | 13 ++++++------- clsp/onchain/referee.hex | 2 +- src/channel_handler/mod.rs | 12 ++++++------ src/potato_handler.rs | 3 --- src/referee.rs | 3 +-- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index 2070b722..e9682088 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -8,7 +8,6 @@ (import std.condition_codes) (import std.match) (import std.li) -(import std.print) (import onchain.game_codes) ; @@ -98,19 +97,19 @@ VALIDATION_INFO_HASH))) conditions (a mover_puzzle solution) (assert - (print (list "referee data" all_args) VALIDATION_INFO_HASH) - (print (list "strlen" new_move MAX_MOVE_SIZE) (<= (strlen new_move) MAX_MOVE_SIZE)) + VALIDATION_INFO_HASH + (<= (strlen new_move) MAX_MOVE_SIZE) (<= new_mover_share AMOUNT) (>= new_mover_share 0) - (print (list "logior test" (logior (not new_validation_info_hash))) (= 32 (strlen new_validation_info_hash))) - (print (list "matching mover puzzle hash" MOVER_PUZZLE_HASH (shatree mover_puzzle)) (= MOVER_PUZZLE_HASH (shatree mover_puzzle))) + (logior (not new_validation_info_hash) (= 32 (strlen new_validation_info_hash))) + (= MOVER_PUZZLE_HASH (shatree mover_puzzle)) ; Check that the child output is made - (print "matching output" (match + (match (lambda ((& new_puzzle_hash AMOUNT) (condname arg1 arg2)) (logand (= condname CREATE_COIN) (= arg1 new_puzzle_hash) (= arg2 AMOUNT)) ) conditions - )) + ) (li (list REMARK new_move new_validation_info_hash new_mover_share new_max_move_size) (list ASSERT_BEFORE_HEIGHT_RELATIVE TIMEOUT) &rest conditions) ) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index cec9f6da..1f153f85 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018c726566657265652064617461ffff04ff09ff808080ffff04ff822ff1ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff01867374726c656effff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018b6c6f67696f722074657374ffff04ffff19ffff20ff558080ffff01808080ffff04ffff09ffff0120ffff0dff558080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019a6d61746368696e67206d6f7665722070757a7a6c652068617368ffff04ff21ffff04ffff02ff12ffff04ff02ffff04ff8202f5ff80808080ffff0180808080ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018f6d61746368696e67206f7574707574ffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff2cffff04ff02ffff04ffff05ff0580ffff04ffff02ff18ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ffff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff2cffff04ff02ffff04ff05ffff04ffff02ff18ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff3cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff14ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0dff2580ff8217f18080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ffff01ff02ffff01ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index a27ffd60..02d3da2d 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -1463,12 +1463,12 @@ impl ChannelHandler { entropy: Hash, existing_coin: &CoinString, ) -> Result< - ( - PuzzleHash, - PuzzleHash, - GameMoveDetails, - RefereeOnChainTransaction, - ), + ( + PuzzleHash, + PuzzleHash, + GameMoveDetails, + RefereeOnChainTransaction, + ), Error, > { debug!( diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 0e3ff2f9..2ba5b03f 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1929,9 +1929,6 @@ impl PotatoHandler { Some("post redo game coin") )?; Ok(()) - } - GameAction::Accept(game_id) => { - } x => { todo!("unexpected move type {x:?}"); diff --git a/src/referee.rs b/src/referee.rs index 5f931f70..84e547ee 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -323,7 +323,7 @@ impl ValidatorMoveArgs { } } -struct InternalValidatorArgs { +pub struct InternalValidatorArgs { move_made: Vec, new_validation_info_hash: Hash, mover_share: Amount, @@ -1749,7 +1749,6 @@ impl RefereeMaker { max_move_size: puzzle_args.game_move.basic.max_move_size, referee_hash: new_puzzle_hash.clone(), }; - debug!("max_move_size {}", internal_validator_args.max_move_size); // my_inner_solution maker is just in charge of making aggsigs from // conditions. From ef6e71cb92a85477304d5a4c2b0cb05f0e7f7093 Mon Sep 17 00:00:00 2001 From: arty Date: Thu, 12 Dec 2024 13:46:58 -0800 Subject: [PATCH 10/50] Checkpoint clippy+fmt --- src/channel_handler/game.rs | 10 +- src/channel_handler/game_handler.rs | 24 ++- src/channel_handler/mod.rs | 93 +++++------ src/channel_handler/types.rs | 32 ++-- src/common/types.rs | 18 ++- src/potato_handler.rs | 223 +++++++++++++-------------- src/referee.rs | 181 ++++++++++------------ src/simulator.rs | 1 - src/tests/channel_handler.rs | 6 +- src/tests/chialisp.rs | 2 +- src/tests/game_handler.rs | 20 +-- src/tests/peer/potato_handler_sim.rs | 6 +- src/tests/referee.rs | 13 +- src/tests/simenv.rs | 4 +- 14 files changed, 320 insertions(+), 313 deletions(-) diff --git a/src/channel_handler/game.rs b/src/channel_handler/game.rs index 23e37fe0..c51180a5 100644 --- a/src/channel_handler/game.rs +++ b/src/channel_handler/game.rs @@ -8,8 +8,8 @@ use crate::channel_handler::types::ValidationProgram; use crate::channel_handler::GameStartInfo; use crate::common::standard_coin::read_hex_puzzle; use crate::common::types::{ - atom_from_clvm, u64_from_atom, usize_from_atom, AllocEncoder, Amount, Error, GameID, Hash, - IntoErr, Timeout, chia_dialect + atom_from_clvm, chia_dialect, u64_from_atom, usize_from_atom, AllocEncoder, Amount, Error, + GameID, Hash, IntoErr, Timeout, }; pub struct Game { @@ -58,8 +58,10 @@ impl Game { )); } - let initial_mover_handler = GameHandler::my_driver_from_nodeptr(allocator, template_list[0])?; - let initial_waiter_handler = GameHandler::their_driver_from_nodeptr(allocator, template_list[1])?; + let initial_mover_handler = + GameHandler::my_driver_from_nodeptr(allocator, template_list[0])?; + let initial_waiter_handler = + GameHandler::their_driver_from_nodeptr(allocator, template_list[1])?; let whether_paired = atom_from_clvm(allocator, template_list[2]) .map(|a| !a.is_empty()) .expect("should be an atom"); diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 54fc0f4a..5cdf54ec 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -22,8 +22,8 @@ use log::debug; use crate::channel_handler::types::{Evidence, ReadableMove, ValidationInfo, ValidationProgram}; use crate::common::types::{ - atom_from_clvm, u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, Error, Hash, - IntoErr, Node, Program, chia_dialect + atom_from_clvm, chia_dialect, u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, + Error, Hash, IntoErr, Node, Program, }; use crate::referee::{GameMoveDetails, GameMoveStateInfo}; @@ -171,11 +171,21 @@ pub enum TheirTurnResult { } impl GameHandler { - pub fn their_driver_from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { - Ok(GameHandler::TheirTurnHandler(Rc::new(Program::from_nodeptr(allocator, n)?))) + pub fn their_driver_from_nodeptr( + allocator: &mut AllocEncoder, + n: NodePtr, + ) -> Result { + Ok(GameHandler::TheirTurnHandler(Rc::new( + Program::from_nodeptr(allocator, n)?, + ))) } - pub fn my_driver_from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { - Ok(GameHandler::MyTurnHandler(Rc::new(Program::from_nodeptr(allocator, n)?))) + pub fn my_driver_from_nodeptr( + allocator: &mut AllocEncoder, + n: NodePtr, + ) -> Result { + Ok(GameHandler::MyTurnHandler(Rc::new(Program::from_nodeptr( + allocator, n, + )?))) } pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { match self { @@ -191,7 +201,6 @@ impl GameHandler { if let GameHandler::MyTurnHandler(res) = self { res.to_nodeptr(allocator) } else { - todo!(); Err(Error::StrErr( "my turn called on a their turn driver".to_string(), )) @@ -202,7 +211,6 @@ impl GameHandler { if let GameHandler::TheirTurnHandler(res) = self { res.to_nodeptr(allocator) } else { - todo!(); Err(Error::StrErr( "my turn called on a their turn driver".to_string(), )) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 02d3da2d..215caf15 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -19,11 +19,11 @@ use crate::channel_handler::types::{ CachedPotatoRegenerateLastHop, ChannelCoin, ChannelCoinInfo, ChannelCoinSpendInfo, ChannelCoinSpentResult, ChannelHandlerEnv, ChannelHandlerInitiationData, ChannelHandlerInitiationResult, ChannelHandlerPrivateKeys, ChannelHandlerUnrollSpendInfo, - CoinDataForReward, CoinSpentAccept, CoinSpentDisposition, CoinSpentMoveUp, CoinSpentResult, - DispositionResult, GameStartInfo, HandshakeResult, LiveGame, MoveResult, OnChainGameCoin, - OnChainGameState, PotatoAcceptCachedData, PotatoMoveCachedData, PotatoSignatures, ReadableMove, - UnrollCoin, UnrollCoinConditionInputs, UnrollTarget, CoinSpentInformation, - CoinIdentificationByPuzzleHash, + CoinDataForReward, CoinSpentAccept, CoinSpentDisposition, + CoinSpentInformation, CoinSpentMoveUp, CoinSpentResult, DispositionResult, GameStartInfo, + HandshakeResult, LiveGame, MoveResult, OnChainGameCoin, OnChainGameState, + PotatoAcceptCachedData, PotatoMoveCachedData, PotatoSignatures, ReadableMove, UnrollCoin, + UnrollCoinConditionInputs, UnrollTarget, }; use crate::common::constants::CREATE_COIN; use crate::common::standard_coin::{ @@ -36,9 +36,7 @@ use crate::common::types::{ PuzzleHash, Sha256tree, Spend, SpendRewardResult, Timeout, ToQuotedProgram, }; use crate::potato_handler::GameAction; -use crate::referee::{ - GameMoveDetails, RefereeMaker, RefereeOnChainTransaction, -}; +use crate::referee::{GameMoveDetails, RefereeMaker, RefereeOnChainTransaction}; /// A channel handler runs the game by facilitating the phases of game startup /// and passing on move information as well as termination to other layers. @@ -803,7 +801,7 @@ impl ChannelHandler { &CoinString::from_parts( &CoinID::default(), &PuzzleHash::default(), - &Amount::default() + &Amount::default(), ), &env.agg_sig_me_additional_data, false, @@ -1427,7 +1425,10 @@ impl ChannelHandler { &live_game.get_amount(), ); - debug!("{initial_potato} new game coin {coin_id:?} for game_id {:?}", live_game.game_id); + debug!( + "{initial_potato} new game coin {coin_id:?} for game_id {:?}", + live_game.game_id + ); res.insert( coin_id, OnChainGameState { @@ -1463,12 +1464,12 @@ impl ChannelHandler { entropy: Hash, existing_coin: &CoinString, ) -> Result< - ( - PuzzleHash, - PuzzleHash, - GameMoveDetails, - RefereeOnChainTransaction, - ), + ( + PuzzleHash, + PuzzleHash, + GameMoveDetails, + RefereeOnChainTransaction, + ), Error, > { debug!( @@ -1483,12 +1484,6 @@ impl ChannelHandler { let last_puzzle_hash = self.live_games[game_idx].last_puzzle_hash(); let start_puzzle_hash = self.live_games[game_idx].current_puzzle_hash(env.allocator)?; let end_puzzle_hash = self.live_games[game_idx].outcome_puzzle_hash(env.allocator)?; - let existing_ph = - if let Some((_, existing_ph, _)) = existing_coin.to_parts() { - existing_ph - } else { - return Err(Error::StrErr("broken coin".to_string())); - }; debug!("last puzzle hash {last_puzzle_hash:?}"); debug!("start puzzle hash {start_puzzle_hash:?}"); @@ -1536,9 +1531,7 @@ impl ChannelHandler { coin_string: &CoinString, ) -> Result { let live_game_idx = self.get_game_by_id(game_id)?; - let game_puzzle_hash = self.live_games[live_game_idx].outcome_puzzle_hash(env.allocator)?; let prev_puzzle_hash = self.live_games[live_game_idx].current_puzzle_hash(env.allocator)?; - let last_puzzle_hash = self.live_games[live_game_idx].last_puzzle_hash(); if !self.live_games[live_game_idx].processing_my_turn() { return Ok(false); } @@ -1555,7 +1548,7 @@ impl ChannelHandler { env: &mut ChannelHandlerEnv, game_id: &GameID, coin_string: &CoinString, - conditions: &[CoinCondition] + conditions: &[CoinCondition], ) -> Result { debug!( "{} GAME COIN SPENT {:?} {:?} {:?}", @@ -1567,36 +1560,37 @@ impl ChannelHandler { let live_game_idx = self.get_game_by_id(game_id)?; let referee_pk = private_to_public_key(&self.referee_private_key()); - let game_puzzle_hash = self.live_games[live_game_idx].outcome_puzzle_hash(env.allocator)?; - let prev_puzzle_hash = self.live_games[live_game_idx].current_puzzle_hash(env.allocator)?; - let last_puzzle_hash = self.live_games[live_game_idx].last_puzzle_hash(); let reward_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; - let (ph, amt) = - if let Some((ph, amt)) = conditions.iter().filter_map(|c| { + let (ph, amt) = if let Some((ph, amt)) = conditions + .iter() + .filter_map(|c| { if let CoinCondition::CreateCoin(ph, amt) = c { return Some((ph.clone(), amt.clone())); } None - }).next() { - (ph, amt) - } else { - return Err(Error::StrErr("bad coin".to_string())); - }; + }) + .next() + { + (ph, amt) + } else { + return Err(Error::StrErr("bad coin".to_string())); + }; if reward_puzzle_hash == ph { debug!("was our turn, reward {ph:?} {amt:?}"); return Ok(CoinSpentInformation::OurReward(ph.clone(), amt.clone())); } - Ok(CoinSpentInformation::TheirSpend(self.live_games[live_game_idx].their_turn_coin_spent( - env.allocator, - coin_string, - conditions, - self.current_state_number, - false, - )?)) + Ok(CoinSpentInformation::TheirSpend( + self.live_games[live_game_idx].their_turn_coin_spent( + env.allocator, + coin_string, + conditions, + self.current_state_number, + )?, + )) } pub fn get_redo_action( @@ -1633,7 +1627,10 @@ impl ChannelHandler { "{} have cached move {move_data:?}", self.is_initial_potato() ); - debug!("redo if move matches puzzle hash {:?}", move_data.match_puzzle_hash); + debug!( + "redo if move matches puzzle hash {:?}", + move_data.match_puzzle_hash + ); debug!("redo for coin {coin:?}"); if let Some(rewind_state) = self.live_games[game_idx].get_rewind_outcome() { @@ -1641,11 +1638,17 @@ impl ChannelHandler { debug!("{} getting redo move: move_data.state_number {} rewind_state {rewind_state}", self.is_initial_potato(), move_data.state_number); let rewind_ph = self.live_games[game_idx].current_puzzle_hash(env.allocator)?; if self.live_games[game_idx].is_my_turn() { - debug!("{} not matched rewind state {new_ph:?} vs {rewind_ph:?}", self.is_initial_potato()); + debug!( + "{} not matched rewind state {new_ph:?} vs {rewind_ph:?}", + self.is_initial_potato() + ); return Ok(None); } - debug!("{} matched rewind state {new_ph:?} vs {rewind_ph:?}", self.is_initial_potato()); + debug!( + "{} matched rewind state {new_ph:?} vs {rewind_ph:?}", + self.is_initial_potato() + ); let transaction = self.live_games[game_idx].get_transaction_for_move( env.allocator, coin, diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 14070425..af3e489c 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -23,9 +23,9 @@ use crate::common::standard_coin::{ unsafe_sign_partial, }; use crate::common::types::{ - atom_from_clvm, usize_from_atom, Aggsig, AllocEncoder, Amount, BrokenOutCoinSpendInfo, CoinID, - CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, PrivateKey, Program, PublicKey, - Puzzle, PuzzleHash, Sha256Input, Sha256tree, Spend, Timeout, CoinCondition, + atom_from_clvm, usize_from_atom, Aggsig, AllocEncoder, Amount, BrokenOutCoinSpendInfo, + CoinCondition, CoinID, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, PrivateKey, + Program, PublicKey, Puzzle, PuzzleHash, Sha256Input, Sha256tree, Spend, Timeout, }; use crate::referee::{ GameMoveDetails, GameMoveWireData, RefereeMaker, RefereeOnChainTransaction, @@ -75,10 +75,7 @@ pub struct PotatoSignatures { } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct GenericGameStartInfo< - VP: std::fmt::Debug + Clone, - S: std::fmt::Debug + Clone, -> { +pub struct GenericGameStartInfo { pub game_id: GameID, pub amount: Amount, pub game_handler: GameHandler, @@ -1030,9 +1027,11 @@ impl LiveGame { state_number: usize, ) -> Result { assert!(!self.referee_maker.is_my_turn()); - let their_move_result = - self.referee_maker - .their_turn_move_off_chain(allocator, game_move, state_number, true)?; + let their_move_result = self.referee_maker.their_turn_move_off_chain( + allocator, + game_move, + state_number, + )?; self.last_referee_puzzle_hash = their_move_result.puzzle_hash_for_unroll.clone(); Ok(their_move_result) } @@ -1075,11 +1074,14 @@ impl LiveGame { coin_string: &CoinString, conditions: &[CoinCondition], current_state: usize, - expected: bool, ) -> Result { // assert!(self.referee_maker.processing_my_turn()); - let res = self.referee_maker - .their_turn_coin_spent(allocator, coin_string, conditions, current_state, expected)?; + let res = self.referee_maker.their_turn_coin_spent( + allocator, + coin_string, + conditions, + current_state, + )?; self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; Ok(res) } @@ -1095,7 +1097,9 @@ impl LiveGame { let referee_puzzle_hash = self.referee_maker.on_chain_referee_puzzle_hash(allocator)?; debug!("live game: current state is {referee_puzzle_hash:?} want {want_ph:?}"); - let result = self.referee_maker.rewind(allocator, want_ph, current_state)?; + let result = self + .referee_maker + .rewind(allocator, want_ph)?; if let Some(current_state) = &result { self.rewind_outcome = Some(*current_state); self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; diff --git a/src/common/types.rs b/src/common/types.rs index fdd19e64..88de173d 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -18,12 +18,12 @@ use sha2::{Digest, Sha256}; use clvmr::allocator::{Allocator, NodePtr, SExp}; use clvmr::reduction::EvalErr; use clvmr::serde::{node_from_bytes, node_to_bytes}; -use clvmr::{ChiaDialect, run_program, NO_UNKNOWN_OPS}; +use clvmr::{run_program, ChiaDialect, NO_UNKNOWN_OPS}; use clvm_tools_rs::classic::clvm::sexp::proper_list; use clvm_tools_rs::classic::clvm::syntax_error::SyntaxErr; -use clvm_tools_rs::classic::clvm_tools::sha256tree::sha256tree; use clvm_tools_rs::classic::clvm_tools::binutils::disassemble; +use clvm_tools_rs::classic::clvm_tools::sha256tree::sha256tree; use crate::common::constants::{AGG_SIG_ME_ATOM, AGG_SIG_UNSAFE_ATOM, CREATE_COIN_ATOM, REM_ATOM}; @@ -965,7 +965,11 @@ fn parse_condition(allocator: &mut AllocEncoder, condition: NodePtr) -> Option> = exploded .iter() .map(|a| allocator.allocator().atom(*a).to_vec()) @@ -993,7 +997,11 @@ impl CoinCondition { } } - pub fn from_puzzle_and_solution(allocator: &mut AllocEncoder, puzzle: &Program, solution: &Program) -> Result, Error> { + pub fn from_puzzle_and_solution( + allocator: &mut AllocEncoder, + puzzle: &Program, + solution: &Program, + ) -> Result, Error> { let run_puzzle = puzzle.to_nodeptr(allocator)?; let run_args = solution.to_nodeptr(allocator)?; let conditions = run_program( @@ -1003,7 +1011,7 @@ impl CoinCondition { run_args, 0, ) - .into_gen()?; + .into_gen()?; debug!( "conditions to parse {}", disassemble(allocator.allocator(), conditions.1, None) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 2ba5b03f..b1176bf7 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -14,17 +14,17 @@ use serde::{Deserialize, Serialize}; use crate::channel_handler::types::{ ChannelCoinSpendInfo, ChannelHandlerEnv, ChannelHandlerInitiationData, - ChannelHandlerPrivateKeys, FlatGameStartInfo, GameStartInfo, MoveResult, OnChainGameState, - PotatoSignatures, PrintableGameStartInfo, ReadableMove, CoinSpentInformation, + ChannelHandlerPrivateKeys, CoinSpentInformation, FlatGameStartInfo, GameStartInfo, MoveResult, + OnChainGameState, PotatoSignatures, PrintableGameStartInfo, ReadableMove, }; use crate::channel_handler::ChannelHandler; use crate::common::standard_coin::{ private_to_public_key, puzzle_for_synthetic_public_key, puzzle_hash_for_pk, }; use crate::common::types::{ - Aggsig, AllocEncoder, Amount, CoinCondition, CoinID, CoinSpend, CoinString, Error, GameID, - Hash, IntoErr, Node, Program, PublicKey, Puzzle, PuzzleHash, Sha256Input, Sha256tree, Spend, - SpendBundle, Timeout, chia_dialect, + chia_dialect, Aggsig, AllocEncoder, Amount, CoinCondition, CoinID, CoinSpend, CoinString, + Error, GameID, Hash, IntoErr, Node, Program, PublicKey, Puzzle, PuzzleHash, Sha256Input, + Sha256tree, Spend, SpendBundle, Timeout, }; use crate::referee::{RefereeOnChainTransaction, TheirTurnCoinSpentResult}; use clvm_tools_rs::classic::clvm::sexp::proper_list; @@ -422,7 +422,12 @@ enum PotatoState { #[derive(Debug)] pub enum GameAction { Move(GameID, ReadableMove, Hash), - RedoMove(GameID, CoinString, PuzzleHash, Box), + RedoMove( + GameID, + CoinString, + PuzzleHash, + Box, + ), Accept(GameID), Shutdown(NodePtr), } @@ -1587,7 +1592,6 @@ impl PotatoHandler { { // Channel coin was spent so we're going on chain. assert!(!matches!(self.handshake_state, HandshakeState::StepA)); - let player_ch = self.channel_handler()?; let is_unroll_coin = match &self.handshake_state { HandshakeState::OnChainWaitingForUnrollSpend(unroll_coin) => coin_id == unroll_coin, HandshakeState::OnChainWaitingForUnrollTimeoutOrSpend(unroll_coin, _) => { @@ -1793,19 +1797,31 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - let (initial_potato, (old_ph, new_ph, move_result, transaction)) = - { + let (initial_potato, (old_ph, new_ph, move_result, transaction)) = { let player_ch = self.channel_handler_mut()?; let initial_potato = player_ch.is_initial_potato(); let my_turn = player_ch.game_is_my_turn(&game_id); if my_turn != Some(true) { debug!("{initial_potato} trying to do game action when not my turn"); - self.game_action_queue.push_front(GameAction::Move(game_id, readable_move, entropy)); + self.game_action_queue.push_front(GameAction::Move( + game_id, + readable_move, + entropy, + )); return Ok(()); } let (env, _system_interface) = penv.env(); - (initial_potato, player_ch.on_chain_our_move(env, &game_id, &readable_move, entropy, current_coin)?) + ( + initial_potato, + player_ch.on_chain_our_move( + env, + &game_id, + &readable_move, + entropy, + current_coin, + )?, + ) }; debug!("{initial_potato} old_ph {old_ph:?}"); @@ -1817,38 +1833,36 @@ impl PotatoHandler { debug!("{initial_potato} created puzzle hash for move {new_ph:?}"); // No mutable this borrows below. - let game_map = - if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { - game_map - } else { - return Err(Error::StrErr("not on chain".to_string())); - }; + let game_map = if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + game_map + } else { + return Err(Error::StrErr("not on chain".to_string())); + }; - let old_definition = - if let Some(old_def) = game_map.remove(¤t_coin) { - old_def - } else { - return Err(Error::StrErr("no such game".to_string())); - }; + let old_definition = if let Some(old_def) = game_map.remove(current_coin) { + old_def + } else { + return Err(Error::StrErr("no such game".to_string())); + }; - let new_coin = CoinString::from_parts( - ¤t_coin.to_coin_id(), - &new_ph, - &transaction.amount, - ); + let new_coin = + CoinString::from_parts(¤t_coin.to_coin_id(), &new_ph, &transaction.amount); self.my_game_spends.insert(new_ph.clone()); - game_map.insert(new_coin.clone(), OnChainGameState { - puzzle_hash: new_ph, - our_turn: false, - .. old_definition - }); + game_map.insert( + new_coin.clone(), + OnChainGameState { + puzzle_hash: new_ph, + our_turn: false, + ..old_definition + }, + ); - let (env, system_interface) = penv.env(); + let (_env, system_interface) = penv.env(); system_interface.register_coin( &new_coin, &self.channel_timeout, - Some("game coin for my turn") + Some("game coin for my turn"), )?; system_interface.spend_transaction_and_add_fee(&SpendBundle { @@ -1871,20 +1885,14 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - let initial_potato = - { - let player_ch = self.channel_handler()?; - player_ch.is_initial_potato() - }; - - if let HandshakeState::OnChain(game_map) = - &mut self.handshake_state - { + if let HandshakeState::OnChain(_game_map) = &mut self.handshake_state { match action { GameAction::Move(game_id, readable_move, hash) => { let current_coin = if let HandshakeState::OnChain(game_map) = &self.handshake_state { - if let Some((current, _game)) = game_map.iter().find(|g| g.1.game_id == game_id) { + if let Some((current, _game)) = + game_map.iter().find(|g| g.1.game_id == game_id) + { current.clone() } else { return Err(Error::StrErr("no matching game".to_string())); @@ -1899,7 +1907,10 @@ impl PotatoHandler { // Remember that we spent this one. { let player_ch = self.channel_handler()?; - debug!("{} created puzzle hash for redo {new_ph:?}", player_ch.is_initial_potato()); + debug!( + "{} created puzzle hash for redo {new_ph:?}", + player_ch.is_initial_potato() + ); self.my_game_spends.insert(new_ph.clone()); } let (_env, system_interface) = penv.env(); @@ -1911,22 +1922,17 @@ impl PotatoHandler { bundle: tx.bundle.clone(), }], })?; - let amt = - if let Some((_, _, amt)) = coin.to_parts() { - amt - } else { - return Err(Error::StrErr("bad coin".to_string())); - }; + let amt = if let Some((_, _, amt)) = coin.to_parts() { + amt + } else { + return Err(Error::StrErr("bad coin".to_string())); + }; - let new_coin = CoinString::from_parts( - &coin.to_coin_id(), - &new_ph, - &amt, - ); + let new_coin = CoinString::from_parts(&coin.to_coin_id(), &new_ph, &amt); system_interface.register_coin( &new_coin, &self.channel_timeout, - Some("post redo game coin") + Some("post redo game coin"), )?; Ok(()) } @@ -1995,9 +2001,8 @@ impl PotatoHandler { }; let (env, system_interface) = penv.env(); - let channel_conditions = CoinCondition::from_puzzle_and_solution( - env.allocator, puzzle, solution - )?; + let channel_conditions = + CoinCondition::from_puzzle_and_solution(env.allocator, puzzle, solution)?; // XXX If I wasn't the one who initiated the on chain transition, determine whether // to bump the unroll coin. @@ -2046,7 +2051,7 @@ impl PotatoHandler { return Err(Error::StrErr("no conditions for unroll coin".to_string())); }; - let mut game_map = { + let game_map = { let player_ch = self.channel_handler_mut()?; debug!( "{} FINISH ON CHAIN TRANSITION", @@ -2054,9 +2059,8 @@ impl PotatoHandler { ); let (env, _system_interface) = penv.env(); - let conditions = CoinCondition::from_puzzle_and_solution( - env.allocator, puzzle, solution - )?; + let conditions = + CoinCondition::from_puzzle_and_solution(env.allocator, puzzle, solution)?; let created_coins: Vec = conditions .iter() .filter_map(|c| { @@ -2078,30 +2082,29 @@ impl PotatoHandler { let mut actions = Vec::new(); - for (coin, def) in game_map.iter() { + for (_coin, def) in game_map.iter() { let player_ch = self.channel_handler()?; - debug!("{}: game {:?} our turn {:?}", player_ch.is_initial_potato(), def.game_id, player_ch.game_is_my_turn(&def.game_id)); + debug!( + "{}: game {:?} our turn {:?}", + player_ch.is_initial_potato(), + def.game_id, + player_ch.game_is_my_turn(&def.game_id) + ); assert_eq!(player_ch.game_is_my_turn(&def.game_id), Some(def.our_turn)); } // Register each coin that corresponds to a game. for coin in game_map.keys() { let (_env, system_interface) = penv.env(); - system_interface.register_coin( - coin, - &self.channel_timeout, - Some("game coin") - )?; + system_interface.register_coin(coin, &self.channel_timeout, Some("game coin"))?; } - let mut redo_change = None; for coin in game_map.keys() { let player_ch = self.channel_handler_mut()?; let (env, _system_interface) = penv.env(); if let Some(redo_move) = player_ch.get_redo_action(env, coin)? { debug!("redo move: {redo_move:?}"); actions.push(redo_move); - redo_change = Some(coin.clone()); } } @@ -2164,44 +2167,36 @@ impl PotatoHandler { G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { let mut unblock_queue = false; - let initial_potato = - { - let ch = self.channel_handler()?; - ch.is_initial_potato() - }; + let initial_potato = { + let ch = self.channel_handler()?; + ch.is_initial_potato() + }; debug!("{initial_potato} handle game coin spent {coin_id:?}"); - let old_definition = - if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { - if let Some(old_definition) = game_map.remove(coin_id) { - self.have_potato = PotatoState::Present; - debug!("{initial_potato} we have game coin {old_definition:?}"); - old_definition - } else { - debug!("{initial_potato} we don't have game coin!", ); - return Ok(()); - } + let old_definition = if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + if let Some(old_definition) = game_map.remove(coin_id) { + self.have_potato = PotatoState::Present; + debug!("{initial_potato} we have game coin {old_definition:?}"); + old_definition } else { - debug!("{initial_potato} game coin spent not on chain!"); + debug!("{initial_potato} we don't have game coin!",); return Ok(()); - }; + } + } else { + debug!("{initial_potato} game coin spent not on chain!"); + return Ok(()); + }; // A game coin was spent and we have the puzzle and solution. let player_ch = self.channel_handler_mut()?; let (env, system_interface) = penv.env(); - let conditions = CoinCondition::from_puzzle_and_solution( - env.allocator, - puzzle, - solution - )?; - let their_turn_result = player_ch.game_coin_spent( - env, - &old_definition.game_id, - coin_id, - &conditions, - )?; - debug!("{initial_potato} game coin spent result from channel handler {their_turn_result:?}"); + let conditions = CoinCondition::from_puzzle_and_solution(env.allocator, puzzle, solution)?; + let their_turn_result = + player_ch.game_coin_spent(env, &old_definition.game_id, coin_id, &conditions)?; + debug!( + "{initial_potato} game coin spent result from channel handler {their_turn_result:?}" + ); match their_turn_result { CoinSpentInformation::Expected(ph, amt) => { debug!("{initial_potato} got an expected spend {ph:?} {amt:?}"); @@ -2585,13 +2580,14 @@ impl { Some(ConditionWaitKind::Unroll(unroll_id.clone())) } - HandshakeState::OnChain(_game_map) => { - Some(ConditionWaitKind::Game) - } + HandshakeState::OnChain(_game_map) => Some(ConditionWaitKind::Game), _ => None, }; - debug!("{} coin puzzle and solution {coin_id:?} = {state_coin_id:?}", player_ch.is_initial_potato()); + debug!( + "{} coin puzzle and solution {coin_id:?} = {state_coin_id:?}", + player_ch.is_initial_potato() + ); match state_coin_id { Some(ConditionWaitKind::Channel(state_coin_id)) => { @@ -2605,12 +2601,13 @@ impl { - let (puzzle, solution) = - if let Some((puzzle, solution)) = puzzle_and_solution { - (puzzle, solution) - } else { - return Err(Error::StrErr("no puzzle and solution for game coin".to_string())); - }; + let (puzzle, solution) = if let Some((puzzle, solution)) = puzzle_and_solution { + (puzzle, solution) + } else { + return Err(Error::StrErr( + "no puzzle and solution for game coin".to_string(), + )); + }; self.handle_game_coin_spent(penv, coin_id, puzzle, solution)?; } _ => {} diff --git a/src/referee.rs b/src/referee.rs index 84e547ee..efb5f032 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -13,8 +13,8 @@ use log::debug; use serde::{Deserialize, Serialize}; use crate::channel_handler::game_handler::{ - GameHandler, MessageHandler, MessageInputs, MyTurnInputs, MyTurnResult, - TheirTurnInputs, TheirTurnResult, + GameHandler, MessageHandler, MessageInputs, MyTurnInputs, MyTurnResult, TheirTurnInputs, + TheirTurnResult, }; use crate::channel_handler::types::{ Evidence, GameStartInfo, PrintableGameStartInfo, ReadableMove, ValidationInfo, @@ -22,13 +22,13 @@ use crate::channel_handler::types::{ }; use crate::common::constants::CREATE_COIN; use crate::common::standard_coin::{ - calculate_hash_of_quoted_mod_hash, curry_and_treehash, - standard_solution_partial, standard_solution_unsafe, ChiaIdentity, + calculate_hash_of_quoted_mod_hash, curry_and_treehash, standard_solution_partial, + standard_solution_unsafe, ChiaIdentity, }; use crate::common::types::{ - u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinSpend, - CoinString, Error, GameID, Hash, IntoErr, Node, Program, Puzzle, PuzzleHash, Sha256tree, Spend, - Timeout, chia_dialect, + chia_dialect, u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, + BrokenOutCoinSpendInfo, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, + Node, Program, Puzzle, PuzzleHash, Sha256tree, Spend, Timeout, }; pub const REM_CONDITION_FIELDS: usize = 4; @@ -71,12 +71,6 @@ pub enum SlashOutcome { }, } -#[derive(Debug, Clone)] -pub enum RefereeOutputKind { - Game, - Reward, -} - #[derive(Debug, Clone)] pub struct RefereeOnChainTransaction { pub bundle: Spend, @@ -314,9 +308,10 @@ impl ValidatorMoveArgs { pub fn to_nodeptr(&self, allocator: &mut AllocEncoder, me: NodePtr) -> Result { let args: &[NodePtr] = &[ self.state, + me, self.mover_puzzle.to_clvm(allocator).into_gen()?, self.solution, - self.evidence + self.evidence, ]; let argvec: Vec = args.iter().map(|v| Node(*v)).collect(); argvec.to_clvm(allocator).into_gen() @@ -342,7 +337,7 @@ impl InternalValidatorArgs { allocator: &mut AllocEncoder, me: NodePtr, validator_mod_hash: PuzzleHash, - move_args: &ValidatorMoveArgs + move_args: &ValidatorMoveArgs, ) -> Result { let converted_vma = move_args.to_nodeptr(allocator, me)?; let move_node = allocator.encode_atom(&self.move_made).into_gen()?; @@ -367,22 +362,21 @@ impl InternalValidatorArgs { self.timeout.clone(), ( self.max_move_size, - ( - self.referee_hash.clone(), - () - ) - ) - ) - ) - ) - ) - ) - ) - ) + (self.referee_hash.clone(), ()), + ), + ), + ), + ), + ), + ), + ), + ), ), - Node(converted_vma) - ) - ).to_clvm(allocator).into_gen() + Node(converted_vma), + ), + ) + .to_clvm(allocator) + .into_gen() } } @@ -740,7 +734,6 @@ impl RefereeMaker { &mut self, allocator: &mut AllocEncoder, puzzle_hash: &PuzzleHash, - state_number: usize, ) -> Result, Error> { debug!("REWIND: find a way to proceed from {puzzle_hash:?}"); for old_state in self.old_states.iter().skip(1).rev() { @@ -769,7 +762,7 @@ impl RefereeMaker { ); } - for (i, old_state) in self.old_states.iter().enumerate().skip(1).rev() { + for old_state in self.old_states.iter().skip(1).rev() { let have_puzzle_hash = curry_referee_puzzle_hash( allocator, &self.fixed.referee_coin_puzzle_hash, @@ -1373,10 +1366,10 @@ impl RefereeMaker { ( target_referee_puzzle_hash.clone(), (self.fixed.amount.clone(), ()), - ) + ), )] - .to_clvm(allocator) - .into_gen()?; + .to_clvm(allocator) + .into_gen()?; // Generalize this once the test is working. Move out the assumption that // referee private key is my_identity.synthetic_private_key. @@ -1404,9 +1397,14 @@ impl RefereeMaker { }, }); - if let Some(transaction) = - self.get_transaction(allocator, coin_string, &spend_puzzle, true, &target_args, &args_list)? - { + if let Some(transaction) = self.get_transaction( + allocator, + coin_string, + &spend_puzzle, + true, + &target_args, + &args_list, + )? { Ok(transaction) } else { // Return err @@ -1422,20 +1420,16 @@ impl RefereeMaker { validator_move_args: &InternalValidatorArgs, move_args: &ValidatorMoveArgs, ) -> Result { - let referee_args = self.spend_this_coin(); - let referee_list = referee_args.to_node_list( - allocator, - &self.fixed.referee_coin_puzzle_hash - )?; let (_state, validation_program) = self.get_validation_program_for_their_move()?; let validation_program_nodeptr = validation_program.to_nodeptr(); - let validation_program_hexer = Program::from_nodeptr(allocator, validation_program_nodeptr)?; + let validation_program_hexer = + Program::from_nodeptr(allocator, validation_program_nodeptr)?; let validation_program_mod_hash = validation_program.hash(); let validator_full_args_node = validator_move_args.to_nodeptr( allocator, validation_program_nodeptr, PuzzleHash::from_hash(validation_program_mod_hash.clone()), - &move_args, + move_args, )?; let validator_full_args = Program::from_nodeptr(allocator, validator_full_args_node)?; @@ -1460,7 +1454,6 @@ impl RefereeMaker { allocator: &mut AllocEncoder, details: &GameMoveDetails, state_number: usize, - really_update: bool, ) -> Result { debug!("do their turn {details:?}"); @@ -1470,7 +1463,10 @@ impl RefereeMaker { // Retrieve evidence from their turn handler. let state_nodeptr = last_state.to_nodeptr(allocator)?; - assert!(args.game_move.basic.move_made.len() <= self.args_for_this_coin().game_move.basic.max_move_size); + assert!( + args.game_move.basic.move_made.len() + <= self.args_for_this_coin().game_move.basic.max_move_size + ); let result = handler.call_their_turn_driver( allocator, &TheirTurnInputs { @@ -1507,7 +1503,7 @@ impl RefereeMaker { state_number, )?; - (readable_move.clone(), vec![]) + (*readable_move, vec![]) } TheirTurnResult::MakeMove(readable_move, handler, message) => { // Mover puzzle turns the given solution into coin conditions @@ -1537,7 +1533,7 @@ impl RefereeMaker { ); debug!("message {message:?}"); - (readable_move.clone(), message.clone()) + (*readable_move, message.clone()) } // Slash can't be used when we're off chain. TheirTurnResult::Slash(_evidence, _signature) => { @@ -1560,7 +1556,7 @@ impl RefereeMaker { puzzle_hash_for_unroll, readable_move, message: message.clone(), - original: result + original: result, }) } @@ -1648,10 +1644,7 @@ impl RefereeMaker { ))) } - fn make_slash_conditions( - &self, - allocator: &mut AllocEncoder, - ) -> Result { + fn make_slash_conditions(&self, allocator: &mut AllocEncoder) -> Result { ( CREATE_COIN, ( @@ -1675,17 +1668,11 @@ impl RefereeMaker { ) } - fn make_full_slash_solution( - &self, - allocator: &mut AllocEncoder, - ) -> Result { + fn make_full_slash_solution(&self, allocator: &mut AllocEncoder) -> Result { assert!(!self.processing_my_turn()); let args = self.spend_this_coin(); - let new_puzzle_hash = curry_referee_puzzle_hash( - allocator, - &self.fixed.referee_coin_puzzle_hash, - &args - )?; + let new_puzzle_hash = + curry_referee_puzzle_hash(allocator, &self.fixed.referee_coin_puzzle_hash, &args)?; let (state, validation_program) = { let (s, v) = self.get_validation_program_for_their_move()?; (s.clone(), v) @@ -1729,11 +1716,15 @@ impl RefereeMaker { evidence: nil, state: self.get_game_state().to_nodeptr(allocator)?, mover_puzzle: self.fixed.my_identity.puzzle.to_program(), - solution: self.fixed + solution: self + .fixed .my_identity .standard_solution( allocator, - &[(self.fixed.my_identity.puzzle_hash.clone(), Amount::default())], + &[( + self.fixed.my_identity.puzzle_hash.clone(), + Amount::default(), + )], ) .expect("should create"), }; @@ -1741,7 +1732,10 @@ impl RefereeMaker { move_made: puzzle_args.game_move.basic.move_made.clone(), new_validation_info_hash: puzzle_args.game_move.validation_info_hash.clone(), mover_share: puzzle_args.game_move.basic.mover_share.clone(), - previous_validation_info_hash: previous_puzzle_args.game_move.validation_info_hash.clone(), + previous_validation_info_hash: previous_puzzle_args + .game_move + .validation_info_hash + .clone(), mover_puzzle_hash: puzzle_args.mover_puzzle_hash.clone(), waiter_puzzle_hash: puzzle_args.waiter_puzzle_hash.clone(), amount: self.fixed.amount.clone(), @@ -1752,11 +1746,8 @@ impl RefereeMaker { // my_inner_solution maker is just in charge of making aggsigs from // conditions. - let full_slash_result = self.run_validator_for_their_move( - allocator, - &internal_validator_args, - &validator_args, - ); + let full_slash_result = + self.run_validator_for_their_move(allocator, &internal_validator_args, &validator_args); match full_slash_result { Ok(slash) => { debug!( @@ -1782,11 +1773,10 @@ impl RefereeMaker { full_slash_solution, nil_evidence, &slash_spend.signature, - ).map(Some) - } - Err(_) => { - Ok(None) + ) + .map(Some) } + Err(_) => Ok(None), } } @@ -1796,18 +1786,15 @@ impl RefereeMaker { coin_string: &CoinString, conditions: &[CoinCondition], state_number: usize, - expected: bool, ) -> Result { let after_puzzle_hash = curry_referee_puzzle_hash( allocator, &self.fixed.referee_coin_puzzle_hash, - &self.spend_this_coin() + &self.spend_this_coin(), )?; // XXX Revisit this in conjuction with rewind. There is a better way to do this. - let repeat = - if let Some(CoinCondition::CreateCoin(ph, amt)) = - conditions + let repeat = if let Some(CoinCondition::CreateCoin(ph, _amt)) = conditions .iter() .find(|cond| matches!(cond, CoinCondition::CreateCoin(_, _))) { @@ -1826,15 +1813,14 @@ impl RefereeMaker { &after_puzzle_hash, &self.fixed.amount, ), - readable: ReadableMove::from_nodeptr(allocator, nil)? + readable: ReadableMove::from_nodeptr(allocator, nil)?, }); } // Read parameters off conditions - let rem_condition = if let Some(CoinCondition::Rem(rem_condition)) = - conditions - .iter() - .find(|cond| matches!(cond, CoinCondition::Rem(_))) + let rem_condition = if let Some(CoinCondition::Rem(rem_condition)) = conditions + .iter() + .find(|cond| matches!(cond, CoinCondition::Rem(_))) { // Got rem condition rem_condition.to_vec() @@ -1892,12 +1878,8 @@ impl RefereeMaker { }; let state = self.state.clone(); - let result = self.their_turn_move_off_chain( - allocator, - &details, - state_number, - !expected, - )?; + let result = + self.their_turn_move_off_chain(allocator, &details, state_number)?; let args = self.spend_this_coin(); @@ -1905,20 +1887,15 @@ impl RefereeMaker { allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, - &args - )?; - let new_puzzle_hash = curry_referee_puzzle_hash( - allocator, - &self.fixed.referee_coin_puzzle_hash, - &args + &args, )?; + let new_puzzle_hash = + curry_referee_puzzle_hash(allocator, &self.fixed.referee_coin_puzzle_hash, &args)?; debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); - let mut check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr| { - if let Some(result) = self.check_their_turn_for_slash( - allocator, - coin_string, - state_number)? + let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr| { + if let Some(result) = + self.check_their_turn_for_slash(allocator, coin_string, state_number)? { Ok(result) } else { diff --git a/src/simulator.rs b/src/simulator.rs index de611028..7ef1e44d 100644 --- a/src/simulator.rs +++ b/src/simulator.rs @@ -298,7 +298,6 @@ impl Simulator { } else { i.extract(py)? }; - let as_list_str: String = coin_of_item.call_method0(py, "__repr__")?.extract(py)?; let as_list: Vec = self.coin_as_list.call1(py, (coin_of_item,))?.extract(py)?; let parent_coin_info: &PyBytes = as_list[0].downcast(py)?; diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index 135cfc50..b2b73966 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -136,12 +136,14 @@ fn test_smoke_can_start_game() { ValidationProgram::new(env.allocator, initial_validation_puzzle); let timeout = Timeout::new(1337); - let game_handler = GameHandler::TheirTurnHandler(Rc::new(Program::from_nodeptr(env.allocator, game_handler).expect("should cvt"))); + let game_handler = GameHandler::TheirTurnHandler(Rc::new( + Program::from_nodeptr(env.allocator, game_handler).expect("should cvt"), + )); let _game_start_potato_sigs = game.player(1).ch.send_potato_start_game( &mut env, &[GameStartInfo { game_id: GameID::new(vec![0]), - game_handler: game_handler, + game_handler, timeout: timeout.clone(), my_contribution_this_game: our_share.clone(), their_contribution_this_game: their_share.clone(), diff --git a/src/tests/chialisp.rs b/src/tests/chialisp.rs index 89063e9c..1f11a7a0 100644 --- a/src/tests/chialisp.rs +++ b/src/tests/chialisp.rs @@ -1,7 +1,7 @@ use std::rc::Rc; use crate::common::standard_coin::read_hex_puzzle; -use crate::common::types::{AllocEncoder, Node, Sha256Input, chia_dialect}; +use crate::common::types::{chia_dialect, AllocEncoder, Node, Sha256Input}; use clvm_traits::ToClvm; use clvmr::run_program; diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index bd45a1d4..c4aafe67 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -24,7 +24,8 @@ fn test_game_handler_their_move_slash() { ) .expect("should assemble"); - let their_turn_handler = GameHandler::their_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); + let their_turn_handler = + GameHandler::their_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); assert!(!their_turn_handler.is_my_turn()); let nil = allocator.allocator().null(); let result = their_turn_handler @@ -66,7 +67,8 @@ fn test_game_handler_their_make_move() { ) .expect("should assemble"); - let their_turn_handler = GameHandler::their_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); + let their_turn_handler = + GameHandler::their_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); let nil = allocator.allocator().null(); let result = their_turn_handler .call_their_turn_driver( @@ -108,7 +110,8 @@ fn test_game_handler_my_turn() { "(c (1 . 1) (c (1 . 2) (c (1 . 3) (c (1 . 4) (c (1 . 5) (c (1 . 6) (c (c (1 . 1337) 1) (c (1 . 8) ()))))))))" ).expect("should assemble"); - let my_turn_handler = GameHandler::my_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); + let my_turn_handler = + GameHandler::my_driver_from_nodeptr(&mut allocator, program).expect("should cvt"); let result = my_turn_handler .call_my_turn_driver( &mut allocator, @@ -124,13 +127,12 @@ fn test_game_handler_my_turn() { }, ) .expect("should run"); - let waiting_driver_node = result.waiting_driver.to_nodeptr(&mut allocator).expect("should cvt"); + let waiting_driver_node = result + .waiting_driver + .to_nodeptr(&mut allocator) + .expect("should cvt"); assert_eq!( - disassemble( - allocator.allocator(), - waiting_driver_node, - None - ), + disassemble(allocator.allocator(), waiting_driver_node, None), "(1337 () () () 100 0x0000000000000000000000000000000000000000000000000000000000000000)" ); assert_eq!(result.game_move.basic.move_made, &[1]); diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 8d7ade84..893b8ea0 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -971,7 +971,11 @@ fn run_calpoker_container_with_action_list_with_success_predicate( }; let mut fake_move = m.clone(); - fake_move.game_move.basic.move_made.append(&mut move_data.clone()); + fake_move + .game_move + .basic + .move_made + .append(&mut move_data.clone()); Ok(PeerMessage::Move(game_id.clone(), fake_move)) }) .expect("should be able to sabotage"); diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 229ebed5..f92a7b73 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -4,7 +4,7 @@ use rand::prelude::*; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; -use clvm_tools_rs::classic::clvm_tools::binutils::{assemble, disassemble}; +use clvm_tools_rs::classic::clvm_tools::binutils::assemble; use clvmr::NodePtr; use log::debug; @@ -13,7 +13,7 @@ use crate::channel_handler::game_handler::GameHandler; use crate::channel_handler::types::{GameStartInfo, ReadableMove, ValidationProgram}; use crate::common::standard_coin::{read_hex_puzzle, ChiaIdentity}; use crate::common::types::{ - Aggsig, AllocEncoder, Amount, Error, GameID, Node, PrivateKey, Puzzle, PuzzleHash, Sha256tree, + Aggsig, AllocEncoder, Amount, Error, GameID, PrivateKey, Puzzle, PuzzleHash, Sha256tree, Timeout, }; use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker, ValidatorMoveArgs}; @@ -64,7 +64,8 @@ pub fn make_debug_game_handler( let my_driver_node = make_curried_game_handler(true) .to_clvm(allocator) .expect("should curry"); - let my_turn_handler = GameHandler::my_driver_from_nodeptr(allocator, my_driver_node).expect("should cvt"); + let my_turn_handler = + GameHandler::my_driver_from_nodeptr(allocator, my_driver_node).expect("should cvt"); let my_validation_program = CurriedProgram { program: my_turn_handler.clone(), args: clvm_curried_args!(1337), @@ -75,7 +76,8 @@ pub fn make_debug_game_handler( let their_turn_node = make_curried_game_handler(false) .to_clvm(allocator) .expect("should curry"); - let their_turn_handler = GameHandler::their_driver_from_nodeptr(allocator, their_turn_node).expect("should cvt"); + let their_turn_handler = + GameHandler::their_driver_from_nodeptr(allocator, their_turn_node).expect("should cvt"); let their_validation_program = CurriedProgram { program: their_turn_handler.clone(), args: clvm_curried_args!(1337), @@ -237,7 +239,6 @@ fn test_referee_smoke() { validation_info_hash: my_move_wire_data.details.validation_info_hash.clone(), }, 0, - true, ); debug!("their move result {their_move_result:?}"); if let Err(Error::StrErr(s)) = their_move_result { @@ -249,7 +250,7 @@ fn test_referee_smoke() { let their_move_local_update = reftest .their_referee - .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0, true) + .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0) .expect("should move"); debug!("their_move_wire_data {their_move_local_update:?}"); diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index 57138c29..b4a339b4 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -18,8 +18,8 @@ use crate::common::standard_coin::{ private_to_public_key, puzzle_for_synthetic_public_key, standard_solution_partial, ChiaIdentity, }; use crate::common::types::{ - AllocEncoder, Amount, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, - PrivateKey, PuzzleHash, Sha256tree, Spend, Timeout, chia_dialect, + chia_dialect, AllocEncoder, Amount, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, + IntoErr, Node, PrivateKey, PuzzleHash, Sha256tree, Spend, Timeout, }; use crate::simulator::Simulator; use crate::tests::game::{new_channel_handler_game, GameAction, GameActionResult}; From 1673d6b1afe280dad329894e51420aeb30c70b49 Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 15:12:59 -0800 Subject: [PATCH 11/50] 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. --- src/channel_handler/mod.rs | 20 ++++++++ src/channel_handler/types.rs | 8 ++++ src/peer_container.rs | 55 ++++++++++++++------- src/potato_handler.rs | 71 ++++++++++++++++++++-------- src/tests/peer/potato_handler.rs | 2 +- src/tests/peer/potato_handler_sim.rs | 48 +++++++++++++------ 6 files changed, 152 insertions(+), 52 deletions(-) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 215caf15..592cb082 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -156,6 +156,10 @@ impl ChannelHandler { self.current_state_number } + pub fn all_games_finished(&self) -> bool { + self.live_games.is_empty() + } + pub fn get_finished_unroll_coin(&self) -> &ChannelHandlerUnrollSpendInfo { if let Some(t) = self.timeout.as_ref() { t @@ -1751,6 +1755,22 @@ impl ChannelHandler { }) } + pub fn accept_or_timeout_game_on_chain( + &mut self, + env: &mut ChannelHandlerEnv, + game_id: &GameID, + coin: &CoinString, + ) -> Result, Error> { + let game_idx = self.get_game_by_id(game_id)?; + let tx = self.live_games[game_idx].get_transaction_for_timeout( + env.allocator, + coin + )?; + // Game is done one way or another. + self.live_games.remove(game_idx); + Ok(tx) + } + // the vanilla coin we get and each reward coin are all sent to the referee // this returns spends which allow them to be consolidated by spending the // reward coins. diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index af3e489c..358a0001 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -1114,6 +1114,14 @@ impl LiveGame { Ok(None) } + + pub fn get_transaction_for_timeout( + &mut self, + allocator: &mut AllocEncoder, + coin: &CoinString + ) -> Result, Error> { + self.referee_maker.get_transaction_for_timeout(allocator, coin) + } } /// Identifies the game phase that an on chain spend represented. diff --git a/src/peer_container.rs b/src/peer_container.rs index 398a9d66..b3c5bda2 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -2,7 +2,7 @@ use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::mem::swap; use std::rc::Rc; -use clvm_traits::ToClvm; +use clvm_traits::{ClvmEncoder, ToClvm}; use log::debug; use rand::Rng; @@ -200,7 +200,11 @@ pub trait GameCradle { /// Signal shutdown. Forwards to FromLocalUI::shut_down. /// Perhaps we should consider reporting the reward coins. - fn shut_down(&mut self) -> Result<(), Error>; + fn shut_down( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + ) -> Result<(), Error>; /// Tell the game cradle that a new block arrived, giving a watch report. fn new_block( @@ -221,7 +225,7 @@ pub trait GameCradle { allocator: &mut AllocEncoder, rng: &mut R, local_ui: &mut dyn ToLocalUI, - ) -> Result; + ) -> Result, Error>; /// Check whether we're on chain. fn is_on_chain(&self) -> bool; @@ -420,8 +424,8 @@ impl ToLocalUI for SynchronousGameCradleState { fn game_cancelled(&mut self, _id: &GameID) -> Result<(), Error> { todo!(); } - fn shutdown_complete(&mut self, reward_coin_string: &CoinString) -> Result<(), Error> { - self.shutdown = Some(reward_coin_string.clone()); + fn shutdown_complete(&mut self, reward_coin_string: Option<&CoinString>) -> Result<(), Error> { + self.shutdown = reward_coin_string.cloned(); Ok(()) } fn going_on_chain(&mut self, _got_error: bool) -> Result<(), Error> { @@ -749,9 +753,20 @@ impl GameCradle for SynchronousGameCradle { } /// Signal shutdown. Forwards to FromLocalUI::shut_down. - /// Perhaps we should consider reporting the reward coins. - fn shut_down(&mut self) -> Result<(), Error> { - todo!(); + fn shut_down( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + ) -> Result<(), Error> { + // The conditions relate to spending the remaining money in the channel coin. + let nil = allocator.encode_atom(&[]).into_gen()?; + let mut env = channel_handler_env(allocator, rng); + let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { + env: &mut env, + system_interface: &mut self.state, + }; + self.peer.shut_down(&mut penv, nil)?; + Ok(()) } /// Tell the game cradle that a new block arrived, giving a watch report. @@ -788,7 +803,11 @@ impl GameCradle for SynchronousGameCradle { allocator: &mut AllocEncoder, rng: &mut R, local_ui: &mut dyn ToLocalUI, - ) -> Result { + ) -> Result, Error> { + if self.state.shutdown.is_some() { + return Ok(None); + } + let mut result = IdleResult::default(); swap( @@ -811,24 +830,24 @@ impl GameCradle for SynchronousGameCradle { if let Some((id, msg)) = self.state.our_moves.pop_front() { local_ui.self_move(&id, &msg)?; - return Ok(result); + return Ok(Some(result)); } if let Some((id, msg)) = self.state.game_messages.pop_front() { local_ui.game_message(allocator, &id, msg)?; - return Ok(result); + return Ok(Some(result)); } if let Some((id, readable)) = self.state.opponent_moves.pop_front() { local_ui.opponent_moved(allocator, &id, readable)?; result.continue_on = true; - return Ok(result); + return Ok(Some(result)); } if let Some((id, amount)) = self.state.game_finished.pop_front() { local_ui.game_finished(&id, amount.clone())?; result.continue_on = true; - return Ok(result); + return Ok(Some(result)); } // If there's a message to deliver, deliver it and signal to continue. @@ -843,29 +862,29 @@ impl GameCradle for SynchronousGameCradle { match self.peer.received_message(&mut penv, msg) { Ok(_) => { result.continue_on = true; - return Ok(result); + return Ok(Some(result)); } Err(e) => { debug!("going on chain for error {e:?}"); result.receive_error = Some(e); // Go on chain. local_ui.going_on_chain(true)?; - return Ok(result); + return Ok(Some(result)); } } } if let Some(ph) = self.state.channel_puzzle_hash.clone() { result.continue_on = self.create_partial_spend_for_channel_coin(allocator, rng, ph)?; - return Ok(result); + return Ok(Some(result)); } if let (false, Some(uo)) = (self.state.is_initiator, self.state.unfunded_offer.clone()) { result.continue_on = self.respond_to_unfunded_offer(allocator, rng, uo)?; - return Ok(result); + return Ok(Some(result)); } - Ok(result) + Ok(Some(result)) } /// Trigger going on chain. diff --git a/src/potato_handler.rs b/src/potato_handler.rs index b1176bf7..d17070c0 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -269,7 +269,7 @@ pub trait ToLocalUI { fn game_finished(&mut self, id: &GameID, my_share: Amount) -> Result<(), Error>; fn game_cancelled(&mut self, id: &GameID) -> Result<(), Error>; - fn shutdown_complete(&mut self, reward_coin_string: &CoinString) -> Result<(), Error>; + fn shutdown_complete(&mut self, reward_coin_string: Option<&CoinString>) -> Result<(), Error>; fn going_on_chain(&mut self, got_error: bool) -> Result<(), Error>; } @@ -607,7 +607,7 @@ impl PotatoHandler { } pub fn handshake_finished(&self) -> bool { - matches!(self.handshake_state, HandshakeState::Finished(_)) + matches!(self.handshake_state, HandshakeState::Finished(_) | HandshakeState::OnChain(_)) } /// Tell whether this peer has the potato. If it has been sent but not received yet @@ -973,7 +973,7 @@ impl PotatoHandler { Ok(true) } Some(GameAction::RedoMove(_game_id, _coin, _new_ph, _transaction)) => { - todo!(); + return Err(Error::StrErr("redo move when not on chain".to_string())); } Some(GameAction::Accept(game_id)) => { let (sigs, amount) = { @@ -1885,22 +1885,25 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - if let HandshakeState::OnChain(_game_map) = &mut self.handshake_state { + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + let get_current_coin = |hs: &HandshakeState, game_id: &GameID| -> Result { + if let HandshakeState::OnChain(game_map) = &self.handshake_state { + if let Some((current, _game)) = + game_map.iter().find(|g| g.1.game_id == *game_id) + { + Ok(current.clone()) + } else { + Err(Error::StrErr("no matching game".to_string())) + } + } else { + Err(Error::StrErr("not on chain".to_string())) + } + }; + + debug!("do_on_chain_action {action:?}"); match action { GameAction::Move(game_id, readable_move, hash) => { - let current_coin = - if let HandshakeState::OnChain(game_map) = &self.handshake_state { - if let Some((current, _game)) = - game_map.iter().find(|g| g.1.game_id == game_id) - { - current.clone() - } else { - return Err(Error::StrErr("no matching game".to_string())); - } - } else { - return Err(Error::StrErr("not on chain".to_string())); - }; - + let current_coin = get_current_coin(&self.handshake_state, &game_id)?; self.do_on_chain_move(penv, ¤t_coin, game_id, readable_move, hash) } GameAction::RedoMove(_game_id, coin, new_ph, tx) => { @@ -1936,6 +1939,20 @@ impl PotatoHandler { )?; Ok(()) } + GameAction::Accept(game_id) => { + let current_coin = get_current_coin(&self.handshake_state, &game_id)?; + let player_ch = self.channel_handler_mut()?; + debug!("{} on chain: accept game coin {current_coin:?}", player_ch.is_initial_potato()); + let (env, system_interface) = penv.env(); + let result_transaction = player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; + self.have_potato = PotatoState::Present; + if let Some(transaction) = result_transaction { + todo!(); + } else { + debug!("Accepted game when our share was zero"); + } + Ok(()) + } x => { todo!("unexpected move type {x:?}"); } @@ -2381,6 +2398,22 @@ impl Result<(), Error> { + fn shutdown_complete(&mut self, _reward_coin_string: Option<&CoinString>) -> Result<(), Error> { todo!(); } fn going_on_chain(&mut self, _got_error: bool) -> Result<(), Error> { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 893b8ea0..f37c4689 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::rc::Rc; -use clvm_traits::ToClvm; +use clvm_traits::{ClvmEncoder, ToClvm}; use log::debug; use rand::prelude::*; use rand_chacha::ChaCha8Rng; @@ -209,7 +209,7 @@ impl ToLocalUI for SimulatedPeer { fn game_cancelled(&mut self, _id: &GameID) -> Result<(), Error> { todo!(); } - fn shutdown_complete(&mut self, _reward_coin_string: &CoinString) -> Result<(), Error> { + fn shutdown_complete(&mut self, reward_coin_string: Option<&CoinString>) -> Result<(), Error> { todo!(); } fn going_on_chain(&mut self, _got_error: bool) -> Result<(), Error> { @@ -682,7 +682,7 @@ impl ToLocalUI for LocalTestUIReceiver { todo!(); } - fn shutdown_complete(&mut self, _reward_coin_string: &CoinString) -> Result<(), Error> { + fn shutdown_complete(&mut self, _reward_coin_string: Option<&CoinString>) -> Result<(), Error> { self.shutdown_complete = true; Ok(()) } @@ -784,6 +784,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( let mut game_ids = Vec::default(); let mut handshake_done = false; let mut can_move = false; + let mut ending = false; let mut current_move = moves.iter(); let mut last_move = 0; @@ -798,7 +799,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .expect("should work"); // XXX Move on to shutdown complete. - while !local_uis.iter().all(|l| l.game_finished.is_some()) { + while !ending && !local_uis.iter().all(|l| l.game_finished.is_some() || l.shutdown_complete) { num_steps += 1; assert!(num_steps < 100); @@ -833,9 +834,13 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .expect("should work"); loop { - let result = cradles[i] - .idle(allocator, &mut rng, &mut local_uis[i]) - .expect("should work"); + let result = + if let Some(result) = cradles[i].idle(allocator, &mut rng, &mut local_uis[i]).expect("should work") { + result + } else { + break; + }; + for coin in result.coin_solution_requests.iter() { let ps_res = simulator .get_puzzle_and_solution(coin) @@ -908,7 +913,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .expect("should run"); can_move = true; - } else if can_move || local_uis.iter().any(|l| l.opponent_moved) { + } else if can_move || local_uis.iter().any(|l| l.opponent_moved || l.shutdown_complete) || ending { can_move = false; assert!(!game_ids.is_empty()); @@ -980,12 +985,23 @@ fn run_calpoker_container_with_action_list_with_success_predicate( }) .expect("should be able to sabotage"); } - _ => todo!(), + GameAction::Accept(who) | GameAction::Timeout(who) => { + ending = true; + cradles[*who] + .accept( + allocator, + &mut rng, + &game_ids[0], + ) + .expect("should work"); + } + GameAction::Shutdown(who,_) => { + ending = true; + cradles[*who] + .shut_down(allocator, &mut rng) + .expect("should work"); + } } - } else { - cradles[last_move ^ 1] - .accept(allocator, &mut rng, &game_ids[0]) - .expect("should work"); } } } @@ -1021,12 +1037,16 @@ fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { ); } -#[ignore] #[test] fn sim_test_with_peer_container_piss_off_peer_complete() { let mut allocator = AllocEncoder::new(); let mut moves = test_moves_1(&mut allocator).to_vec(); + let nil = allocator.encode_atom(&[]).into_gen().expect("should work"); + moves.push(GameAction::Accept(0)); + moves.push(GameAction::Accept(1)); + moves.push(GameAction::Shutdown(0, nil)); + moves.push(GameAction::Shutdown(1, nil)); if let GameAction::Move(player, readable, _) = moves[3].clone() { moves.insert(3, GameAction::FakeMove(player, readable, vec![0; 500])); } else { From 4921d188dcdd596c162d2c99535c2232ef650e81 Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 20:46:10 -0800 Subject: [PATCH 12/50] 1 remaining test failure which needs me to combine the validator args parameter objects and make a nice method of referee that gives one --- src/peer_container.rs | 4 ++++ src/tests/peer/potato_handler_sim.rs | 13 +++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/peer_container.rs b/src/peer_container.rs index b3c5bda2..3f3dcbd3 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -486,6 +486,10 @@ impl SynchronousGameCradle { self.peer.amount() } + pub fn finished(&self) -> Option { + self.state.shutdown.clone() + } + fn create_partial_spend_for_channel_coin( &mut self, allocator: &mut AllocEncoder, diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index f37c4689..cba8b972 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -1016,8 +1016,17 @@ fn sim_test_with_peer_container() { let mut allocator = AllocEncoder::new(); // Play moves - let moves = test_moves_1(&mut allocator); - run_calpoker_container_with_action_list(&mut allocator, &moves); + let mut moves = test_moves_1(&mut allocator).to_vec(); + let nil = allocator.encode_atom(&[]).into_gen().expect("should work"); + moves.push(GameAction::Accept(0)); + moves.push(GameAction::Accept(1)); + moves.push(GameAction::Shutdown(0, nil)); + moves.push(GameAction::Shutdown(1, nil)); + run_calpoker_container_with_action_list_with_success_predicate( + &mut allocator, + &moves, + Some(&|cradles| cradles[0].finished().is_some() && cradles[1].finished().is_some()), + ); } #[test] From 9404031d476055fae96be6d4dd39eea68642976f Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 20:46:23 -0800 Subject: [PATCH 13/50] fmt --- src/channel_handler/mod.rs | 14 ++++------ src/channel_handler/types.rs | 17 +++++------- src/peer_container.rs | 7 ++--- src/potato_handler.rs | 40 +++++++++++++++++----------- src/referee.rs | 3 +-- src/tests/peer/potato_handler_sim.rs | 35 ++++++++++++++---------- 6 files changed, 61 insertions(+), 55 deletions(-) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 592cb082..43004fcb 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -19,11 +19,10 @@ use crate::channel_handler::types::{ CachedPotatoRegenerateLastHop, ChannelCoin, ChannelCoinInfo, ChannelCoinSpendInfo, ChannelCoinSpentResult, ChannelHandlerEnv, ChannelHandlerInitiationData, ChannelHandlerInitiationResult, ChannelHandlerPrivateKeys, ChannelHandlerUnrollSpendInfo, - CoinDataForReward, CoinSpentAccept, CoinSpentDisposition, - CoinSpentInformation, CoinSpentMoveUp, CoinSpentResult, DispositionResult, GameStartInfo, - HandshakeResult, LiveGame, MoveResult, OnChainGameCoin, OnChainGameState, - PotatoAcceptCachedData, PotatoMoveCachedData, PotatoSignatures, ReadableMove, UnrollCoin, - UnrollCoinConditionInputs, UnrollTarget, + CoinDataForReward, CoinSpentAccept, CoinSpentDisposition, CoinSpentInformation, + CoinSpentMoveUp, CoinSpentResult, DispositionResult, GameStartInfo, HandshakeResult, LiveGame, + MoveResult, OnChainGameCoin, OnChainGameState, PotatoAcceptCachedData, PotatoMoveCachedData, + PotatoSignatures, ReadableMove, UnrollCoin, UnrollCoinConditionInputs, UnrollTarget, }; use crate::common::constants::CREATE_COIN; use crate::common::standard_coin::{ @@ -1762,10 +1761,7 @@ impl ChannelHandler { coin: &CoinString, ) -> Result, Error> { let game_idx = self.get_game_by_id(game_id)?; - let tx = self.live_games[game_idx].get_transaction_for_timeout( - env.allocator, - coin - )?; + let tx = self.live_games[game_idx].get_transaction_for_timeout(env.allocator, coin)?; // Game is done one way or another. self.live_games.remove(game_idx); Ok(tx) diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 358a0001..e75c8080 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -1027,11 +1027,9 @@ impl LiveGame { state_number: usize, ) -> Result { assert!(!self.referee_maker.is_my_turn()); - let their_move_result = self.referee_maker.their_turn_move_off_chain( - allocator, - game_move, - state_number, - )?; + let their_move_result = + self.referee_maker + .their_turn_move_off_chain(allocator, game_move, state_number)?; self.last_referee_puzzle_hash = their_move_result.puzzle_hash_for_unroll.clone(); Ok(their_move_result) } @@ -1097,9 +1095,7 @@ impl LiveGame { let referee_puzzle_hash = self.referee_maker.on_chain_referee_puzzle_hash(allocator)?; debug!("live game: current state is {referee_puzzle_hash:?} want {want_ph:?}"); - let result = self - .referee_maker - .rewind(allocator, want_ph)?; + let result = self.referee_maker.rewind(allocator, want_ph)?; if let Some(current_state) = &result { self.rewind_outcome = Some(*current_state); self.last_referee_puzzle_hash = self.outcome_puzzle_hash(allocator)?; @@ -1118,9 +1114,10 @@ impl LiveGame { pub fn get_transaction_for_timeout( &mut self, allocator: &mut AllocEncoder, - coin: &CoinString + coin: &CoinString, ) -> Result, Error> { - self.referee_maker.get_transaction_for_timeout(allocator, coin) + self.referee_maker + .get_transaction_for_timeout(allocator, coin) } } diff --git a/src/peer_container.rs b/src/peer_container.rs index 3f3dcbd3..f6174c7d 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -200,11 +200,8 @@ pub trait GameCradle { /// Signal shutdown. Forwards to FromLocalUI::shut_down. /// Perhaps we should consider reporting the reward coins. - fn shut_down( - &mut self, - allocator: &mut AllocEncoder, - rng: &mut R, - ) -> Result<(), Error>; + fn shut_down(&mut self, allocator: &mut AllocEncoder, rng: &mut R) + -> Result<(), Error>; /// Tell the game cradle that a new block arrived, giving a watch report. fn new_block( diff --git a/src/potato_handler.rs b/src/potato_handler.rs index d17070c0..40ae6e90 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -607,7 +607,10 @@ impl PotatoHandler { } pub fn handshake_finished(&self) -> bool { - matches!(self.handshake_state, HandshakeState::Finished(_) | HandshakeState::OnChain(_)) + matches!( + self.handshake_state, + HandshakeState::Finished(_) | HandshakeState::OnChain(_) + ) } /// Tell whether this peer has the potato. If it has been sent but not received yet @@ -1886,19 +1889,20 @@ impl PotatoHandler { G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { - let get_current_coin = |hs: &HandshakeState, game_id: &GameID| -> Result { - if let HandshakeState::OnChain(game_map) = &self.handshake_state { - if let Some((current, _game)) = - game_map.iter().find(|g| g.1.game_id == *game_id) - { - Ok(current.clone()) + let get_current_coin = + |hs: &HandshakeState, game_id: &GameID| -> Result { + if let HandshakeState::OnChain(game_map) = &self.handshake_state { + if let Some((current, _game)) = + game_map.iter().find(|g| g.1.game_id == *game_id) + { + Ok(current.clone()) + } else { + Err(Error::StrErr("no matching game".to_string())) + } } else { - Err(Error::StrErr("no matching game".to_string())) + Err(Error::StrErr("not on chain".to_string())) } - } else { - Err(Error::StrErr("not on chain".to_string())) - } - }; + }; debug!("do_on_chain_action {action:?}"); match action { @@ -1942,9 +1946,13 @@ impl PotatoHandler { GameAction::Accept(game_id) => { let current_coin = get_current_coin(&self.handshake_state, &game_id)?; let player_ch = self.channel_handler_mut()?; - debug!("{} on chain: accept game coin {current_coin:?}", player_ch.is_initial_potato()); + debug!( + "{} on chain: accept game coin {current_coin:?}", + player_ch.is_initial_potato() + ); let (env, system_interface) = penv.env(); - let result_transaction = player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; + let result_transaction = + player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; self.have_potato = PotatoState::Present; if let Some(transaction) = result_transaction { todo!(); @@ -2402,7 +2410,9 @@ impl { ending = true; cradles[*who] - .accept( - allocator, - &mut rng, - &game_ids[0], - ) + .accept(allocator, &mut rng, &game_ids[0]) .expect("should work"); } - GameAction::Shutdown(who,_) => { + GameAction::Shutdown(who, _) => { ending = true; cradles[*who] .shut_down(allocator, &mut rng) From cde8ce940c973a302f9c9d036090f65f924d51be Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 20:57:06 -0800 Subject: [PATCH 14/50] clippy --- src/potato_handler.rs | 136 +++++++++++++-------------- src/tests/peer/potato_handler_sim.rs | 5 +- src/tests/referee.rs | 2 +- 3 files changed, 68 insertions(+), 75 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 40ae6e90..171fd620 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -976,7 +976,7 @@ impl PotatoHandler { Ok(true) } Some(GameAction::RedoMove(_game_id, _coin, _new_ph, _transaction)) => { - return Err(Error::StrErr("redo move when not on chain".to_string())); + Err(Error::StrErr("redo move when not on chain".to_string())) } Some(GameAction::Accept(game_id)) => { let (sigs, amount) = { @@ -1888,85 +1888,81 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { - let get_current_coin = - |hs: &HandshakeState, game_id: &GameID| -> Result { - if let HandshakeState::OnChain(game_map) = &self.handshake_state { - if let Some((current, _game)) = - game_map.iter().find(|g| g.1.game_id == *game_id) - { - Ok(current.clone()) - } else { - Err(Error::StrErr("no matching game".to_string())) - } + let get_current_coin = + |hs: &HandshakeState, game_id: &GameID| -> Result { + if let HandshakeState::OnChain(game_map) = hs { + if let Some((current, _game)) = + game_map.iter().find(|g| g.1.game_id == *game_id) + { + Ok(current.clone()) } else { - Err(Error::StrErr("not on chain".to_string())) + Err(Error::StrErr("no matching game".to_string())) } - }; - - debug!("do_on_chain_action {action:?}"); - match action { - GameAction::Move(game_id, readable_move, hash) => { - let current_coin = get_current_coin(&self.handshake_state, &game_id)?; - self.do_on_chain_move(penv, ¤t_coin, game_id, readable_move, hash) + } else { + Err(Error::StrErr("not on chain".to_string())) } - GameAction::RedoMove(_game_id, coin, new_ph, tx) => { - // Remember that we spent this one. - { - let player_ch = self.channel_handler()?; - debug!( - "{} created puzzle hash for redo {new_ph:?}", - player_ch.is_initial_potato() - ); - self.my_game_spends.insert(new_ph.clone()); - } - let (_env, system_interface) = penv.env(); - self.have_potato = PotatoState::Absent; - system_interface.spend_transaction_and_add_fee(&SpendBundle { - name: Some("redo move".to_string()), - spends: vec![CoinSpend { - coin: coin.clone(), - bundle: tx.bundle.clone(), - }], - })?; - let amt = if let Some((_, _, amt)) = coin.to_parts() { - amt - } else { - return Err(Error::StrErr("bad coin".to_string())); - }; + }; - let new_coin = CoinString::from_parts(&coin.to_coin_id(), &new_ph, &amt); - system_interface.register_coin( - &new_coin, - &self.channel_timeout, - Some("post redo game coin"), - )?; - Ok(()) - } - GameAction::Accept(game_id) => { - let current_coin = get_current_coin(&self.handshake_state, &game_id)?; - let player_ch = self.channel_handler_mut()?; + debug!("do_on_chain_action {action:?}"); + match action { + GameAction::Move(game_id, readable_move, hash) => { + let current_coin = get_current_coin(&self.handshake_state, &game_id)?; + self.do_on_chain_move(penv, ¤t_coin, game_id, readable_move, hash) + } + GameAction::RedoMove(_game_id, coin, new_ph, tx) => { + // Remember that we spent this one. + { + let player_ch = self.channel_handler()?; debug!( - "{} on chain: accept game coin {current_coin:?}", + "{} created puzzle hash for redo {new_ph:?}", player_ch.is_initial_potato() ); - let (env, system_interface) = penv.env(); - let result_transaction = - player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; - self.have_potato = PotatoState::Present; - if let Some(transaction) = result_transaction { - todo!(); - } else { - debug!("Accepted game when our share was zero"); - } - Ok(()) + self.my_game_spends.insert(new_ph.clone()); } - x => { - todo!("unexpected move type {x:?}"); + let (_env, system_interface) = penv.env(); + self.have_potato = PotatoState::Absent; + system_interface.spend_transaction_and_add_fee(&SpendBundle { + name: Some("redo move".to_string()), + spends: vec![CoinSpend { + coin: coin.clone(), + bundle: tx.bundle.clone(), + }], + })?; + let amt = if let Some((_, _, amt)) = coin.to_parts() { + amt + } else { + return Err(Error::StrErr("bad coin".to_string())); + }; + + let new_coin = CoinString::from_parts(&coin.to_coin_id(), &new_ph, &amt); + system_interface.register_coin( + &new_coin, + &self.channel_timeout, + Some("post redo game coin"), + )?; + Ok(()) + } + GameAction::Accept(game_id) => { + let current_coin = get_current_coin(&self.handshake_state, &game_id)?; + let player_ch = self.channel_handler_mut()?; + debug!( + "{} on chain: accept game coin {current_coin:?}", + player_ch.is_initial_potato() + ); + let (env, _system_interface) = penv.env(); + let result_transaction = + player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; + self.have_potato = PotatoState::Present; + if let Some(_transaction) = result_transaction { + todo!(); + } else { + debug!("Accepted game when our share was zero"); } + Ok(()) + } + x => { + todo!("unexpected move type {x:?}"); } - } else { - Err(Error::StrErr("not on chain".to_string())) } } diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 33af20ef..f201a7cf 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -209,7 +209,7 @@ impl ToLocalUI for SimulatedPeer { fn game_cancelled(&mut self, _id: &GameID) -> Result<(), Error> { todo!(); } - fn shutdown_complete(&mut self, reward_coin_string: Option<&CoinString>) -> Result<(), Error> { + fn shutdown_complete(&mut self, _reward_coin_string: Option<&CoinString>) -> Result<(), Error> { todo!(); } fn going_on_chain(&mut self, _got_error: bool) -> Result<(), Error> { @@ -787,7 +787,6 @@ fn run_calpoker_container_with_action_list_with_success_predicate( let mut ending = false; let mut current_move = moves.iter(); - let mut last_move = 0; let mut num_steps = 0; // Give coins to the cradles. @@ -936,7 +935,6 @@ fn run_calpoker_container_with_action_list_with_success_predicate( if let Some(ga) = current_move.next() { match ga { GameAction::Move(who, readable, _) => { - last_move = *who; debug!("make move"); let readable_program = Program::from_nodeptr(allocator, *readable).expect("should convert"); @@ -957,7 +955,6 @@ fn run_calpoker_container_with_action_list_with_success_predicate( todo!(); } GameAction::FakeMove(who, readable, move_data) => { - last_move = *who; // This is a fake move. We give that move to the given target channel // handler as a their move. debug!("make move"); diff --git a/src/tests/referee.rs b/src/tests/referee.rs index f92a7b73..5752cafd 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -256,7 +256,7 @@ fn test_referee_smoke() { debug!("their_move_wire_data {their_move_local_update:?}"); let state_node = state.to_nodeptr(&mut allocator).expect("should cvt"); - let validator_move_args = ValidatorMoveArgs { + let _validator_move_args = ValidatorMoveArgs { state: state_node, evidence: allocator.allocator().null(), mover_puzzle: reftest.my_identity.puzzle.to_program(), From 4cd38c0b6085d8de60941bc8c7ce2165c9717f3f Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 21:04:54 -0800 Subject: [PATCH 15/50] fmt --- src/potato_handler.rs | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 171fd620..988668b0 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1888,20 +1888,19 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - let get_current_coin = - |hs: &HandshakeState, game_id: &GameID| -> Result { - if let HandshakeState::OnChain(game_map) = hs { - if let Some((current, _game)) = - game_map.iter().find(|g| g.1.game_id == *game_id) - { - Ok(current.clone()) - } else { - Err(Error::StrErr("no matching game".to_string())) - } + let get_current_coin = |hs: &HandshakeState, + game_id: &GameID| + -> Result { + if let HandshakeState::OnChain(game_map) = hs { + if let Some((current, _game)) = game_map.iter().find(|g| g.1.game_id == *game_id) { + Ok(current.clone()) } else { - Err(Error::StrErr("not on chain".to_string())) + Err(Error::StrErr("no matching game".to_string())) } - }; + } else { + Err(Error::StrErr("not on chain".to_string())) + } + }; debug!("do_on_chain_action {action:?}"); match action { From 809a9f64d2435d04237e771f5fd5f1c13b093531 Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 21:15:13 -0800 Subject: [PATCH 16/50] clippy --- src/channel_handler/types.rs | 2 +- src/common/types.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index e75c8080..1860f7f6 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -99,7 +99,7 @@ pub struct PrintableGameStartInfo<'a> { pub info: &'a GameStartInfo, } -impl<'a> std::fmt::Debug for PrintableGameStartInfo<'a> { +impl std::fmt::Debug for PrintableGameStartInfo<'_> { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { writeln!(formatter, "- game_id: {:?}", self.info.game_id)?; writeln!(formatter, "- amount: {:?}", self.info.amount)?; diff --git a/src/common/types.rs b/src/common/types.rs index 88de173d..244e4522 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -175,7 +175,7 @@ impl Distribution for Standard { struct SerdeByteConsumer; -impl<'de> Visitor<'de> for SerdeByteConsumer { +impl Visitor<'_> for SerdeByteConsumer { type Value = Vec; fn expecting(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fmt.write_str("expected bytes") @@ -507,7 +507,7 @@ pub enum Sha256Input<'a> { Array(Vec>), } -impl<'a> Sha256Input<'a> { +impl Sha256Input<'_> { fn update(&self, hasher: &mut Sha256) { match self { Sha256Input::Bytes(b) => { From bf8006a784f12c1984be7e7949f98c315cf5b1eb Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 21:59:12 -0800 Subject: [PATCH 17/50] Fix referee slash test --- src/referee.rs | 91 ++++++++++++++++++++++---------------------- src/tests/referee.rs | 59 ++++++++++------------------ 2 files changed, 66 insertions(+), 84 deletions(-) diff --git a/src/referee.rs b/src/referee.rs index 9a712308..856d5b25 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -329,6 +329,7 @@ pub struct InternalValidatorArgs { timeout: Timeout, max_move_size: usize, referee_hash: PuzzleHash, + move_args: ValidatorMoveArgs, } impl InternalValidatorArgs { @@ -337,9 +338,8 @@ impl InternalValidatorArgs { allocator: &mut AllocEncoder, me: NodePtr, validator_mod_hash: PuzzleHash, - move_args: &ValidatorMoveArgs, ) -> Result { - let converted_vma = move_args.to_nodeptr(allocator, me)?; + let converted_vma = self.move_args.to_nodeptr(allocator, me)?; let move_node = allocator.encode_atom(&self.move_made).into_gen()?; ( validator_mod_hash, @@ -1417,9 +1417,47 @@ impl RefereeMaker { pub fn run_validator_for_their_move( &self, allocator: &mut AllocEncoder, - validator_move_args: &InternalValidatorArgs, - move_args: &ValidatorMoveArgs, + evidence: NodePtr, ) -> Result { + let previous_puzzle_args = self.args_for_this_coin(); + let puzzle_args = self.spend_this_coin(); + let new_puzzle_hash = curry_referee_puzzle_hash( + allocator, + &self.fixed.referee_coin_puzzle_hash, + &puzzle_args, + )?; + + let validator_move_args = InternalValidatorArgs { + move_made: puzzle_args.game_move.basic.move_made.clone(), + new_validation_info_hash: puzzle_args.game_move.validation_info_hash.clone(), + mover_share: puzzle_args.game_move.basic.mover_share.clone(), + previous_validation_info_hash: previous_puzzle_args + .game_move + .validation_info_hash + .clone(), + mover_puzzle_hash: puzzle_args.mover_puzzle_hash.clone(), + waiter_puzzle_hash: puzzle_args.waiter_puzzle_hash.clone(), + amount: self.fixed.amount.clone(), + timeout: self.fixed.timeout.clone(), + max_move_size: puzzle_args.game_move.basic.max_move_size, + referee_hash: new_puzzle_hash.clone(), + move_args: ValidatorMoveArgs { + evidence, + state: self.get_game_state().to_nodeptr(allocator)?, + mover_puzzle: self.fixed.my_identity.puzzle.to_program(), + solution: self + .fixed + .my_identity + .standard_solution( + allocator, + &[( + self.fixed.my_identity.puzzle_hash.clone(), + Amount::default(), + )], + ) + .expect("should create"), + }, + }; let (_state, validation_program) = self.get_validation_program_for_their_move()?; let validation_program_nodeptr = validation_program.to_nodeptr(); let validation_program_hexer = @@ -1429,7 +1467,6 @@ impl RefereeMaker { allocator, validation_program_nodeptr, PuzzleHash::from_hash(validation_program_mod_hash.clone()), - move_args, )?; let validator_full_args = Program::from_nodeptr(allocator, validator_full_args_node)?; @@ -1694,9 +1731,8 @@ impl RefereeMaker { &self, allocator: &mut AllocEncoder, coin_string: &CoinString, - _state_number: usize, ) -> Result, Error> { - let previous_puzzle_args = self.args_for_this_coin(); + let evidence = allocator.allocator().null(); let puzzle_args = self.spend_this_coin(); let new_puzzle = curry_referee_puzzle( allocator, @@ -1710,44 +1746,9 @@ impl RefereeMaker { &self.fixed.referee_coin_puzzle_hash, &puzzle_args, )?; - - let nil = allocator.allocator().null(); - let validator_args = ValidatorMoveArgs { - evidence: nil, - state: self.get_game_state().to_nodeptr(allocator)?, - mover_puzzle: self.fixed.my_identity.puzzle.to_program(), - solution: self - .fixed - .my_identity - .standard_solution( - allocator, - &[( - self.fixed.my_identity.puzzle_hash.clone(), - Amount::default(), - )], - ) - .expect("should create"), - }; - let internal_validator_args = InternalValidatorArgs { - move_made: puzzle_args.game_move.basic.move_made.clone(), - new_validation_info_hash: puzzle_args.game_move.validation_info_hash.clone(), - mover_share: puzzle_args.game_move.basic.mover_share.clone(), - previous_validation_info_hash: previous_puzzle_args - .game_move - .validation_info_hash - .clone(), - mover_puzzle_hash: puzzle_args.mover_puzzle_hash.clone(), - waiter_puzzle_hash: puzzle_args.waiter_puzzle_hash.clone(), - amount: self.fixed.amount.clone(), - timeout: self.fixed.timeout.clone(), - max_move_size: puzzle_args.game_move.basic.max_move_size, - referee_hash: new_puzzle_hash.clone(), - }; - // my_inner_solution maker is just in charge of making aggsigs from // conditions. - let full_slash_result = - self.run_validator_for_their_move(allocator, &internal_validator_args, &validator_args); + let full_slash_result = self.run_validator_for_their_move(allocator, evidence); match full_slash_result { Ok(slash) => { debug!( @@ -1893,9 +1894,7 @@ impl RefereeMaker { debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr| { - if let Some(result) = - self.check_their_turn_for_slash(allocator, coin_string, state_number)? - { + if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { Ok(result) } else { Ok(TheirTurnCoinSpentResult::Moved { diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 5752cafd..1287c3a3 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -1,10 +1,9 @@ -use clvm_traits::{clvm_curried_args, ToClvm}; +use clvm_traits::{clvm_curried_args, ClvmEncoder, ToClvm}; use clvm_utils::CurriedProgram; use rand::prelude::*; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; -use clvm_tools_rs::classic::clvm_tools::binutils::assemble; use clvmr::NodePtr; use log::debug; @@ -13,10 +12,10 @@ use crate::channel_handler::game_handler::GameHandler; use crate::channel_handler::types::{GameStartInfo, ReadableMove, ValidationProgram}; use crate::common::standard_coin::{read_hex_puzzle, ChiaIdentity}; use crate::common::types::{ - Aggsig, AllocEncoder, Amount, Error, GameID, PrivateKey, Puzzle, PuzzleHash, Sha256tree, - Timeout, + Aggsig, AllocEncoder, Amount, Error, GameID, PrivateKey, Program, Puzzle, PuzzleHash, + Sha256tree, Timeout, }; -use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker, ValidatorMoveArgs}; +use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker}; pub struct DebugGamePrograms { pub my_validation_program: NodePtr, @@ -190,7 +189,7 @@ fn test_referee_smoke() { let timeout = Timeout::new(1000); let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); - let init_state = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); + let init_state = ((), ()).to_clvm(&mut allocator).expect("should assemble"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); @@ -217,14 +216,13 @@ fn test_referee_smoke() { &game_start_info, ); - let readable_move = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); + let readable_move = ((), ()).to_clvm(&mut allocator).expect("should cvt"); let readable_my_move = ReadableMove::from_nodeptr(&mut allocator, readable_move).expect("should work"); let my_move_wire_data = reftest .my_referee .my_turn_make_move(&mut allocator, &readable_my_move, rng.gen(), 0) .expect("should move"); - let state = reftest.my_referee.get_game_state().clone(); assert!(my_move_wire_data.details.basic.move_made.is_empty()); let mut off_chain_slash_gives_error = reftest.my_referee.clone(); @@ -255,35 +253,20 @@ fn test_referee_smoke() { debug!("their_move_wire_data {their_move_local_update:?}"); - let state_node = state.to_nodeptr(&mut allocator).expect("should cvt"); - let _validator_move_args = ValidatorMoveArgs { - state: state_node, - evidence: allocator.allocator().null(), - mover_puzzle: reftest.my_identity.puzzle.to_program(), - solution: reftest - .my_identity - .standard_solution( - &mut allocator, - &[(reftest.my_identity.puzzle_hash.clone(), Amount::default())], - ) - .expect("should create"), - }; + let nil = allocator.encode_atom(&[]).expect("should encode"); + let validator_result = reftest + .their_referee + .run_validator_for_their_move(&mut allocator, nil); + assert!(validator_result.is_err()); - todo!(); - // let validator_result = reftest - // .their_referee - // .run_validator_for_their_move(&mut allocator, &validator_move_args); - // assert!(validator_result.is_err()); - - // assert!(reftest.my_referee.processing_my_turn()); - // let their_move_result = reftest - // .my_referee - // .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0, true) - // .expect("should run"); - // assert_eq!(their_move_result.message, b"message data"); - // assert_eq!( - // disassemble(allocator.allocator(), their_move_result.readable_move, None), - // "(())" - // ); - // assert!(!reftest.my_referee.processing_my_turn()); + assert!(reftest.my_referee.processing_my_turn()); + let their_move_result = reftest + .my_referee + .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0) + .expect("should run"); + assert_eq!(their_move_result.message, b"message data"); + let readable_prog = + Program::from_nodeptr(&mut allocator, their_move_result.readable_move).expect("should cvt"); + assert_eq!(format!("{:?}", readable_prog), "Program(ff8080)"); + assert!(!reftest.my_referee.processing_my_turn()); } From f69d526ef3c7bfdaf8e1db3532274389a694369c Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 13 Dec 2024 22:32:10 -0800 Subject: [PATCH 18/50] Fix up wasm --- src/channel_handler/types.rs | 4 + wasm/src/mod.rs | 44 ++-- wasm/tests/package.json | 6 +- wasm/tests/src/lib/tests/index.test.ts | 4 +- wasm/tests/yarn.lock | 301 +++++++++++++++---------- 5 files changed, 212 insertions(+), 147 deletions(-) diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 1860f7f6..4c96a0b0 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -283,6 +283,10 @@ impl ReadableMove { pub fn from_program(p: Program) -> Self { ReadableMove(p) } + + pub fn to_program(&self) -> &Program { + &self.0 + } } impl ToClvm for ReadableMove { diff --git a/wasm/src/mod.rs b/wasm/src/mod.rs index a910711d..cdf61ffd 100644 --- a/wasm/src/mod.rs +++ b/wasm/src/mod.rs @@ -24,10 +24,6 @@ use chia_gaming::common::standard_coin::{ChiaIdentity, wasm_deposit_file}; use crate::map_m::map_m; -#[cfg(feature = "wee_alloc")] -#[global_allocator] -static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; - #[wasm_bindgen(typescript_custom_section)] const TS_APPEND_CONTENT: &'static str = r#" export type Amount = { @@ -151,6 +147,7 @@ struct JsGameCradleConfig { // float or decimal string their_contribution: JsAmount, channel_timeout: i32, + unroll_timeout: i32, // hex string for puzzle hash reward_puzzle_hash: String, } @@ -183,6 +180,7 @@ fn get_game_config<'b>( my_contribution: jsconfig.my_contribution.amt.clone(), their_contribution: jsconfig.their_contribution.amt.clone(), reward_puzzle_hash: PuzzleHash::from_hash(Hash::from_slice(&reward_puzzle_hash_bytes)), + unroll_timeout: Timeout::new(jsconfig.unroll_timeout as u64), }) } @@ -400,7 +398,7 @@ pub fn accept(cid: i32, id: &str) -> Result<(), JsValue> { #[wasm_bindgen] pub fn shut_down(cid: i32) -> Result<(), JsValue> { with_game(cid, move |cradle: &mut JsCradle| { - cradle.cradle.shut_down() + cradle.cradle.shut_down(&mut cradle.allocator, &mut cradle.rng) }) } @@ -442,20 +440,18 @@ impl ToLocalUI for JsLocalUI { }) } - fn opponent_moved(&mut self, allocator: &mut AllocEncoder, game_id: &GameID, readable_move: ReadableMove) -> Result<(), chia_gaming::common::types::Error> { + fn opponent_moved(&mut self, _allocator: &mut AllocEncoder, game_id: &GameID, readable_move: ReadableMove) -> Result<(), chia_gaming::common::types::Error> { call_javascript_from_collection(&self.callbacks, "opponent_moved", |args_array| { args_array.set(0, JsValue::from_str(&game_id_to_string(game_id))); - let program = Program::from_nodeptr(allocator, readable_move.to_nodeptr())?; - args_array.set(1, JsValue::from_str(&program.to_hex())); + args_array.set(1, JsValue::from_str(&readable_move.to_program().to_hex())); Ok(()) }) } - fn game_message(&mut self, allocator: &mut AllocEncoder, game_id: &GameID, readable: ReadableMove) -> Result<(), chia_gaming::common::types::Error> { + fn game_message(&mut self, _allocator: &mut AllocEncoder, game_id: &GameID, readable: ReadableMove) -> Result<(), chia_gaming::common::types::Error> { call_javascript_from_collection(&self.callbacks, "game_message", |args_array| { args_array.set(0, JsValue::from_str(&game_id_to_string(game_id))); - let program = Program::from_nodeptr(allocator, readable.to_nodeptr())?; - args_array.set(1, JsValue::from_str(&program.to_hex())); + args_array.set(1, JsValue::from_str(&readable.to_program().to_hex())); Ok(()) }) } @@ -475,15 +471,16 @@ impl ToLocalUI for JsLocalUI { }) } - fn shutdown_complete(&mut self, coin: &CoinString) -> Result<(), chia_gaming::common::types::Error> { + fn shutdown_complete(&mut self, coin: Option<&CoinString>) -> Result<(), chia_gaming::common::types::Error> { call_javascript_from_collection(&self.callbacks, "shutdown_complete", |args_array| { - args_array.set(0, JsValue::from_str(&hex::encode(&coin.to_bytes()))); + args_array.set(0, coin.map(|c| JsValue::from_str(&hex::encode(&c.to_bytes()))).unwrap_or_else(|| JsValue::NULL.clone())); Ok(()) }) } - fn going_on_chain(&mut self) -> Result<(), chia_gaming::common::types::Error> { - call_javascript_from_collection(&self.callbacks, "going_on_chain", |_args_array| { + fn going_on_chain(&mut self, got_error: bool) -> Result<(), chia_gaming::common::types::Error> { + call_javascript_from_collection(&self.callbacks, "going_on_chain", |args_array| { + args_array.set(0, JsValue::from_bool(got_error)); Ok(()) }) } @@ -560,9 +557,8 @@ fn spend_bundle_to_js(spend_bundle: &SpendBundle) -> JsSpendBundle { } } -fn readable_move_to_hex(allocator: &mut AllocEncoder, rm: &ReadableMove) -> Result { - let program = Program::from_nodeptr(allocator, rm.to_nodeptr())?; - Ok(program.to_hex()) +fn readable_move_to_hex(rm: &ReadableMove) -> Result { + Ok(rm.to_program().to_hex()) } trait IntoE { @@ -592,12 +588,11 @@ impl> IntoE for Result { } fn idle_result_to_js( - allocator: &mut AllocEncoder, idle_result: &IdleResult ) -> Result { let opponent_move = if let Some((gid, vs)) = &idle_result.opponent_move { - Some((game_id_to_string(gid), readable_move_to_hex(allocator, vs)?)) + Some((game_id_to_string(gid), readable_move_to_hex(vs)?)) } else { None }; @@ -620,12 +615,15 @@ fn idle_result_to_js( pub fn idle(cid: i32, callbacks: JsValue) -> Result { let mut local_ui = to_local_ui(callbacks)?; with_game(cid, move |cradle: &mut JsCradle| { - let idle_result = cradle.cradle.idle( + if let Some(idle_result) = cradle.cradle.idle( &mut cradle.allocator, &mut cradle.rng, &mut local_ui - )?; - idle_result_to_js(&mut cradle.allocator, &idle_result) + )? { + idle_result_to_js(&idle_result) + } else { + Ok(JsValue::NULL.clone()) + } }) } diff --git a/wasm/tests/package.json b/wasm/tests/package.json index 51530d09..154c4d25 100644 --- a/wasm/tests/package.json +++ b/wasm/tests/package.json @@ -6,9 +6,9 @@ "types": "build/types/index.d.ts", "scripts": { "start": "webpack serve --config webpack.config.demo.js", - "build": "webpack && tsc", + "build": "webpack && ./node_modules/typescript/bin/tsc", "build:demo": "webpack --config webpack.config.demo.js", - "test": "tsc -p tstestconfig.json --noEmit && jest", + "test": "./node_modules/typescript/bin/tsc -p tstestconfig.json --noEmit && jest", "coverage": "npm run test -- --coverage", "prepare": "npm run build", "trypublish": "npm publish || true" @@ -36,7 +36,6 @@ "@babel/core": "^7.22.10", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-transform-typescript": "^7.22.10", - "core-js": "^3.38.1", "@babel/preset-env": "^7.22.10", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^4.33.0", @@ -44,6 +43,7 @@ "babel-eslint": "^10.1.0", "babel-loader": "^9.1.3", "babel-preset-minify": "^0.5.2", + "core-js": "^3.38.1", "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", "eslint": "^7.32.0", diff --git a/wasm/tests/src/lib/tests/index.test.ts b/wasm/tests/src/lib/tests/index.test.ts index e3687c96..c5830ca7 100644 --- a/wasm/tests/src/lib/tests/index.test.ts +++ b/wasm/tests/src/lib/tests/index.test.ts @@ -31,6 +31,7 @@ class ChiaGame { my_contribution: {amt: my_contribution}, their_contribution: {amt: their_contribution}, channel_timeout: env.timeout, + unroll_timeout: env.unroll_timeout, reward_puzzle_hash: identity.puzzle_hash, }); console.log(`constructed ${have_potato}`); @@ -112,7 +113,8 @@ it('loads', async () => { game_types: { "calpoker": calpoker_hex }, - timeout: 99 + timeout: 99, + unroll_timeout: 5 }; let fake_coin1 = identity1.puzzle_hash + identity1.puzzle_hash + '64'; diff --git a/wasm/tests/yarn.lock b/wasm/tests/yarn.lock index 75726fcb..49094d1b 100644 --- a/wasm/tests/yarn.lock +++ b/wasm/tests/yarn.lock @@ -31,13 +31,6 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": version "7.22.10" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz" @@ -48,18 +41,25 @@ "@babel/code-frame@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.10": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.22.10", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.8.0": version "7.22.10" resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz" integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== @@ -92,7 +92,7 @@ "@babel/generator@^7.25.6": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz" integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: "@babel/types" "^7.25.6" @@ -263,7 +263,7 @@ "@babel/helper-string-parser@^7.24.8": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.22.5": @@ -273,7 +273,7 @@ "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== "@babel/helper-validator-option@^7.22.5": @@ -310,7 +310,7 @@ "@babel/highlight@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: "@babel/helper-validator-identifier" "^7.24.7" @@ -325,7 +325,7 @@ "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz" integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== dependencies: "@babel/types" "^7.25.6" @@ -1023,16 +1023,16 @@ "@babel/template@^7.25.0": version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz" integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" "@babel/parser" "^7.25.0" "@babel/types" "^7.25.0" -"@babel/traverse@^7.22.10", "@babel/traverse@^7.23.2", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.22.10", "@babel/traverse@^7.7.0": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz" integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" @@ -1054,7 +1054,7 @@ "@babel/types@^7.25.0", "@babel/types@^7.25.6": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz" integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: "@babel/helper-string-parser" "^7.24.8" @@ -1319,7 +1319,7 @@ "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -1338,7 +1338,7 @@ "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": @@ -1364,7 +1364,7 @@ "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -1388,7 +1388,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1691,7 +1691,7 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@^4.33.0": +"@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.33.0": version "4.33.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== @@ -1735,7 +1735,7 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== @@ -1836,7 +1836,7 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== @@ -1899,12 +1899,12 @@ acorn-jsx@^5.3.1: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.4.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.7.1, acorn@^8.8.2: +acorn@^8, acorn@^8.7.1, acorn@^8.8.2: version "8.10.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -1928,7 +1928,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1938,7 +1938,17 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.0.1: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2004,16 +2014,16 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -2407,7 +2417,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.4, browserslist@^4.21.9: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.4, browserslist@^4.21.9, "browserslist@>= 4.21.0": version "4.21.10" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== @@ -2586,16 +2596,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colord@^2.9.1: version "2.9.3" resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" @@ -2707,7 +2717,7 @@ core-js-compat@^3.31.0: core-js@^3.38.1: version "3.38.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.1.tgz#aa375b79a286a670388a1a363363d53677c0383e" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz" integrity sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw== core-util-is@~1.0.0: @@ -2858,13 +2868,6 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" @@ -2872,6 +2875,13 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + dedent@^1.0.0: version "1.5.1" resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" @@ -2899,16 +2909,16 @@ define-lazy-prop@^2.0.0: resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3123,7 +3133,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3155,7 +3165,7 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.32.0: +eslint@*, "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", eslint@^7.32.0, "eslint@>= 4.12.1", eslint@>=5: version "7.32.0" resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== @@ -3387,7 +3397,7 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@^6.2.0: +file-loader@*, file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -3482,11 +3492,6 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -3556,7 +3561,14 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: +globals@^13.6.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globals@^13.9.0: version "13.20.0" resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== @@ -3676,6 +3688,16 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -3687,16 +3709,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -3744,7 +3756,12 @@ ignore@^4.0.6: resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.1.8: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +ignore@^5.2.0: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -3778,7 +3795,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3793,16 +3810,16 @@ interpret@^3.1.1: resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.1.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -4139,7 +4156,7 @@ jest-resolve-dependencies@^29.6.2: jest-regex-util "^29.4.3" jest-snapshot "^29.6.2" -jest-resolve@^29.6.2: +jest-resolve@*, jest-resolve@^29.6.2: version "29.6.2" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz" integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== @@ -4542,7 +4559,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -5117,7 +5134,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.21, postcss@^8.4.24: +postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.4.21, postcss@^8.4.24: version "8.4.27" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz" integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== @@ -5393,22 +5410,45 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -5449,7 +5489,28 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.2.1, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: +semver@^7.2.1: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -5591,14 +5652,6 @@ source-map-js@^1.0.1, source-map-js@^1.0.2: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -5607,6 +5660,14 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" @@ -5647,15 +5708,29 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" string-length@^4.0.1: version "4.0.2" @@ -5674,20 +5749,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -5886,7 +5947,7 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^4.9.5: +typescript@^4.9.5, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -5914,7 +5975,7 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -6004,7 +6065,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webpack-cli@^5.1.4: +webpack-cli@^5.1.4, webpack-cli@5.x.x: version "5.1.4" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz" integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== @@ -6083,7 +6144,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.88.2: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.88.2, webpack@>=5, webpack@5.x.x: version "5.88.2" resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz" integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== @@ -6113,7 +6174,7 @@ webpack@^5.88.2: watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== From dbcb7ce0fff6145dc0ac3a9b0728e080a38a4432 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 16 Dec 2024 12:36:23 -0800 Subject: [PATCH 19/50] add decoding of the game outcome to the piss_off_peer_complete test. we need to ensure the correct side won the channel content --- src/tests/peer/potato_handler_sim.rs | 147 +++++++++++++++++---------- 1 file changed, 92 insertions(+), 55 deletions(-) diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index f201a7cf..e063dd94 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -1,6 +1,8 @@ use std::collections::HashMap; use std::rc::Rc; +use clvm_tools_rs::classic::clvm_tools::binutils::disassemble; + use clvm_traits::{ClvmEncoder, ToClvm}; use log::debug; use rand::prelude::*; @@ -18,6 +20,7 @@ use crate::common::types::{ PuzzleHash, Sha256tree, Spend, SpendBundle, Timeout, ToQuotedProgram, }; use crate::games::poker_collection; +use crate::games::calpoker::decode_calpoker_readable; use crate::peer_container::{ report_coin_changes_to_peer, FullCoinSetAdapter, GameCradle, MessagePeerQueue, MessagePipe, SynchronousGameCradle, SynchronousGameCradleConfig, WatchEntry, WatchReport, @@ -651,16 +654,18 @@ struct LocalTestUIReceiver { opponent_moved: bool, go_on_chain: bool, got_error: bool, + opponent_moves: Vec<(GameID, ReadableMove)>, } impl ToLocalUI for LocalTestUIReceiver { fn opponent_moved( &mut self, _allocator: &mut AllocEncoder, - _id: &GameID, - _readable: ReadableMove, + id: &GameID, + readable: ReadableMove, ) -> Result<(), Error> { self.opponent_moved = true; + self.opponent_moves.push((id.clone(), readable.clone())); Ok(()) } @@ -696,22 +701,29 @@ impl ToLocalUI for LocalTestUIReceiver { type GameRunEarlySuccessPredicate<'a> = Option<&'a dyn Fn(&[SynchronousGameCradle]) -> bool>; +struct CalpokerRunOutcome { + identities: [ChiaIdentity; 2], + cradles: [SynchronousGameCradle; 2], + local_uis: [LocalTestUIReceiver; 2], + simulator: Simulator, +} + fn run_calpoker_container_with_action_list_with_success_predicate( allocator: &mut AllocEncoder, moves: &[GameAction], pred: GameRunEarlySuccessPredicate, -) { +) -> Result { // Coinset adapter for each side. let mut rng = ChaCha8Rng::from_seed([0; 32]); let game_type_map = poker_collection(allocator); let neutral_pk: PrivateKey = rng.gen(); - let neutral_identity = ChiaIdentity::new(allocator, neutral_pk).expect("should work"); + let neutral_identity = ChiaIdentity::new(allocator, neutral_pk)?; let pk1: PrivateKey = rng.gen(); - let id1 = ChiaIdentity::new(allocator, pk1).expect("should work"); + let id1 = ChiaIdentity::new(allocator, pk1)?; let pk2: PrivateKey = rng.gen(); - let id2 = ChiaIdentity::new(allocator, pk2).expect("should work"); + let id2 = ChiaIdentity::new(allocator, pk2)?; let identities: [ChiaIdentity; 2] = [id1.clone(), id2.clone()]; let mut coinset_adapter = FullCoinSetAdapter::default(); @@ -726,11 +738,9 @@ fn run_calpoker_container_with_action_list_with_success_predicate( simulator.farm_block(&identities[1].puzzle_hash); let coins0 = simulator - .get_my_coins(&identities[0].puzzle_hash) - .expect("should work"); + .get_my_coins(&identities[0].puzzle_hash).into_gen()?; let coins1 = simulator - .get_my_coins(&identities[1].puzzle_hash) - .expect("should work"); + .get_my_coins(&identities[1].puzzle_hash).into_gen()?; // Make a 100 coin for each player (and test the deleted and created events). let (parent_coin_0, _rest_0) = simulator @@ -740,8 +750,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( &identities[0], &coins0[0], Amount::new(100), - ) - .expect("should work"); + )?; let (parent_coin_1, _rest_1) = simulator .transfer_coin_amount( allocator, @@ -749,8 +758,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( &identities[1], &coins1[0], Amount::new(100), - ) - .expect("should work"); + )?; simulator.farm_block(&neutral_identity.puzzle_hash); @@ -790,12 +798,8 @@ fn run_calpoker_container_with_action_list_with_success_predicate( let mut num_steps = 0; // Give coins to the cradles. - cradles[0] - .opening_coin(allocator, &mut rng, parent_coin_0) - .expect("should work"); - cradles[1] - .opening_coin(allocator, &mut rng, parent_coin_1) - .expect("should work"); + cradles[0].opening_coin(allocator, &mut rng, parent_coin_0)?; + cradles[1].opening_coin(allocator, &mut rng, parent_coin_1)?; // XXX Move on to shutdown complete. while !ending @@ -811,13 +815,17 @@ fn run_calpoker_container_with_action_list_with_success_predicate( let current_height = simulator.get_current_height(); let current_coins = simulator.get_all_coins().expect("should work"); let watch_report = coinset_adapter - .make_report_from_coin_set_update(current_height as u64, ¤t_coins) - .expect("should work"); + .make_report_from_coin_set_update(current_height as u64, ¤t_coins)?; if let Some(p) = &pred { if p(&cradles) { // Success. - return; + return Ok(CalpokerRunOutcome { + identities, + cradles, + local_uis, + simulator, + }); } } @@ -828,18 +836,15 @@ fn run_calpoker_container_with_action_list_with_success_predicate( local_uis[i].go_on_chain = false; let got_error = local_uis[i].got_error; cradles[i] - .go_on_chain(allocator, &mut rng, &mut local_uis[i], got_error) - .expect("should work"); + .go_on_chain(allocator, &mut rng, &mut local_uis[i], got_error)?; } cradles[i] - .new_block(allocator, &mut rng, current_height, &watch_report) - .expect("should work"); + .new_block(allocator, &mut rng, current_height, &watch_report)?; loop { let result = if let Some(result) = cradles[i] - .idle(allocator, &mut rng, &mut local_uis[i]) - .expect("should work") + .idle(allocator, &mut rng, &mut local_uis[i])? { result } else { @@ -857,22 +862,20 @@ fn run_calpoker_container_with_action_list_with_success_predicate( &mut rng, coin, ps_res.as_ref().map(|ps| (&ps.0, &ps.1)), - ) - .expect("should succeed"); + )?; } } for tx in result.outbound_transactions.iter() { debug!("PROCESS TX {tx:?}"); let included_result = simulator - .push_tx(allocator, &tx.spends) - .expect("should work"); + .push_tx(allocator, &tx.spends).into_gen()?; debug!("included_result {included_result:?}"); assert_eq!(included_result.code, 1); } for msg in result.outbound_messages.iter() { - cradles[i ^ 1].deliver_message(msg).expect("should work"); + cradles[i ^ 1].deliver_message(msg)?; } if !result.continue_on { @@ -898,8 +901,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( my_turn: true, parameters: vec![0x80], }, - ) - .expect("should run"); + )?; cradles[1] .start_games( @@ -914,8 +916,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( my_turn: false, parameters: vec![0x80], }, - ) - .expect("should run"); + )?; can_move = true; } else if can_move @@ -937,7 +938,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( GameAction::Move(who, readable, _) => { debug!("make move"); let readable_program = - Program::from_nodeptr(allocator, *readable).expect("should convert"); + Program::from_nodeptr(allocator, *readable)?; let encoded_readable_move = readable_program.bytes(); let entropy = rng.gen(); cradles[*who] @@ -947,8 +948,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( &game_ids[0], encoded_readable_move.to_vec(), entropy, - ) - .expect("should work"); + )?; } GameAction::GoOnChain(_who) => { debug!("go on chain"); @@ -959,7 +959,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( // handler as a their move. debug!("make move"); let readable_program = - Program::from_nodeptr(allocator, *readable).expect("should convert"); + Program::from_nodeptr(allocator, *readable)?; let encoded_readable_move = readable_program.bytes(); let entropy = rng.gen(); // Do like we're sending a real message. @@ -970,8 +970,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( &game_ids[0], encoded_readable_move.to_vec(), entropy, - ) - .expect("should work"); + )?; cradles[*who] .replace_last_message(|msg_envelope| { @@ -990,29 +989,36 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .move_made .append(&mut move_data.clone()); Ok(PeerMessage::Move(game_id.clone(), fake_move)) - }) - .expect("should be able to sabotage"); + })?; } GameAction::Accept(who) | GameAction::Timeout(who) => { ending = true; cradles[*who] - .accept(allocator, &mut rng, &game_ids[0]) - .expect("should work"); + .accept(allocator, &mut rng, &game_ids[0])?; } GameAction::Shutdown(who, _) => { ending = true; cradles[*who] - .shut_down(allocator, &mut rng) - .expect("should work"); + .shut_down(allocator, &mut rng)?; } } } } } + + Ok(CalpokerRunOutcome { + identities, + cradles, + local_uis, + simulator, + }) } -fn run_calpoker_container_with_action_list(allocator: &mut AllocEncoder, moves: &[GameAction]) { - run_calpoker_container_with_action_list_with_success_predicate(allocator, moves, None); +fn run_calpoker_container_with_action_list( + allocator: &mut AllocEncoder, + moves: &[GameAction] +) -> Result { + run_calpoker_container_with_action_list_with_success_predicate(allocator, moves, None) } #[test] @@ -1030,7 +1036,7 @@ fn sim_test_with_peer_container() { &mut allocator, &moves, Some(&|cradles| cradles[0].finished().is_some() && cradles[1].finished().is_some()), - ); + ).expect("should finish"); } #[test] @@ -1047,7 +1053,7 @@ fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { &mut allocator, &moves, Some(&|cradles| cradles[0].is_on_chain() && cradles[1].is_on_chain()), - ); + ).expect("should finish"); } #[test] @@ -1065,5 +1071,36 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { } else { panic!("no move 1 to replace"); } - run_calpoker_container_with_action_list(&mut allocator, &moves); + let outcome = run_calpoker_container_with_action_list(&mut allocator, &moves).expect("should finish"); + let p1_ph = outcome.identities[0].puzzle_hash.clone(); + let p2_ph = outcome.identities[1].puzzle_hash.clone(); + let p1_coins = outcome.simulator.get_my_coins(&p1_ph).expect("should work"); + let p2_coins = outcome.simulator.get_my_coins(&p2_ph).expect("should work"); + let p1_balance: u64 = p1_coins.iter().map(|c| { + c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0) + }).sum(); + let p2_balance: u64 = p2_coins.iter().map(|c| { + c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0) + }).sum(); + for (pn, lui) in outcome.local_uis.iter().enumerate() { + for the_move in lui.opponent_moves.iter() { + let the_move_to_node = the_move.1.to_nodeptr(&mut allocator).expect("should work"); + debug!("player {pn} opponent move {}", disassemble(allocator.allocator(), the_move_to_node, None)); + } + } + let outcome_move = &outcome.local_uis[0].opponent_moves[2]; + let outcome_node = outcome_move.1.to_nodeptr(&mut allocator).expect("should work"); + let decoded_outcome = decode_calpoker_readable( + &mut allocator, + outcome_node, + Amount::new(200), + false + ).expect("should decode"); + debug!("outcome move {}", disassemble(allocator.allocator(), outcome_node, None)); + debug!("game outcome {decoded_outcome:?}"); + if decoded_outcome.win_direction != 0 { + assert_eq!(p2_balance, p1_balance + 200); + } else { + assert_eq!(p2_balance + 200, p1_balance); + } } From fe6d1590275694d29d63d23977785c788a76f644 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 16 Dec 2024 22:32:49 -0800 Subject: [PATCH 20/50] WIP, zeroing in on mover share --- src/channel_handler/game_handler.rs | 9 ++++++--- src/channel_handler/mod.rs | 3 ++- src/peer_container.rs | 13 +++++++++---- src/potato_handler.rs | 24 ++++++++++++++---------- src/referee.rs | 25 +++++++++++++++---------- src/tests/game_handler.rs | 2 +- src/tests/peer/potato_handler.rs | 5 +++-- src/tests/peer/potato_handler_sim.rs | 11 +++++++---- src/tests/simenv.rs | 2 +- 9 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 5cdf54ec..21b4c5f6 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -165,8 +165,8 @@ fn run_code( #[derive(Debug, Clone)] pub enum TheirTurnResult { - FinalMove(NodePtr), - MakeMove(NodePtr, GameHandler, Vec), + FinalMove(NodePtr, Amount), + MakeMove(NodePtr, GameHandler, Vec, Amount), Slash(Evidence, Box), } @@ -283,6 +283,7 @@ impl GameHandler { disassemble(allocator.allocator(), pl[5], None) ))); }; + debug!("MOVER_SHARE {mover_share:?}"); let message_parser = if pl[7] == allocator.allocator().null() { None } else { @@ -330,6 +331,7 @@ impl GameHandler { allocator: &mut AllocEncoder, inputs: &TheirTurnInputs, ) -> Result { + debug!("THEIR TURN MOVER SHARE {:?}", inputs.new_move.basic.mover_share); let driver_args = ( inputs.amount.clone(), ( @@ -393,7 +395,7 @@ impl GameHandler { "final move with data {}", disassemble(allocator.allocator(), pl[1], None) ); - Ok(TheirTurnResult::FinalMove(pl[1])) + Ok(TheirTurnResult::FinalMove(pl[1], inputs.new_move.basic.mover_share.clone())) } else { let message_data = if pl.len() == 4 { allocator.allocator().atom(pl[3]).to_vec() @@ -404,6 +406,7 @@ impl GameHandler { pl[1], GameHandler::my_driver_from_nodeptr(allocator, pl[2])?, message_data, + inputs.new_move.basic.mover_share.clone(), )) } } else if move_type == 2 { diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 43004fcb..b3471bf3 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -847,7 +847,7 @@ impl ChannelHandler { env: &mut ChannelHandlerEnv, game_id: &GameID, move_result: &MoveResult, - ) -> Result<(ChannelCoinSpendInfo, NodePtr, Vec), Error> { + ) -> Result<(ChannelCoinSpendInfo, NodePtr, Vec, Amount), Error> { debug!( "{} RECEIVED_POTATO_MOVE {}", self.is_initial_potato(), @@ -890,6 +890,7 @@ impl ChannelHandler { }, their_move_result.readable_move, their_move_result.message, + their_move_result.mover_share, )) } diff --git a/src/peer_container.rs b/src/peer_container.rs index f6174c7d..8df089f9 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -259,7 +259,7 @@ struct SynchronousGameCradleState { outbound_transactions: VecDeque, coin_solution_requests: VecDeque, our_moves: VecDeque<(GameID, Vec)>, - opponent_moves: VecDeque<(GameID, ReadableMove)>, + opponent_moves: VecDeque<(GameID, ReadableMove, Amount)>, raw_game_messages: VecDeque<(GameID, Vec)>, game_messages: VecDeque<(GameID, ReadableMove)>, game_finished: VecDeque<(GameID, Amount)>, @@ -396,8 +396,9 @@ impl ToLocalUI for SynchronousGameCradleState { _allocator: &mut AllocEncoder, id: &GameID, readable: ReadableMove, + my_share: Amount, ) -> Result<(), Error> { - self.opponent_moves.push_back((id.clone(), readable)); + self.opponent_moves.push_back((id.clone(), readable, my_share)); Ok(()) } fn raw_game_message(&mut self, id: &GameID, readable: &[u8]) -> Result<(), Error> { @@ -575,6 +576,7 @@ impl SynchronousGameCradle { let quoted_empty_hash = quoted_empty_conditions.sha256tree(env.allocator); let mut spends = unfunded_offer.clone(); + assert!(!spends.spends.is_empty()); // Create no coins. The target is already created in the partially funded // transaction. // @@ -593,6 +595,9 @@ impl SynchronousGameCradle { signature, }, }); + debug!("s1 {:?}", spends.spends[0]); + debug!("s2 {:?}", spends.spends[1]); + assert_eq!(spends.spends.len(), 2); self.state.outbound_transactions.push_back(spends); @@ -839,8 +844,8 @@ impl GameCradle for SynchronousGameCradle { return Ok(Some(result)); } - if let Some((id, readable)) = self.state.opponent_moves.pop_front() { - local_ui.opponent_moved(allocator, &id, readable)?; + if let Some((id, readable, my_share)) = self.state.opponent_moves.pop_front() { + local_ui.opponent_moved(allocator, &id, readable, my_share)?; result.continue_on = true; return Ok(Some(result)); } diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 988668b0..40899658 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -256,6 +256,7 @@ pub trait ToLocalUI { allocator: &mut AllocEncoder, id: &GameID, readable: ReadableMove, + mover_share: Amount, ) -> Result<(), Error>; fn raw_game_message(&mut self, _id: &GameID, _readable: &[u8]) -> Result<(), Error> { Ok(()) @@ -266,7 +267,7 @@ pub trait ToLocalUI { id: &GameID, readable: ReadableMove, ) -> Result<(), Error>; - fn game_finished(&mut self, id: &GameID, my_share: Amount) -> Result<(), Error>; + fn game_finished(&mut self, id: &GameID, mover_share: Amount) -> Result<(), Error>; fn game_cancelled(&mut self, id: &GameID) -> Result<(), Error>; fn shutdown_complete(&mut self, reward_coin_string: Option<&CoinString>) -> Result<(), Error>; @@ -725,7 +726,7 @@ impl PotatoHandler { self.update_channel_coin_after_receive(penv, &spend_info)?; } PeerMessage::Move(game_id, m) => { - let (spend_info, readable_move, message) = { + let (spend_info, readable_move, message, mover_share) = { let (env, _) = penv.env(); ch.received_potato_move(env, &game_id, &m)? }; @@ -733,7 +734,7 @@ impl PotatoHandler { let (env, system_interface) = penv.env(); let opponent_readable = ReadableMove::from_nodeptr(env.allocator, readable_move)?; - system_interface.opponent_moved(env.allocator, &game_id, opponent_readable)?; + system_interface.opponent_moved(env.allocator, &game_id, opponent_readable, mover_share)?; if !message.is_empty() { system_interface.send_message(&PeerMessage::Message(game_id, message))?; } @@ -1494,10 +1495,11 @@ impl PotatoHandler { } _ => { - return Err(Error::StrErr(format!( - "should not receive message in state {:?}", - self.handshake_state - ))); + return Ok(()); + // return Err(Error::StrErr(format!( + // "should not receive message in state {:?}", + // self.handshake_state + // ))); } } @@ -1951,11 +1953,12 @@ impl PotatoHandler { let (env, _system_interface) = penv.env(); let result_transaction = player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; + let initial_potato = player_ch.is_initial_potato(); self.have_potato = PotatoState::Present; if let Some(_transaction) = result_transaction { todo!(); } else { - debug!("Accepted game when our share was zero"); + debug!("{initial_potato} Accepted game when our share was zero"); } Ok(()) } @@ -2244,7 +2247,7 @@ impl PotatoHandler { CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Timedout { /*my_reward_coin_string*/ .. }) => { todo!(); } - CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable, .. }) => { + CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable, mover_share, .. }) => { debug!("{initial_potato} got a their spend {new_coin_string:?} from ph {:?}", old_definition.puzzle_hash); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { let (puzzle_hash, amt) = @@ -2266,7 +2269,8 @@ impl PotatoHandler { system_interface.opponent_moved( env.allocator, &game_id, - readable + readable, + mover_share, )?; system_interface.register_coin( &new_coin_string, diff --git a/src/referee.rs b/src/referee.rs index 856d5b25..6acbb521 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -59,6 +59,7 @@ pub struct TheirTurnMoveResult { pub puzzle_hash_for_unroll: PuzzleHash, pub readable_move: NodePtr, pub message: Vec, + pub mover_share: Amount, pub original: TheirTurnResult, } @@ -93,6 +94,7 @@ pub enum TheirTurnCoinSpentResult { // New iteration of the game coin. new_coin_string: CoinString, readable: ReadableMove, + mover_share: Amount, }, Slash(Box), } @@ -1529,8 +1531,8 @@ impl RefereeMaker { true, )); - let (readable_move, message) = match &result { - TheirTurnResult::FinalMove(readable_move) => { + let (readable_move, message, mover_share) = match &result { + TheirTurnResult::FinalMove(readable_move, mover_share) => { self.accept_their_move( allocator, None, @@ -1540,9 +1542,9 @@ impl RefereeMaker { state_number, )?; - (*readable_move, vec![]) + (*readable_move, vec![], mover_share) } - TheirTurnResult::MakeMove(readable_move, handler, message) => { + TheirTurnResult::MakeMove(readable_move, handler, message, mover_share) => { // Mover puzzle turns the given solution into coin conditions // that pay the game's amount to us. It checks whether the // originally curried mover puzzle hash is the sha256tree of the @@ -1570,7 +1572,7 @@ impl RefereeMaker { ); debug!("message {message:?}"); - (*readable_move, message.clone()) + (*readable_move, message.clone(), mover_share) } // Slash can't be used when we're off chain. TheirTurnResult::Slash(_evidence, _signature) => { @@ -1593,6 +1595,7 @@ impl RefereeMaker { puzzle_hash_for_unroll, readable_move, message: message.clone(), + mover_share: mover_share.clone(), original: result, }) } @@ -1815,6 +1818,7 @@ impl RefereeMaker { &self.fixed.amount, ), readable: ReadableMove::from_nodeptr(allocator, nil)?, + mover_share: self.spend_this_coin().game_move.basic.mover_share.clone(), }); } @@ -1893,7 +1897,7 @@ impl RefereeMaker { curry_referee_puzzle_hash(allocator, &self.fixed.referee_coin_puzzle_hash, &args)?; debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); - let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr| { + let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr, mover_share: Amount| { if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { Ok(result) } else { @@ -1904,6 +1908,7 @@ impl RefereeMaker { &self.fixed.amount, ), readable: ReadableMove::from_nodeptr(allocator, readable_move)?, + mover_share: args.game_move.basic.mover_share.clone(), }) } }; @@ -1923,11 +1928,11 @@ impl RefereeMaker { &(slash_spend.signature + *sig), ); } - TheirTurnResult::FinalMove(readable_move) => { - check_and_report_slash(allocator, readable_move) + TheirTurnResult::FinalMove(readable_move, mover_share) => { + check_and_report_slash(allocator, readable_move, mover_share) } - TheirTurnResult::MakeMove(readable_move, _, _) => { - check_and_report_slash(allocator, readable_move) + TheirTurnResult::MakeMove(readable_move, _, _, _) => { + check_and_report_slash(allocator, readable_move, mover_share) } }; self.state = state; diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index c4aafe67..da994a5e 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -91,7 +91,7 @@ fn test_game_handler_their_make_move() { }, ) .expect("should run"); - if let TheirTurnResult::MakeMove(state, game_handler, msg) = result { + if let TheirTurnResult::MakeMove(state, game_handler, msg, _mover_share) = result { let game_handler_node = game_handler.to_nodeptr(&mut allocator).expect("should cvt"); assert_eq!(msg, b"test"); assert_eq!(disassemble(allocator.allocator(), state, None), "999"); diff --git a/src/tests/peer/potato_handler.rs b/src/tests/peer/potato_handler.rs index 7890dc51..0fc984ed 100644 --- a/src/tests/peer/potato_handler.rs +++ b/src/tests/peer/potato_handler.rs @@ -37,7 +37,7 @@ struct Pipe { registered_coins: HashMap, // Opponent moves - opponent_moves: Vec<(GameID, ReadableMove)>, + opponent_moves: Vec<(GameID, ReadableMove, Amount)>, opponent_raw_messages: Vec<(GameID, Vec)>, opponent_messages: Vec<(GameID, ReadableMove)>, our_moves: Vec<(GameID, Vec)>, @@ -137,8 +137,9 @@ impl ToLocalUI for Pipe { _allocator: &mut AllocEncoder, id: &GameID, readable: ReadableMove, + mover_share: Amount, ) -> Result<(), Error> { - self.opponent_moves.push((id.clone(), readable)); + self.opponent_moves.push((id.clone(), readable, mover_share)); Ok(()) } fn raw_game_message(&mut self, id: &GameID, readable: &[u8]) -> Result<(), Error> { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index e063dd94..6c68df5e 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -187,6 +187,7 @@ impl ToLocalUI for SimulatedPeer { _allocator: &mut AllocEncoder, _id: &GameID, _readable: ReadableMove, + _my_share: Amount, ) -> Result<(), Error> { // We can record stuff here and check that we got what was expected, but there's // no effect on the game mechanics. @@ -654,7 +655,7 @@ struct LocalTestUIReceiver { opponent_moved: bool, go_on_chain: bool, got_error: bool, - opponent_moves: Vec<(GameID, ReadableMove)>, + opponent_moves: Vec<(GameID, ReadableMove, Amount)>, } impl ToLocalUI for LocalTestUIReceiver { @@ -663,9 +664,10 @@ impl ToLocalUI for LocalTestUIReceiver { _allocator: &mut AllocEncoder, id: &GameID, readable: ReadableMove, + my_share: Amount, ) -> Result<(), Error> { self.opponent_moved = true; - self.opponent_moves.push((id.clone(), readable.clone())); + self.opponent_moves.push((id.clone(), readable, my_share)); Ok(()) } @@ -992,7 +994,8 @@ fn run_calpoker_container_with_action_list_with_success_predicate( })?; } GameAction::Accept(who) | GameAction::Timeout(who) => { - ending = true; + debug!("{who} doing ACCEPT"); + can_move = true; cradles[*who] .accept(allocator, &mut rng, &game_ids[0])?; } @@ -1085,7 +1088,7 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { for (pn, lui) in outcome.local_uis.iter().enumerate() { for the_move in lui.opponent_moves.iter() { let the_move_to_node = the_move.1.to_nodeptr(&mut allocator).expect("should work"); - debug!("player {pn} opponent move {}", disassemble(allocator.allocator(), the_move_to_node, None)); + debug!("player {pn} opponent move {the_move:?} {}", disassemble(allocator.allocator(), the_move_to_node, None)); } } let outcome_move = &outcome.local_uis[0].opponent_moves[2]; diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index b4a339b4..70bbd679 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -178,7 +178,7 @@ impl<'a, R: Rng> SimulatorEnvironment<'a, R> { // XXX allow verification of ui result and message. if received { - let (spend, ui_result, message) = self + let (spend, ui_result, message, _mover_share) = self .parties .player(player ^ 1) .ch From 719a19773948e98877f0f6410a8bd59e27eb80e9 Mon Sep 17 00:00:00 2001 From: arty Date: Tue, 17 Dec 2024 12:33:46 -0800 Subject: [PATCH 21/50] Make one move --- clsp/calpoker_include.clsp | 2 +- clsp/calpoker_include_calpoker_factory.hex | 2 +- clsp/calpoker_include_calpoker_factory_hash.hex | 2 +- src/referee.rs | 7 +------ 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/clsp/calpoker_include.clsp b/clsp/calpoker_include.clsp index a6507f58..f135b83f 100644 --- a/clsp/calpoker_include.clsp +++ b/clsp/calpoker_include.clsp @@ -103,7 +103,7 @@ (max-move-size-of-template template) ;; Initial mover share - () + amount ) ) ) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 75dd8045..6358fe12 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 9b90a0f6..4f2659eb 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a0e5154df052fcb3719c469878b56d0e1e19e564e0208f9394e269f48fb5e8c988 \ No newline at end of file +a0949d40e3f384e38f522c52327665a4b52ab16304a5a60365d40fa44234420cfc \ No newline at end of file diff --git a/src/referee.rs b/src/referee.rs index 6acbb521..dd9423c1 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -675,18 +675,13 @@ impl RefereeMaker { nonce, }); - let mover_share = if my_turn { - fixed_info.amount.clone() - initial_move.mover_share.clone() - } else { - initial_move.mover_share.clone() - }; // TODO: Revisit how we create initial_move let ref_puzzle_args = Rc::new(RefereePuzzleArgs::new( &fixed_info, &initial_move, None, &Hash::default(), - Some(&mover_share), + Some(&initial_move.mover_share.clone()), my_turn, )); // If this reflects my turn, then we will spend the next parameter set. From 876ef98c339b545767ee7c9ff259e0510b6be072 Mon Sep 17 00:00:00 2001 From: arty Date: Fri, 20 Dec 2024 13:29:17 -0800 Subject: [PATCH 22/50] suspend --- clsp/calpoker_generate.clinc | 39 ++++-- clsp/calpoker_include.clsp | 4 +- clsp/calpoker_include_calpoker_factory.hex | 2 +- ...calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- ...alpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/calpoker/a.hex | 2 +- clsp/onchain/calpoker/b.hex | 2 +- clsp/onchain/calpoker/c.hex | 2 +- clsp/onchain/calpoker/d.clsp | 2 +- clsp/onchain/calpoker/d.hex | 2 +- clsp/onchain/calpoker/e.clsp | 2 +- clsp/onchain/calpoker/e.hex | 2 +- clsp/onchain/referee.clsp | 15 +-- clsp/onchain/referee.hex | 2 +- src/channel_handler/game_handler.rs | 13 +- src/channel_handler/mod.rs | 55 ++++++--- src/channel_handler/types.rs | 5 +- src/potato_handler.rs | 111 +++++++++++++++-- src/referee.rs | 115 ++++++++++-------- src/tests/game_handler.rs | 3 +- src/tests/peer/potato_handler_sim.rs | 5 +- src/tests/referee.rs | 14 ++- 23 files changed, 266 insertions(+), 137 deletions(-) diff --git a/clsp/calpoker_generate.clinc b/clsp/calpoker_generate.clinc index 92e7c8f3..e5a3c680 100644 --- a/clsp/calpoker_generate.clinc +++ b/clsp/calpoker_generate.clinc @@ -11,6 +11,7 @@ (import std.assert) (import std.append) (import std.relops) +(import std.print) (import std.list_compare) (import handcalc exposing handcalc) (import onchain.calpoker.onehandcalc exposing onehandcalc) @@ -37,7 +38,7 @@ pokerb_hash image 16 - 0 + (/ amount 2) (curry calpoker_alice_driver_b preimage image) 0 ) @@ -52,10 +53,22 @@ (curry calpoker_alice_driver_c PREIMAGE move) PREIMAGE) ) +(defun single-byte (raw-indices) + (if raw-indices + (assign + indices-len (strlen raw-indices) + (substr raw-indices (- indices-len 1) indices-len) + ) + 0x00 + ) +) + (defun bitify (mylist) - (if (not mylist) - 0 - (logior (f mylist) (lsh (bitify (r mylist)) 1)) + (single-byte + (if (not mylist) + 0 + (logior (f mylist) (lsh (bitify (r mylist)) 1)) + ) ) ) @@ -73,7 +86,7 @@ pokerd_hash (list cards new_commit) 1 - 0 + (/ amount 2) (curry calpoker_alice_driver_d salt my_picks) 0 ) @@ -84,13 +97,13 @@ (if (not mylist) 0 (= (f mylist) index) - (logior 1 (* 2 (indices_to_bitfield_inner (r mylist) (+ index 1)))) - (* 2 (indices_to_bitfield_inner mylist (+ index 1))) + (logior 1 (lsh (indices_to_bitfield_inner (r mylist) (+ index 1)) 1)) + (lsh (indices_to_bitfield_inner mylist (+ index 1)) 1) ) ) (defun indices_to_bitfield (mylist) - (indices_to_bitfield_inner mylist 0) + (single-byte (indices_to_bitfield_inner mylist 0)) ) ; We have composed cards as sublists but need them as pairs. @@ -113,7 +126,7 @@ (list MAKE_MOVE (list move (indices_to_bitfield my_picks) (indices_to_bitfield bob_picks) my_hand_value bob_hand_value win_result) - (lambda ((& MY_SALT MY_PICKS split)) (list (concat MY_SALT MY_PICKS) 0 0 0 0 split 0 0) + (lambda ((& MY_SALT MY_PICKS my_picks split)) (list (concat (print "MY_SALT is" MY_SALT) (print "MY_PICKS are" MY_PICKS) (print "my_picks are" (indices_to_bitfield my_picks))) 0 0 0 0 split 0 0) 0 ) ) @@ -137,7 +150,7 @@ pokerc_hash (list ALICE_COMMIT seed) 48 - 0 + (/ amount 2) (curry calpoker_bob_driver_c seed) parse_message ) @@ -192,8 +205,8 @@ pokere pokere_hash (list my_move (list ALICE_CARDS BOB_CARDS) ALICE_COMMIT_2) - 17 - 0 + 18 + (/ amount 2) calpoker_bob_driver_e 0 ) @@ -214,7 +227,7 @@ (alice_hand_value alice_picks) (handcalc (map card_list_to_pair alice_all_cards)) (bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards)) win_result (list_compare alice_hand_value bob_hand_value) - correct_split (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount) + correct_split (print (list "checking correct split" win_result split amount) (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)) (if (!= split correct_split) (list SLASH (indices_to_bitfield bob_picks)) (list MAKE_MOVE diff --git a/clsp/calpoker_include.clsp b/clsp/calpoker_include.clsp index f135b83f..24e8c15d 100644 --- a/clsp/calpoker_include.clsp +++ b/clsp/calpoker_include.clsp @@ -66,7 +66,7 @@ (max-move-size-of-template template) ;; Initial mover share - amount + (/ amount 2) ) ) @@ -103,7 +103,7 @@ (max-move-size-of-template template) ;; Initial mover share - amount + (/ amount 2) ) ) ) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 6358fe12..6da29ba5 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82028affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8202faffff04ff02ffff04ff17ff80808080ffff04ff09ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff82022affff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff8202aaffff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff8202aaffff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82036affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82010affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82024affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82024affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ff04ff09ff1580ffffff02ff82034affff04ff02ffff04ff05ffff01ff8080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82034affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82034affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ffff02ff8203caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ffffffff02ff82032affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ca80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff82022affff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffffff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82026affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff02ff82021affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ffff04ff13ffff04ff1bffff04ff17ff80808080ff04ff1bffff04ff13ffff04ff17ff80808080ffffffffff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff808080808080808200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff8200bdff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820206ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bff808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82025effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82025effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82025effff04ff02ffff04ffff018c6d795f7069636b7320617265ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ff82025effff04ff02ffff04ffff04ffff0196636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff8203aeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffffff02ff820306ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82030effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82038effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82028effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82038effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82024effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82024effff04ff02ffff04ff07ff80808080ff80808080ffff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffffffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0180ffff04ffff02ff82022effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82022effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ff05ff02ffff03ff0bffff01ff02ffff01ff02ff82026effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8202eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82021effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffffffffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82021effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82029effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82039effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 4f2659eb..fc02293c 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a0949d40e3f384e38f522c52327665a4b52ab16304a5a60365d40fa44234420cfc \ No newline at end of file +a02a2b7cc94e0d6ec5bed44d87063235edcd2423a6ca9d21586f41ad775c56b7bf \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index 5e2acffd..ba2005c1 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ffff04ffff01ff80ffffffffffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff04ff0bffff04ffff0110ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff820326ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8202faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff0bff8080808080ffff01ff01808080ff80808080ff80808080ff04ffff0eff09ff1580ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff2dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0111ffff04ff80ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8202faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff82026affff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa0a10991f4ebf2e010d2cbc476086e77da920afbde495bc9003bf2b1726103ebdaff80ff64808080ffff04ff09ff1580ff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff12ffff0102ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff80808080808080ff0180ffff01ff02ffff01ff12ffff0102ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff808080808080ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff820326ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203aaffff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ff8203eaffff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82036a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82011effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82029affff04ff02ffff04ff03ffff04ffff02ff82027affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82011a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ffffff8200bbffff02ff82025affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82039a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82027affff04ff02ffff04ffff02ff8203baffff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff80808080808200bbffffff02ff82035affff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ff02ff8203daffff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8202da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ffff04ffff02ff820256ffff04ff02ffff04ffff02ff82023affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ffffffff02ff82033affff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff82033affff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8202baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff8203baffff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ffffff02ff82037affff04ff02ffff04ff03ffff04ffff02ff8203aaffff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8202baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ffff02ff8203faffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff8203faffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffffffffffff19ffff17ff09ffff010480ff0d80ffff02ff820386ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff820346ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffff02ff8203c6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffffffff04ffff02ff820266ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820246ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff820366ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820266ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820266ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820106ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820116ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820116ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bff808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82035effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82035effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82035effff04ff02ffff04ffff018c6d795f7069636b7320617265ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82035effff04ff02ffff04ffff04ffff0196636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index 2e17f95f..a6a8082e 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a0b887641f3a15295401d78ce837176e41ec13c04b913d9d433848baa654ecc969 \ No newline at end of file +a000cd187e995ba40b1a55dd7649fb658b48ed853c8341f8d240b7379c1d6db01c \ No newline at end of file diff --git a/clsp/onchain/calpoker/a.hex b/clsp/onchain/calpoker/a.hex index 9b3d5835..7593c4e9 100644 --- a/clsp/onchain/calpoker/a.hex +++ b/clsp/onchain/calpoker/a.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a0272f2d321f91ad6424c3f75eaff051072b8ceeda81c022b5290f3e1389404871ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/b.hex b/clsp/onchain/calpoker/b.hex index b1a341ab..59cd16d2 100644 --- a/clsp/onchain/calpoker/b.hex +++ b/clsp/onchain/calpoker/b.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a0280d74a37b3080285d3f7c2f991e46d993a25b089f1edd31aeb4983f4b7ecbf0ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.hex b/clsp/onchain/calpoker/c.hex index b3b1f480..06e0a2f9 100644 --- a/clsp/onchain/calpoker/c.hex +++ b/clsp/onchain/calpoker/c.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a0f41bdf0ebd76b23cb70bffcec38f6f6cd02c73ca4ad4a9405f9873136f44ed41ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/d.clsp b/clsp/onchain/calpoker/d.clsp index 2d2c440a..81c70341 100644 --- a/clsp/onchain/calpoker/d.clsp +++ b/clsp/onchain/calpoker/d.clsp @@ -19,7 +19,7 @@ (print (list "poker d" bob_picks) (= (strlen bob_picks) 1)) (print "check popcount" (= (popcount bob_picks) 4)) (print (list "check validation hash" new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit))))) - (print (list "check new max move size" max_move_size) (= max_move_size 17)) + (print (list "check new max move size" max_move_size) (= max_move_size 18)) 0 (x) ) diff --git a/clsp/onchain/calpoker/d.hex b/clsp/onchain/calpoker/d.hex index 9613b822..a25b3e48 100644 --- a/clsp/onchain/calpoker/d.hex +++ b/clsp/onchain/calpoker/d.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a01dae559abc6412b9c050c7dd6251e103710214603f2c6d7d4d5a6220e3c39433ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/e.clsp b/clsp/onchain/calpoker/e.clsp index 9fa4c99f..7ea954c2 100644 --- a/clsp/onchain/calpoker/e.clsp +++ b/clsp/onchain/calpoker/e.clsp @@ -19,7 +19,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (bob_picks (alice_cards bob_cards) alice_commit) me mover_puzzle solution bob_card_selections) (if_any_fail - (print "poker e" (= (strlen move) 18)) + (print (list "poker e" move) (= (strlen move) 18)) (assign alice_salted_picks (substr move 0 17) alice_picks (substr move 16 17) diff --git a/clsp/onchain/calpoker/e.hex b/clsp/onchain/calpoker/e.hex index d99a7355..34204127 100644 --- a/clsp/onchain/calpoker/e.hex +++ b/clsp/onchain/calpoker/e.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff0187706f6b65722065ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index e9682088..f61c23a9 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -8,6 +8,7 @@ (import std.condition_codes) (import std.match) (import std.li) +(import std.print) (import onchain.game_codes) ; @@ -98,18 +99,18 @@ conditions (a mover_puzzle solution) (assert VALIDATION_INFO_HASH - (<= (strlen new_move) MAX_MOVE_SIZE) - (<= new_mover_share AMOUNT) - (>= new_mover_share 0) - (logior (not new_validation_info_hash) (= 32 (strlen new_validation_info_hash))) - (= MOVER_PUZZLE_HASH (shatree mover_puzzle)) + (print (list "strlen new_move" new_move MAX_MOVE_SIZE) (<= (strlen new_move) MAX_MOVE_SIZE)) + (print (list "v new_mover_share" new_mover_share AMOUNT) (<= new_mover_share AMOUNT)) + (print (list "check new mover share" new_mover_share) (>= new_mover_share 0)) + (print "logior check" (logior (not new_validation_info_hash) (= 32 (strlen new_validation_info_hash)))) + (print "check mover puzzle hash" (= MOVER_PUZZLE_HASH (shatree mover_puzzle))) ; Check that the child output is made - (match + (print "match check" (match (lambda ((& new_puzzle_hash AMOUNT) (condname arg1 arg2)) (logand (= condname CREATE_COIN) (= arg1 new_puzzle_hash) (= arg2 AMOUNT)) ) conditions - ) + )) (li (list REMARK new_move new_validation_info_hash new_mover_share new_max_move_size) (list ASSERT_BEFORE_HEIGHT_RELATIVE TIMEOUT) &rest conditions) ) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index 1f153f85..9a8325db 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff2cffff04ff02ffff04ffff05ff0580ffff04ffff02ff18ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ffff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff2cffff04ff02ffff04ff05ffff04ffff02ff18ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff3cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff14ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0dff2580ff8217f18080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ffff01ff02ffff01ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018f7374726c656e206e65775f6d6f7665ffff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019176206e65775f6d6f7665725f7368617265ffff04ff8200b5ffff04ff820171ffff0180808080ffff04ffff20ffff15ff8200b5ff8201718080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0195636865636b206e6577206d6f766572207368617265ffff04ff8200b5ffff01808080ffff04ffff20ffff15ffff0180ff8200b58080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018c6c6f67696f7220636865636bffff04ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff0197636865636b206d6f7665722070757a7a6c652068617368ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018b6d6174636820636865636bffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 21b4c5f6..cd7d7f7c 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -57,6 +57,7 @@ impl ToClvm for GameHandler { } } +#[derive(Debug)] pub struct MyTurnInputs<'a> { pub readable_new_move: ReadableMove, pub amount: Amount, @@ -167,7 +168,7 @@ fn run_code( pub enum TheirTurnResult { FinalMove(NodePtr, Amount), MakeMove(NodePtr, GameHandler, Vec, Amount), - Slash(Evidence, Box), + Slash(Evidence), } impl GameHandler { @@ -222,6 +223,7 @@ impl GameHandler { allocator: &mut AllocEncoder, inputs: &MyTurnInputs, ) -> Result { + debug!("CALL MY TURN DRIVER WITH {inputs:?}"); let driver_args = ( inputs.readable_new_move.clone(), ( @@ -356,6 +358,7 @@ impl GameHandler { .into_gen()?; let driver_node = self.get_their_turn_driver(allocator)?; + debug!("call their turn driver {self:?} args {}", disassemble(allocator.allocator(), driver_args, None)); let run_result = run_code( allocator, driver_node, @@ -410,17 +413,13 @@ impl GameHandler { )) } } else if move_type == 2 { - if pl.len() != 3 { + if pl.len() != 2 { return Err(Error::StrErr(format!( "bad length for slash {}", disassemble(allocator.allocator(), run_result, None) ))); } - let sig_bytes = allocator.allocator().atom(pl[2]).to_vec(); - Ok(TheirTurnResult::Slash( - Evidence::from_nodeptr(pl[1]), - Box::new(Aggsig::from_slice(&sig_bytes)?), - )) + Ok(TheirTurnResult::Slash(Evidence::from_nodeptr(pl[1]))) } else { Err(Error::StrErr("unknown move result type".to_string())) } diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index b3471bf3..be58a581 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -35,7 +35,7 @@ use crate::common::types::{ PuzzleHash, Sha256tree, Spend, SpendRewardResult, Timeout, ToQuotedProgram, }; use crate::potato_handler::GameAction; -use crate::referee::{GameMoveDetails, RefereeMaker, RefereeOnChainTransaction}; +use crate::referee::{GameMoveDetails, RefereeMaker, RefereeOnChainTransaction, TheirTurnCoinSpentResult, TheirTurnMoveResult}; /// A channel handler runs the game by facilitating the phases of game startup /// and passing on move information as well as termination to other layers. @@ -882,16 +882,23 @@ impl ChannelHandler { // the unroll puzzle hash that was given to us. self.cached_last_action = None; - Ok(( - ChannelCoinSpendInfo { - aggsig: spend.signature, - solution: spend.solution, - conditions: spend.conditions, - }, - their_move_result.readable_move, - their_move_result.message, - their_move_result.mover_share, - )) + match their_move_result { + TheirTurnMoveResult::Move { readable_move, message, mover_share, .. } => { + Ok(( + ChannelCoinSpendInfo { + aggsig: spend.signature, + solution: spend.solution, + conditions: spend.conditions, + }, + readable_move, + message, + mover_share, + )) + } + TheirTurnMoveResult::Slash { evidence } => { + todo!(); + } + } } pub fn received_message( @@ -1438,6 +1445,7 @@ impl ChannelHandler { OnChainGameState { game_id: live_game.game_id.clone(), puzzle_hash: game_coin.clone(), + next_puzzle_hash: None, our_turn: live_game.is_my_turn(), }, ); @@ -1587,14 +1595,22 @@ impl ChannelHandler { return Ok(CoinSpentInformation::OurReward(ph.clone(), amt.clone())); } - Ok(CoinSpentInformation::TheirSpend( - self.live_games[live_game_idx].their_turn_coin_spent( - env.allocator, - coin_string, - conditions, - self.current_state_number, - )?, - )) + debug!("{} asking referee", self.is_initial_potato()); + let their_spend_result = self.live_games[live_game_idx].their_turn_coin_spent( + env.allocator, + coin_string, + conditions, + self.current_state_number, + )?; + debug!("their_spend_result {their_spend_result:?}"); + if let TheirTurnCoinSpentResult::Repeat(ph, amt) = &their_spend_result { + if !self.live_games[live_game_idx].is_my_turn() { + return Ok(CoinSpentInformation::Expected(ph.clone(), amt.clone())); + } + } + + assert!(self.live_games[live_game_idx].is_my_turn()); + Ok(CoinSpentInformation::TheirSpend(their_spend_result)) } pub fn get_redo_action( @@ -1765,6 +1781,7 @@ impl ChannelHandler { let tx = self.live_games[game_idx].get_transaction_for_timeout(env.allocator, coin)?; // Game is done one way or another. self.live_games.remove(game_idx); + debug!("{} has {} games left", self.is_initial_potato(), self.live_games.len()); Ok(tx) } diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 4c96a0b0..c9a05040 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -965,6 +965,7 @@ pub struct UnrollTarget { pub struct OnChainGameState { pub game_id: GameID, pub puzzle_hash: PuzzleHash, + pub next_puzzle_hash: Option, pub our_turn: bool, } @@ -1034,7 +1035,9 @@ impl LiveGame { let their_move_result = self.referee_maker .their_turn_move_off_chain(allocator, game_move, state_number)?; - self.last_referee_puzzle_hash = their_move_result.puzzle_hash_for_unroll.clone(); + if let TheirTurnMoveResult::Move { puzzle_hash_for_unroll, .. } = &their_move_result { + self.last_referee_puzzle_hash = puzzle_hash_for_unroll.clone(); + } Ok(their_move_result) } diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 40899658..9a9b55a9 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -2,7 +2,7 @@ use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::mem::swap; use std::rc::Rc; -use clvm_traits::ToClvm; +use clvm_traits::{ClvmEncoder, ToClvm}; use clvmr::serde::node_from_bytes; use clvmr::{run_program, Allocator, NodePtr}; @@ -433,6 +433,17 @@ pub enum GameAction { Shutdown(NodePtr), } +impl GameAction { + pub fn get_game_id(&self) -> Option<&GameID> { + match self { + GameAction::Move(id, _, _) => Some(id), + GameAction::RedoMove(id, _, _, _) => Some(id), + GameAction::Accept(id) => Some(id), + GameAction::Shutdown(_) => None, + } + } +} + pub struct PotatoHandlerInit { pub have_potato: bool, pub private_keys: ChannelHandlerPrivateKeys, @@ -1854,22 +1865,32 @@ impl PotatoHandler { CoinString::from_parts(¤t_coin.to_coin_id(), &new_ph, &transaction.amount); self.my_game_spends.insert(new_ph.clone()); + debug!("{initial_potato} change game map {new_ph:?}"); game_map.insert( - new_coin.clone(), + current_coin.clone(), OnChainGameState { - puzzle_hash: new_ph, + puzzle_hash: old_ph, our_turn: false, + next_puzzle_hash: Some(new_ph), ..old_definition }, ); let (_env, system_interface) = penv.env(); + // The next coin. system_interface.register_coin( &new_coin, &self.channel_timeout, Some("game coin for my turn"), )?; + // The coin we're coming from. + system_interface.register_coin( + current_coin, + &self.channel_timeout, + Some("their turn coin spent"), + )?; + system_interface.spend_transaction_and_add_fee(&SpendBundle { name: Some("on chain move".to_string()), spends: vec![CoinSpend { @@ -1950,13 +1971,24 @@ impl PotatoHandler { "{} on chain: accept game coin {current_coin:?}", player_ch.is_initial_potato() ); - let (env, _system_interface) = penv.env(); + + let (env, system_interface) = penv.env(); let result_transaction = player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; let initial_potato = player_ch.is_initial_potato(); self.have_potato = PotatoState::Present; - if let Some(_transaction) = result_transaction { - todo!(); + if let Some(transaction) = result_transaction { + debug!("accept with transaction {transaction:?}"); + if let Some((_, ph, _)) = current_coin.to_parts() { + assert_eq!(ph, transaction.bundle.puzzle.sha256tree(env.allocator)); + } + system_interface.spend_transaction_and_add_fee(&SpendBundle { + name: Some("accept".to_string()), + spends: vec![CoinSpend { + coin: current_coin, + bundle: transaction.bundle.clone() + }], + })?; } else { debug!("{initial_potato} Accepted game when our share was zero"); } @@ -1986,6 +2018,15 @@ impl PotatoHandler { self.have_potato_move(penv)?; } else if let HandshakeState::OnChain(_game_map) = &mut self.handshake_state { + let player_ch = self.channel_handler()?; + if let Some(game_id) = action.get_game_id() { + if !matches!(action, GameAction::RedoMove(_, _, _, _)) && !matches!(player_ch.game_is_my_turn(&game_id), Some(true)) { + debug!("{} holding action {action:?} due to not our turn", player_ch.is_initial_potato()); + self.game_action_queue.push_back(action); + return Ok(()); + } + } + return self.do_on_chain_action(penv, action); } else { return Err(Error::StrErr( @@ -2173,6 +2214,9 @@ impl PotatoHandler { G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { if let Some(action) = self.game_action_queue.pop_front() { + let player_ch = self.channel_handler()?; + let initial_potato = player_ch.is_initial_potato(); + debug!("{initial_potato} try to do next action {action:?}"); self.do_game_action(penv, action)?; } @@ -2215,14 +2259,19 @@ impl PotatoHandler { let player_ch = self.channel_handler_mut()?; let (env, system_interface) = penv.env(); let conditions = CoinCondition::from_puzzle_and_solution(env.allocator, puzzle, solution)?; + let preceding_turn_polarity = player_ch.game_is_my_turn(&old_definition.game_id); let their_turn_result = player_ch.game_coin_spent(env, &old_definition.game_id, coin_id, &conditions)?; debug!( "{initial_potato} game coin spent result from channel handler {their_turn_result:?}" ); + let turn_polarity_for_game = player_ch.game_is_my_turn(&old_definition.game_id); + // We did a their turn, so it should be our turn. + match their_turn_result { CoinSpentInformation::Expected(ph, amt) => { - debug!("{initial_potato} got an expected spend {ph:?} {amt:?}"); + let my_turn = matches!(turn_polarity_for_game, Some(true)); + debug!("{initial_potato} my turn {my_turn} got an expected spend {ph:?} {amt:?}"); let new_coin_id = CoinString::from_parts( &coin_id.to_coin_id(), &ph, @@ -2230,25 +2279,60 @@ impl PotatoHandler { ); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { // An expected their spend arrived. We can do our next action. + debug!("{initial_potato} change game map {ph:?}"); game_map.insert(new_coin_id.clone(), OnChainGameState { puzzle_hash: ph, - our_turn: false, + our_turn: my_turn, .. old_definition }); + if my_turn { + unblock_queue = true; + } } let (_, system_interface) = penv.env(); system_interface.register_coin( &new_coin_id, &self.channel_timeout, - Some("coin gives their turn") + Some("coin gives their turn (e)") )?; } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Timedout { /*my_reward_coin_string*/ .. }) => { todo!(); } + CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Repeat(ph, amt)) => { + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + let new_coin_id = CoinString::from_parts( + &coin_id.to_coin_id(), + &ph, + &amt + ); + + // An expected their spend arrived. We can do our next action. + debug!("{initial_potato} change game map {ph:?}"); + let nil = env.allocator.encode_atom(&[]).into_gen()?; + let rm = ReadableMove::from_nodeptr(env.allocator, nil)?; + system_interface.opponent_moved( + env.allocator, + &old_definition.game_id, + rm, + Amount::default(), + )?; + game_map.insert(new_coin_id.clone(), OnChainGameState { + puzzle_hash: ph, + .. old_definition + }); + system_interface.register_coin( + &new_coin_id, + &self.channel_timeout, + Some("coin gives their turn (2)") + )?; + } + } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable, mover_share, .. }) => { - debug!("{initial_potato} got a their spend {new_coin_string:?} from ph {:?}", old_definition.puzzle_hash); + debug!("{initial_potato} got a their spend creating {new_coin_string:?} from ph {:?}", old_definition.puzzle_hash); + // assert_ne!(preceding_turn_polarity, turn_polarity_for_game); + assert_eq!(Some(true), turn_polarity_for_game); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { let (puzzle_hash, amt) = if let Some((orig_coin_id, ph, amt)) = new_coin_string.to_parts() { @@ -2260,6 +2344,7 @@ impl PotatoHandler { let game_id = old_definition.game_id.clone(); debug!("{initial_potato} got their coin spend with new puzzle hash {puzzle_hash:?} {amt:?}"); + debug!("{initial_potato} change game map {puzzle_hash:?}"); game_map.insert(new_coin_string.clone(), OnChainGameState { puzzle_hash, our_turn: true, @@ -2297,6 +2382,7 @@ impl PotatoHandler { &ph, &amt ); + debug!("{initial_potato} change game map {ph:?}"); game_map.insert(new_coin_id.clone(), OnChainGameState { puzzle_hash: ph, our_turn: false, @@ -2409,9 +2495,8 @@ impl, - pub mover_share: Amount, - pub original: TheirTurnResult, +pub enum TheirTurnMoveResult { + Move { + puzzle_hash_for_unroll: PuzzleHash, + readable_move: NodePtr, + message: Vec, + mover_share: Amount, + original: TheirTurnResult, + }, + Slash { + evidence: Evidence + } } #[derive(Debug)] @@ -87,6 +92,7 @@ pub struct LiveGameReplay { #[derive(Debug)] pub enum TheirTurnCoinSpentResult { + Repeat(PuzzleHash, Amount), Timedout { my_reward_coin_string: Option, }, @@ -171,6 +177,9 @@ impl RefereePuzzleArgs { "VALIDATION_INFO_HASH {my_turn} {}", hex::encode(validation_info_hash.bytes()) ); + let mover_share = mover_share + .cloned() + .unwrap_or_else(|| initial_move.mover_share.clone()); RefereePuzzleArgs { mover_puzzle_hash: if my_turn { fixed_info.my_identity.puzzle_hash.clone() @@ -187,9 +196,7 @@ impl RefereePuzzleArgs { nonce: fixed_info.nonce, game_move: GameMoveDetails { basic: GameMoveStateInfo { - mover_share: mover_share - .cloned() - .unwrap_or_else(|| initial_move.mover_share.clone()), + mover_share, ..initial_move.clone() }, validation_info_hash: validation_info_hash.clone(), @@ -877,6 +884,7 @@ impl RefereeMaker { state_number: usize, ) -> Result<(), Error> { debug!("{state_number} accept move {details:?}"); + assert_ne!(current_puzzle_args.game_move.basic.mover_share, Amount::default()); assert_ne!( current_puzzle_args.mover_puzzle_hash, new_puzzle_args.mover_puzzle_hash @@ -988,6 +996,7 @@ impl RefereeMaker { debug!("my turn state {:?}", self.state); debug!("entropy {state_number} {new_entropy:?}"); + assert_ne!(args.game_move.basic.mover_share, Amount::default()); let result = Rc::new(game_handler.call_my_turn_driver( allocator, &MyTurnInputs { @@ -1195,6 +1204,9 @@ impl RefereeMaker { coin_string: &CoinString, ) -> Result, Error> { let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; + if let Some((_, ph, _)) = coin_string.to_parts() { + assert_eq!(spend_puzzle.sha256tree(allocator), ph); + } self.get_transaction( allocator, coin_string, @@ -1282,10 +1294,6 @@ impl RefereeMaker { let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; let spend_puzzle_nodeptr = spend_puzzle.to_clvm(allocator).into_gen()?; - debug!( - "spend puzzle {}", - disassemble(allocator.allocator(), spend_puzzle_nodeptr, None) - ); assert_eq!( spend_puzzle.sha256tree(allocator), current_referee_puzzle_hash @@ -1570,8 +1578,8 @@ impl RefereeMaker { (*readable_move, message.clone(), mover_share) } // Slash can't be used when we're off chain. - TheirTurnResult::Slash(_evidence, _signature) => { - return Err(Error::StrErr("slash when off chain".to_string())); + TheirTurnResult::Slash(ev) => { + return Ok(TheirTurnMoveResult::Slash { evidence: ev.clone() }); } }; @@ -1586,7 +1594,7 @@ impl RefereeMaker { ); // Coin calculated off the new new state. - Ok(TheirTurnMoveResult { + Ok(TheirTurnMoveResult::Move { puzzle_hash_for_unroll, readable_move, message: message.clone(), @@ -1803,20 +1811,12 @@ impl RefereeMaker { }; if repeat { - let nil = allocator.allocator().null(); - debug!("rems in spend {conditions:?}"); - debug!("current state {:?}", self.state); - return Ok(TheirTurnCoinSpentResult::Moved { - new_coin_string: CoinString::from_parts( - &coin_string.to_coin_id(), - &after_puzzle_hash, - &self.fixed.amount, - ), - readable: ReadableMove::from_nodeptr(allocator, nil)?, - mover_share: self.spend_this_coin().game_move.basic.mover_share.clone(), - }); + return Ok(TheirTurnCoinSpentResult::Repeat(after_puzzle_hash, self.fixed.amount.clone())); } + debug!("repeat {repeat}"); + assert!(self.processing_my_turn()); + // Read parameters off conditions let rem_condition = if let Some(CoinCondition::Rem(rem_condition)) = conditions .iter() @@ -1828,8 +1828,6 @@ impl RefereeMaker { Vec::default() }; - let mover_share = self.get_our_current_share(); - // Check properties of conditions if rem_condition.is_empty() { // Timeout case @@ -1841,7 +1839,7 @@ impl RefereeMaker { let my_reward_coin_string = CoinString::from_parts( &coin_string.to_coin_id(), &self.fixed.my_identity.puzzle_hash, - &mover_share, + &self.get_our_current_share(), ); return Ok(TheirTurnCoinSpentResult::Timedout { @@ -1877,8 +1875,8 @@ impl RefereeMaker { validation_info_hash, }; - let state = self.state.clone(); let result = self.their_turn_move_off_chain(allocator, &details, state_number)?; + assert!(self.is_my_turn() || matches!(result, TheirTurnMoveResult::Slash { .. })); let args = self.spend_this_coin(); @@ -1894,8 +1892,10 @@ impl RefereeMaker { let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr, mover_share: Amount| { if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { + assert!(self.is_my_turn()); Ok(result) } else { + assert!(self.is_my_turn()); Ok(TheirTurnCoinSpentResult::Moved { new_coin_string: CoinString::from_parts( &coin_string.to_coin_id(), @@ -1909,28 +1909,37 @@ impl RefereeMaker { }; debug!("referee move details {details:?}"); - let final_result = match result.original { - TheirTurnResult::Slash(evidence, sig) => { - let slash_spend = self.make_slash_spend(allocator)?; - let full_slash_solution = self.make_full_slash_solution(allocator)?; - return self.make_slash_for_their_turn( - allocator, - coin_string, - &new_puzzle, - &new_puzzle_hash, - full_slash_solution, - evidence, - &(slash_spend.signature + *sig), - ); - } - TheirTurnResult::FinalMove(readable_move, mover_share) => { - check_and_report_slash(allocator, readable_move, mover_share) + debug!("result {result:?}"); + match &result { + TheirTurnMoveResult::Move { original, .. } => { + let final_result = match original { + TheirTurnResult::Slash(evidence) => { + let slash_spend = self.make_slash_spend(allocator)?; + let full_slash_solution = self.make_full_slash_solution(allocator)?; + return self.make_slash_for_their_turn( + allocator, + coin_string, + &new_puzzle, + &new_puzzle_hash, + full_slash_solution, + evidence.clone(), + &slash_spend.signature, + ); + } + TheirTurnResult::FinalMove(readable_move, mover_share) => { + assert!(self.is_my_turn()); + check_and_report_slash(allocator, *readable_move, mover_share.clone()) + } + TheirTurnResult::MakeMove(readable_move, _, _, mover_share) => { + assert!(self.is_my_turn()); + check_and_report_slash(allocator, *readable_move, mover_share.clone()) + } + }; + final_result } - TheirTurnResult::MakeMove(readable_move, _, _, _) => { - check_and_report_slash(allocator, readable_move, mover_share) + _ => { + todo!(); } - }; - self.state = state; - final_result + } } } diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index da994a5e..45eb8985 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -49,9 +49,8 @@ fn test_game_handler_their_move_slash() { }, ) .expect("should run"); - if let TheirTurnResult::Slash(evidence, aggsig) = result { + if let TheirTurnResult::Slash(evidence) = result { // Good, check more - assert_eq!(*aggsig, default_aggsig); assert_eq!(disassemble(allocator.allocator(), evidence.to_nodeptr(), None), "(1337 () () () 0x0000000000000000000000000000000000000000000000000000000000000000 () ())"); } else { unreachable!(); diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 6c68df5e..f201d4a0 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -1000,7 +1000,6 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .accept(allocator, &mut rng, &game_ids[0])?; } GameAction::Shutdown(who, _) => { - ending = true; cradles[*who] .shut_down(allocator, &mut rng)?; } @@ -1065,10 +1064,10 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { let mut moves = test_moves_1(&mut allocator).to_vec(); let nil = allocator.encode_atom(&[]).into_gen().expect("should work"); - moves.push(GameAction::Accept(0)); moves.push(GameAction::Accept(1)); - moves.push(GameAction::Shutdown(0, nil)); + moves.push(GameAction::Accept(0)); moves.push(GameAction::Shutdown(1, nil)); + moves.push(GameAction::Shutdown(0, nil)); if let GameAction::Move(player, readable, _) = moves[3].clone() { moves.insert(3, GameAction::FakeMove(player, readable, vec![0; 500])); } else { diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 1287c3a3..321a0bfb 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -15,7 +15,7 @@ use crate::common::types::{ Aggsig, AllocEncoder, Amount, Error, GameID, PrivateKey, Program, Puzzle, PuzzleHash, Sha256tree, Timeout, }; -use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker}; +use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker, TheirTurnMoveResult}; pub struct DebugGamePrograms { pub my_validation_program: NodePtr, @@ -264,9 +264,13 @@ fn test_referee_smoke() { .my_referee .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0) .expect("should run"); - assert_eq!(their_move_result.message, b"message data"); - let readable_prog = - Program::from_nodeptr(&mut allocator, their_move_result.readable_move).expect("should cvt"); - assert_eq!(format!("{:?}", readable_prog), "Program(ff8080)"); + if let TheirTurnMoveResult::Move { message, readable_move, .. } = &their_move_result { + assert_eq!(message, b"message data"); + let readable_prog = + Program::from_nodeptr(&mut allocator, *readable_move).expect("should cvt"); + assert_eq!(format!("{:?}", readable_prog), "Program(ff8080)"); + } else { + assert!(false); + } assert!(!reftest.my_referee.processing_my_turn()); } From 6f34a682e255355a800997b0365ff612e8ccc2e0 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 22 Dec 2024 02:01:22 -0800 Subject: [PATCH 23/50] Take other branch --- clsp/calpoker_generate.clinc | 11 +- clsp/calpoker_include_calpoker_factory.hex | 2 +- ...calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- ...alpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/referee.clsp | 2 +- clsp/onchain/referee.hex | 2 +- src/channel_handler/game_handler.rs | 11 +- src/channel_handler/mod.rs | 124 ++++++---- src/channel_handler/types.rs | 6 +- src/common/types.rs | 2 +- src/peer_container.rs | 56 ++++- src/potato_handler.rs | 226 +++++++++--------- src/referee.rs | 188 ++++++++------- src/tests/calpoker.rs | 4 +- src/tests/game_handler.rs | 6 +- src/tests/peer/potato_handler_sim.rs | 75 +++--- src/tests/referee.rs | 28 ++- src/tests/simenv.rs | 27 ++- 19 files changed, 432 insertions(+), 344 deletions(-) diff --git a/clsp/calpoker_generate.clinc b/clsp/calpoker_generate.clinc index e5a3c680..b6628b7b 100644 --- a/clsp/calpoker_generate.clinc +++ b/clsp/calpoker_generate.clinc @@ -126,7 +126,7 @@ (list MAKE_MOVE (list move (indices_to_bitfield my_picks) (indices_to_bitfield bob_picks) my_hand_value bob_hand_value win_result) - (lambda ((& MY_SALT MY_PICKS my_picks split)) (list (concat (print "MY_SALT is" MY_SALT) (print "MY_PICKS are" MY_PICKS) (print "my_picks are" (indices_to_bitfield my_picks))) 0 0 0 0 split 0 0) + (lambda ((& MY_SALT MY_PICKS my_picks split amount)) (list (concat (print "MY_SALT is" MY_SALT) (print "MY_PICKS are" MY_PICKS) (print "my_selects are" (single-byte (indices_to_bitfield my_picks)))) 0 0 0 0 split 0 0) 0 ) ) @@ -219,19 +219,20 @@ (defun calpoker_bob_driver_e (amount (@ state (bob_selects (alice_cards bob_cards) alice_commit_2)) move validation_program_hash max_move_size split) (assign - alice_selects (substr move 16 (strlen move)) - (alice_cards_alice alice_cards_bob) (split_cards alice_selects alice_cards) + alice_my_picks (substr move 16 17) + alice_selects (substr move 17 (strlen move)) + (alice_cards_alice alice_cards_bob) (split_cards alice_my_picks alice_cards) (bob_cards_bob bob_cards_alice) (split_cards bob_selects bob_cards) alice_all_cards (map make_card (append alice_cards_alice bob_cards_alice)) bob_all_cards (map make_card (append bob_cards_bob alice_cards_bob)) (alice_hand_value alice_picks) (handcalc (map card_list_to_pair alice_all_cards)) (bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards)) win_result (list_compare alice_hand_value bob_hand_value) - correct_split (print (list "checking correct split" win_result split amount) (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)) + correct_split (print (list "bob driver e checking correct split" win_result split amount) (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)) (if (!= split correct_split) (list SLASH (indices_to_bitfield bob_picks)) (list MAKE_MOVE - (list alice_selects (indices_to_bitfield bob_picks) (indices_to_bitfield alice_picks) + (list alice_my_picks (indices_to_bitfield bob_picks) (indices_to_bitfield alice_picks) bob_hand_value alice_hand_value split) ) ) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 6da29ba5..36bf79c4 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820206ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bff808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82025effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82025effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82025effff04ff02ffff04ffff018c6d795f7069636b7320617265ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ff82025effff04ff02ffff04ffff04ffff0196636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff8203aeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffffff02ff820306ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82030effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82038effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82028effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82038effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82024effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82024effff04ff02ffff04ff07ff80808080ff80808080ffff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffffffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0180ffff04ffff02ff82022effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82022effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ff05ff02ffff03ff0bffff01ff02ffff01ff02ff82026effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8202eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82021effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffffffffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82021effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82029effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82039effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820206ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82025effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82025effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82025effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ff82025effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff8203aeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffffff02ff820306ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82030effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82038effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82028effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82038effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82024effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82024effff04ff02ffff04ff07ff80808080ff80808080ffff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffffffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0180ffff04ffff02ff82022effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82022effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ff05ff02ffff03ff0bffff01ff02ffff01ff02ff82026effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8202eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82021effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffffffffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82021effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82029effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82039effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index fc02293c..28e65c2c 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a02a2b7cc94e0d6ec5bed44d87063235edcd2423a6ca9d21586f41ad775c56b7bf \ No newline at end of file +a0594105e348899f590ff4bcc61f9105dd533d72f1283d777ff8a4d5e5a59f3532 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index ba2005c1..e41d2d5c 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bff808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82035effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82035effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82035effff04ff02ffff04ffff018c6d795f7069636b7320617265ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0110ffff0dff178080ff808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff17ffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82035effff04ff02ffff04ffff04ffff0196636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8202c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82035effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82035effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82035effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82035effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index a6a8082e..3f076f19 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a000cd187e995ba40b1a55dd7649fb658b48ed853c8341f8d240b7379c1d6db01c \ No newline at end of file +a044b67e0a252ae9e03840be175f85a20c4b8e803d5ab088ee4d56cfe65bcd1116 \ No newline at end of file diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index f61c23a9..cf47767b 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -39,7 +39,7 @@ ; (export (@ all_args ((MOVER_PUZZLE_HASH WAITER_PUZZLE_HASH TIMEOUT AMOUNT MOD_HASH NONCE MOVE MAX_MOVE_SIZE VALIDATION_INFO_HASH MOVER_SHARE PREVIOUS_VALIDATION_INFO_HASH) . args)) - (if (not args) + (if (not (print "check args" args)) ; timeout (list (list ASSERT_HEIGHT_RELATIVE TIMEOUT) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index 9a8325db..143911bc 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018f7374726c656e206e65775f6d6f7665ffff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019176206e65775f6d6f7665725f7368617265ffff04ff8200b5ffff04ff820171ffff0180808080ffff04ffff20ffff15ff8200b5ff8201718080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0195636865636b206e6577206d6f766572207368617265ffff04ff8200b5ffff01808080ffff04ffff20ffff15ffff0180ff8200b58080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018c6c6f67696f7220636865636bffff04ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff0197636865636b206d6f7665722070757a7a6c652068617368ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018b6d6174636820636865636bffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ffff02ff3cffff04ff02ffff04ffff018a636865636b2061726773ffff04ff07ff808080808080ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018f7374726c656e206e65775f6d6f7665ffff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019176206e65775f6d6f7665725f7368617265ffff04ff8200b5ffff04ff820171ffff0180808080ffff04ffff20ffff15ff8200b5ff8201718080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0195636865636b206e6577206d6f766572207368617265ffff04ff8200b5ffff01808080ffff04ffff20ffff15ffff0180ff8200b58080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018c6c6f67696f7220636865636bffff04ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff0197636865636b206d6f7665722070757a7a6c652068617368ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018b6d6174636820636865636bffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index cd7d7f7c..210bcad7 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -57,7 +57,6 @@ impl ToClvm for GameHandler { } } -#[derive(Debug)] pub struct MyTurnInputs<'a> { pub readable_new_move: ReadableMove, pub amount: Amount, @@ -223,7 +222,6 @@ impl GameHandler { allocator: &mut AllocEncoder, inputs: &MyTurnInputs, ) -> Result { - debug!("CALL MY TURN DRIVER WITH {inputs:?}"); let driver_args = ( inputs.readable_new_move.clone(), ( @@ -333,7 +331,6 @@ impl GameHandler { allocator: &mut AllocEncoder, inputs: &TheirTurnInputs, ) -> Result { - debug!("THEIR TURN MOVER SHARE {:?}", inputs.new_move.basic.mover_share); let driver_args = ( inputs.amount.clone(), ( @@ -358,7 +355,9 @@ impl GameHandler { .into_gen()?; let driver_node = self.get_their_turn_driver(allocator)?; - debug!("call their turn driver {self:?} args {}", disassemble(allocator.allocator(), driver_args, None)); + debug!("call their turn driver: {self:?}"); + debug!("call their turn args {}", disassemble(allocator.allocator(), driver_args, None)); + let run_result = run_code( allocator, driver_node, @@ -419,7 +418,9 @@ impl GameHandler { disassemble(allocator.allocator(), run_result, None) ))); } - Ok(TheirTurnResult::Slash(Evidence::from_nodeptr(pl[1]))) + Ok(TheirTurnResult::Slash( + Evidence::from_nodeptr(pl[1]), + )) } else { Err(Error::StrErr("unknown move result type".to_string())) } diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index be58a581..c3108ba6 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -24,18 +24,20 @@ use crate::channel_handler::types::{ MoveResult, OnChainGameCoin, OnChainGameState, PotatoAcceptCachedData, PotatoMoveCachedData, PotatoSignatures, ReadableMove, UnrollCoin, UnrollCoinConditionInputs, UnrollTarget, }; -use crate::common::constants::CREATE_COIN; +use crate::channel_handler::game_handler::TheirTurnResult; + +use crate::common::constants::{CREATE_COIN, DEFAULT_HIDDEN_PUZZLE_HASH}; use crate::common::standard_coin::{ private_to_public_key, puzzle_for_pk, puzzle_for_synthetic_public_key, puzzle_hash_for_pk, - puzzle_hash_for_synthetic_public_key, sign_agg_sig_me, standard_solution_unsafe, ChiaIdentity, + puzzle_hash_for_synthetic_public_key, sign_agg_sig_me, standard_solution_partial, standard_solution_unsafe, calculate_synthetic_secret_key, calculate_synthetic_public_key, ChiaIdentity, }; use crate::common::types::{ usize_from_atom, Aggsig, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinID, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, PrivateKey, Program, PublicKey, Puzzle, - PuzzleHash, Sha256tree, Spend, SpendRewardResult, Timeout, ToQuotedProgram, + PuzzleHash, Sha256tree, Spend, SpendBundle, SpendRewardResult, Timeout, ToQuotedProgram, }; use crate::potato_handler::GameAction; -use crate::referee::{GameMoveDetails, RefereeMaker, RefereeOnChainTransaction, TheirTurnCoinSpentResult, TheirTurnMoveResult}; +use crate::referee::{GameMoveDetails, RefereeMaker, RefereeOnChainTransaction}; /// A channel handler runs the game by facilitating the phases of game startup /// and passing on move information as well as termination to other layers. @@ -159,6 +161,14 @@ impl ChannelHandler { self.live_games.is_empty() } + pub fn get_reward_puzzle_hash( + &self, + env: &mut ChannelHandlerEnv + ) -> Result { + let referee_pk = private_to_public_key(&self.referee_private_key()); + puzzle_hash_for_pk(env.allocator, &referee_pk) + } + pub fn get_finished_unroll_coin(&self) -> &ChannelHandlerUnrollSpendInfo { if let Some(t) = self.timeout.as_ref() { t @@ -866,6 +876,18 @@ impl ChannelHandler { self.unroll.coin.started_with_potato ); + let (readable_move, message, mover_share) = match their_move_result.original { + TheirTurnResult::FinalMove(readable_move, mover_share) => { + (readable_move, vec![], mover_share.clone()) + } + TheirTurnResult::MakeMove(readable_move, _, message, mover_share) => { + (readable_move, message.clone(), mover_share.clone()) + } + TheirTurnResult::Slash(_) => { + return Err(Error::StrErr("slash when off chain: go on chain".to_string())); + } + }; + let unroll_data = self.compute_unroll_data_for_games(&[], None, &self.live_games)?; let spend = self.received_potato_verify_signatures( @@ -882,23 +904,16 @@ impl ChannelHandler { // the unroll puzzle hash that was given to us. self.cached_last_action = None; - match their_move_result { - TheirTurnMoveResult::Move { readable_move, message, mover_share, .. } => { - Ok(( - ChannelCoinSpendInfo { - aggsig: spend.signature, - solution: spend.solution, - conditions: spend.conditions, - }, - readable_move, - message, - mover_share, - )) - } - TheirTurnMoveResult::Slash { evidence } => { - todo!(); - } - } + Ok(( + ChannelCoinSpendInfo { + aggsig: spend.signature, + solution: spend.solution, + conditions: spend.conditions, + }, + readable_move, + message, + mover_share, + )) } pub fn received_message( @@ -1445,8 +1460,8 @@ impl ChannelHandler { OnChainGameState { game_id: live_game.game_id.clone(), puzzle_hash: game_coin.clone(), - next_puzzle_hash: None, our_turn: live_game.is_my_turn(), + accept: false, }, ); } @@ -1572,7 +1587,7 @@ impl ChannelHandler { let live_game_idx = self.get_game_by_id(game_id)?; let referee_pk = private_to_public_key(&self.referee_private_key()); - let reward_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; + let reward_puzzle_hash = self.get_reward_puzzle_hash(env)?; let (ph, amt) = if let Some((ph, amt)) = conditions .iter() @@ -1595,22 +1610,14 @@ impl ChannelHandler { return Ok(CoinSpentInformation::OurReward(ph.clone(), amt.clone())); } - debug!("{} asking referee", self.is_initial_potato()); - let their_spend_result = self.live_games[live_game_idx].their_turn_coin_spent( - env.allocator, - coin_string, - conditions, - self.current_state_number, - )?; - debug!("their_spend_result {their_spend_result:?}"); - if let TheirTurnCoinSpentResult::Repeat(ph, amt) = &their_spend_result { - if !self.live_games[live_game_idx].is_my_turn() { - return Ok(CoinSpentInformation::Expected(ph.clone(), amt.clone())); - } - } - - assert!(self.live_games[live_game_idx].is_my_turn()); - Ok(CoinSpentInformation::TheirSpend(their_spend_result)) + Ok(CoinSpentInformation::TheirSpend( + self.live_games[live_game_idx].their_turn_coin_spent( + env.allocator, + coin_string, + conditions, + self.current_state_number, + )?, + )) } pub fn get_redo_action( @@ -1781,7 +1788,6 @@ impl ChannelHandler { let tx = self.live_games[game_idx].get_transaction_for_timeout(env.allocator, coin)?; // Game is done one way or another. self.live_games.remove(game_idx); - debug!("{} has {} games left", self.is_initial_potato(), self.live_games.len()); Ok(tx) } @@ -1825,32 +1831,48 @@ impl ChannelHandler { } let mut coins_with_solutions = Vec::default(); + let default_hidden_puzzle_hash = Hash::from_bytes(DEFAULT_HIDDEN_PUZZLE_HASH); + let synthetic_referee_private_key = calculate_synthetic_secret_key(&self.private_keys.my_referee_private_key, &default_hidden_puzzle_hash)?; + let my_referee_public_key = + private_to_public_key(&self.private_keys.my_referee_private_key); + let synthetic_referee_public_key = calculate_synthetic_public_key( + &my_referee_public_key, + &PuzzleHash::from_hash(default_hidden_puzzle_hash.clone()), + ); + let puzzle = puzzle_for_pk(env.allocator, &my_referee_public_key)?; for (i, coin) in exploded_coins.iter().enumerate() { let parent_id = coin.coin_string.to_coin_id(); let conditions = if i == 0 { - (CREATE_COIN, (parent_id.clone(), (total_amount.clone(), ()))) + ( + (CREATE_COIN, (target_puzzle_hash.clone(), (total_amount.clone(), ()))), + () + ) .to_clvm(env.allocator) .into_gen()? } else { ().to_clvm(env.allocator).into_gen()? }; - let quoted_program = conditions.to_quoted_program(env.allocator)?; - let quoted_program_hash = quoted_program.sha256tree(env.allocator); - let signature = sign_agg_sig_me( - &self.referee_private_key(), - quoted_program_hash.bytes(), + let spend = standard_solution_partial( + env.allocator, + &synthetic_referee_private_key, &parent_id, + conditions, + &my_referee_public_key, &env.agg_sig_me_additional_data, - ); + false + )?; let standard_solution = standard_solution_unsafe(env.allocator, &self.referee_private_key(), conditions)?; - coins_with_solutions.push(Spend { - puzzle: spend_coin_puzzle.clone(), - solution: standard_solution.solution.clone(), - signature, + coins_with_solutions.push(CoinSpend { + coin: coin.coin_string.clone(), + bundle: Spend { + puzzle: puzzle.clone(), + solution: spend.solution.clone(), + signature: spend.signature.clone(), + } }); } diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index c9a05040..841ac922 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -965,8 +965,8 @@ pub struct UnrollTarget { pub struct OnChainGameState { pub game_id: GameID, pub puzzle_hash: PuzzleHash, - pub next_puzzle_hash: Option, pub our_turn: bool, + pub accept: bool, } impl LiveGame { @@ -1035,8 +1035,8 @@ impl LiveGame { let their_move_result = self.referee_maker .their_turn_move_off_chain(allocator, game_move, state_number)?; - if let TheirTurnMoveResult::Move { puzzle_hash_for_unroll, .. } = &their_move_result { - self.last_referee_puzzle_hash = puzzle_hash_for_unroll.clone(); + if let Some(ph) = &their_move_result.puzzle_hash_for_unroll { + self.last_referee_puzzle_hash = ph.clone(); } Ok(their_move_result) } diff --git a/src/common/types.rs b/src/common/types.rs index 244e4522..58a4900a 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -1045,7 +1045,7 @@ impl Default for Spend { } pub struct SpendRewardResult { - pub coins_with_solutions: Vec, + pub coins_with_solutions: Vec, pub result_coin_string_up: CoinString, } diff --git a/src/peer_container.rs b/src/peer_container.rs index 8df089f9..1f853b7c 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -14,7 +14,7 @@ use crate::common::standard_coin::{ }; use crate::common::types::{ AllocEncoder, Amount, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Program, PuzzleHash, - Sha256tree, Spend, SpendBundle, Timeout, ToQuotedProgram, + Sha256tree, Spend, SpendBundle, SpendRewardResult, Timeout, ToQuotedProgram, }; use crate::potato_handler::{ BootstrapTowardGame, BootstrapTowardWallet, FromLocalUI, GameStart, GameType, PacketSender, @@ -71,9 +71,6 @@ impl FullCoinSetAdapter { current_height: u64, current_coins: &[CoinString], ) -> Result { - debug!( - "update known coins {current_height:?}: current coins from blockchain {current_coins:?}" - ); self.current_height = current_height; let mut current_coin_set: HashSet = current_coins.iter().cloned().collect(); let created_coins: HashSet = current_coin_set @@ -244,6 +241,22 @@ pub trait GameCradle { coin_id: &CoinString, puzzle_and_solution: Option<(&Program, &Program)>, ) -> Result<(), Error>; + + /// Get the reward puzzle hash + fn get_reward_puzzle_hash( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + ) -> Result; + + /// Return a transaction to spend a reward coin to a given target + fn spend_reward_coins( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + coin_string: &[CoinString], + target: &PuzzleHash, + ) -> Result; } struct SynchronousGameCradleState { @@ -263,6 +276,7 @@ struct SynchronousGameCradleState { raw_game_messages: VecDeque<(GameID, Vec)>, game_messages: VecDeque<(GameID, ReadableMove)>, game_finished: VecDeque<(GameID, Amount)>, + finished: bool, shutdown: Option, identity: ChiaIdentity, } @@ -350,6 +364,7 @@ impl SynchronousGameCradle { funding_coin: None, unfunded_offer: None, shutdown: None, + finished: false, }, peer: PotatoHandler::new(PotatoHandlerInit { have_potato: config.have_potato, @@ -424,6 +439,7 @@ impl ToLocalUI for SynchronousGameCradleState { } fn shutdown_complete(&mut self, reward_coin_string: Option<&CoinString>) -> Result<(), Error> { self.shutdown = reward_coin_string.cloned(); + self.finished = true; Ok(()) } fn going_on_chain(&mut self, _got_error: bool) -> Result<(), Error> { @@ -484,8 +500,8 @@ impl SynchronousGameCradle { self.peer.amount() } - pub fn finished(&self) -> Option { - self.state.shutdown.clone() + pub fn finished(&self) -> bool { + self.state.finished } fn create_partial_spend_for_channel_coin( @@ -681,6 +697,34 @@ impl GameCradle for SynchronousGameCradle { self.peer.is_on_chain() } + fn get_reward_puzzle_hash( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + ) -> Result { + let mut env = channel_handler_env(allocator, rng); + let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { + env: &mut env, + system_interface: &mut self.state, + }; + self.peer.get_reward_puzzle_hash(&mut penv) + } + + fn spend_reward_coins( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + coin_string: &[CoinString], + target: &PuzzleHash, + ) -> Result { + let mut env = channel_handler_env(allocator, rng); + let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { + env: &mut env, + system_interface: &mut self.state, + }; + self.peer.spend_reward_coins(&mut penv, coin_string, target) + } + fn opening_coin( &mut self, allocator: &mut AllocEncoder, diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 9a9b55a9..f174e1a5 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -24,7 +24,7 @@ use crate::common::standard_coin::{ use crate::common::types::{ chia_dialect, Aggsig, AllocEncoder, Amount, CoinCondition, CoinID, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, Program, PublicKey, Puzzle, PuzzleHash, Sha256Input, - Sha256tree, Spend, SpendBundle, Timeout, + Sha256tree, Spend, SpendBundle, SpendRewardResult, Timeout, }; use crate::referee::{RefereeOnChainTransaction, TheirTurnCoinSpentResult}; use clvm_tools_rs::classic::clvm::sexp::proper_list; @@ -433,17 +433,6 @@ pub enum GameAction { Shutdown(NodePtr), } -impl GameAction { - pub fn get_game_id(&self) -> Option<&GameID> { - match self { - GameAction::Move(id, _, _) => Some(id), - GameAction::RedoMove(id, _, _, _) => Some(id), - GameAction::Accept(id) => Some(id), - GameAction::Shutdown(_) => None, - } - } -} - pub struct PotatoHandlerInit { pub have_potato: bool, pub private_keys: ChannelHandlerPrivateKeys, @@ -631,6 +620,33 @@ impl PotatoHandler { matches!(self.have_potato, PotatoState::Present) } + pub fn get_reward_puzzle_hash<'a, G, R: Rng + 'a>( + &self, + penv: &'a mut dyn PeerEnv<'a, G, R>, + ) -> Result + where + G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender, + { + let player_ch = self.channel_handler()?; + let (env, _) = penv.env(); + player_ch.get_reward_puzzle_hash(env) + } + + pub fn spend_reward_coins<'a, G, R: Rng + 'a>( + &self, + penv: &'a mut dyn PeerEnv<'a, G, R>, + coin_string: &[CoinString], + target: &PuzzleHash, + ) -> Result + where + G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender, + { + let player_ch = self.channel_handler()?; + let (env, _) = penv.env(); + player_ch.spend_reward_coins(env, coin_string, target) + } + + pub fn start<'a, G, R: Rng + 'a>( &mut self, penv: &'a mut dyn PeerEnv<'a, G, R>, @@ -1865,32 +1881,23 @@ impl PotatoHandler { CoinString::from_parts(¤t_coin.to_coin_id(), &new_ph, &transaction.amount); self.my_game_spends.insert(new_ph.clone()); - debug!("{initial_potato} change game map {new_ph:?}"); + debug!("{initial_potato} changing game map"); game_map.insert( - current_coin.clone(), + new_coin.clone(), OnChainGameState { - puzzle_hash: old_ph, + puzzle_hash: new_ph, our_turn: false, - next_puzzle_hash: Some(new_ph), ..old_definition }, ); let (_env, system_interface) = penv.env(); - // The next coin. system_interface.register_coin( &new_coin, &self.channel_timeout, Some("game coin for my turn"), )?; - // The coin we're coming from. - system_interface.register_coin( - current_coin, - &self.channel_timeout, - Some("their turn coin spent"), - )?; - system_interface.spend_transaction_and_add_fee(&SpendBundle { name: Some("on chain move".to_string()), spends: vec![CoinSpend { @@ -1911,6 +1918,12 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { + let initial_potato = + { + let player_ch = self.channel_handler()?; + player_ch.is_initial_potato() + }; + let get_current_coin = |hs: &HandshakeState, game_id: &GameID| -> Result { @@ -1925,7 +1938,7 @@ impl PotatoHandler { } }; - debug!("do_on_chain_action {action:?}"); + debug!("{initial_potato} do_on_chain_action {action:?}"); match action { GameAction::Move(game_id, readable_move, hash) => { let current_coin = get_current_coin(&self.handshake_state, &game_id)?; @@ -1936,8 +1949,7 @@ impl PotatoHandler { { let player_ch = self.channel_handler()?; debug!( - "{} created puzzle hash for redo {new_ph:?}", - player_ch.is_initial_potato() + "{initial_potato} created puzzle hash for redo {new_ph:?}", ); self.my_game_spends.insert(new_ph.clone()); } @@ -1967,35 +1979,32 @@ impl PotatoHandler { GameAction::Accept(game_id) => { let current_coin = get_current_coin(&self.handshake_state, &game_id)?; let player_ch = self.channel_handler_mut()?; + let my_turn = player_ch.game_is_my_turn(&game_id); debug!( - "{} on chain: accept game coin {current_coin:?}", - player_ch.is_initial_potato() + "{initial_potato} on chain (my turn {my_turn:?}): accept game coin {current_coin:?}", ); let (env, system_interface) = penv.env(); - let result_transaction = - player_ch.accept_or_timeout_game_on_chain(env, &game_id, ¤t_coin)?; - let initial_potato = player_ch.is_initial_potato(); - self.have_potato = PotatoState::Present; - if let Some(transaction) = result_transaction { - debug!("accept with transaction {transaction:?}"); - if let Some((_, ph, _)) = current_coin.to_parts() { - assert_eq!(ph, transaction.bundle.puzzle.sha256tree(env.allocator)); + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + if let Some(coin_def) = game_map.get_mut(¤t_coin) { + coin_def.accept = true; } - system_interface.spend_transaction_and_add_fee(&SpendBundle { - name: Some("accept".to_string()), - spends: vec![CoinSpend { - coin: current_coin, - bundle: transaction.bundle.clone() - }], - })?; - } else { - debug!("{initial_potato} Accepted game when our share was zero"); } Ok(()) } - x => { - todo!("unexpected move type {x:?}"); + GameAction::Shutdown(conditions) => { + if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { + if !game_map.is_empty() { + debug!("Can't shut down yet, still have games"); + self.game_action_queue.push_front(GameAction::Shutdown(conditions)); + return Ok(()); + } + } + + let (env, system_interface) = penv.env(); + debug!("notify shutdown complete"); + system_interface.shutdown_complete(None); + Ok(()) } } } @@ -2018,15 +2027,6 @@ impl PotatoHandler { self.have_potato_move(penv)?; } else if let HandshakeState::OnChain(_game_map) = &mut self.handshake_state { - let player_ch = self.channel_handler()?; - if let Some(game_id) = action.get_game_id() { - if !matches!(action, GameAction::RedoMove(_, _, _, _)) && !matches!(player_ch.game_is_my_turn(&game_id), Some(true)) { - debug!("{} holding action {action:?} due to not our turn", player_ch.is_initial_potato()); - self.game_action_queue.push_back(action); - return Ok(()); - } - } - return self.do_on_chain_action(penv, action); } else { return Err(Error::StrErr( @@ -2214,9 +2214,6 @@ impl PotatoHandler { G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { if let Some(action) = self.game_action_queue.pop_front() { - let player_ch = self.channel_handler()?; - let initial_potato = player_ch.is_initial_potato(); - debug!("{initial_potato} try to do next action {action:?}"); self.do_game_action(penv, action)?; } @@ -2259,19 +2256,14 @@ impl PotatoHandler { let player_ch = self.channel_handler_mut()?; let (env, system_interface) = penv.env(); let conditions = CoinCondition::from_puzzle_and_solution(env.allocator, puzzle, solution)?; - let preceding_turn_polarity = player_ch.game_is_my_turn(&old_definition.game_id); let their_turn_result = player_ch.game_coin_spent(env, &old_definition.game_id, coin_id, &conditions)?; debug!( "{initial_potato} game coin spent result from channel handler {their_turn_result:?}" ); - let turn_polarity_for_game = player_ch.game_is_my_turn(&old_definition.game_id); - // We did a their turn, so it should be our turn. - match their_turn_result { CoinSpentInformation::Expected(ph, amt) => { - let my_turn = matches!(turn_polarity_for_game, Some(true)); - debug!("{initial_potato} my turn {my_turn} got an expected spend {ph:?} {amt:?}"); + debug!("{initial_potato} got an expected spend {ph:?} {amt:?}"); let new_coin_id = CoinString::from_parts( &coin_id.to_coin_id(), &ph, @@ -2279,60 +2271,26 @@ impl PotatoHandler { ); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { // An expected their spend arrived. We can do our next action. - debug!("{initial_potato} change game map {ph:?}"); + debug!("{initial_potato} changing game map"); game_map.insert(new_coin_id.clone(), OnChainGameState { puzzle_hash: ph, - our_turn: my_turn, + our_turn: false, .. old_definition }); - if my_turn { - unblock_queue = true; - } } let (_, system_interface) = penv.env(); system_interface.register_coin( &new_coin_id, &self.channel_timeout, - Some("coin gives their turn (e)") + Some("coin gives their turn") )?; } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Timedout { /*my_reward_coin_string*/ .. }) => { todo!(); } - CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Repeat(ph, amt)) => { - if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { - let new_coin_id = CoinString::from_parts( - &coin_id.to_coin_id(), - &ph, - &amt - ); - - // An expected their spend arrived. We can do our next action. - debug!("{initial_potato} change game map {ph:?}"); - let nil = env.allocator.encode_atom(&[]).into_gen()?; - let rm = ReadableMove::from_nodeptr(env.allocator, nil)?; - system_interface.opponent_moved( - env.allocator, - &old_definition.game_id, - rm, - Amount::default(), - )?; - game_map.insert(new_coin_id.clone(), OnChainGameState { - puzzle_hash: ph, - .. old_definition - }); - system_interface.register_coin( - &new_coin_id, - &self.channel_timeout, - Some("coin gives their turn (2)") - )?; - } - } CoinSpentInformation::TheirSpend(TheirTurnCoinSpentResult::Moved { new_coin_string, readable, mover_share, .. }) => { - debug!("{initial_potato} got a their spend creating {new_coin_string:?} from ph {:?}", old_definition.puzzle_hash); - // assert_ne!(preceding_turn_polarity, turn_polarity_for_game); - assert_eq!(Some(true), turn_polarity_for_game); + debug!("{initial_potato} got a their spend {new_coin_string:?} from ph {:?}", old_definition.puzzle_hash); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { let (puzzle_hash, amt) = if let Some((orig_coin_id, ph, amt)) = new_coin_string.to_parts() { @@ -2344,7 +2302,7 @@ impl PotatoHandler { let game_id = old_definition.game_id.clone(); debug!("{initial_potato} got their coin spend with new puzzle hash {puzzle_hash:?} {amt:?}"); - debug!("{initial_potato} change game map {puzzle_hash:?}"); + debug!("{initial_potato} changing game map"); game_map.insert(new_coin_string.clone(), OnChainGameState { puzzle_hash, our_turn: true, @@ -2382,7 +2340,7 @@ impl PotatoHandler { &ph, &amt ); - debug!("{initial_potato} change game map {ph:?}"); + debug!("{initial_potato} changing game map"); game_map.insert(new_coin_id.clone(), OnChainGameState { puzzle_hash: ph, our_turn: false, @@ -2491,13 +2449,12 @@ impl, - mover_share: Amount, - original: TheirTurnResult, - }, - Slash { - evidence: Evidence - } +pub struct TheirTurnMoveResult { + pub puzzle_hash_for_unroll: Option, + pub original: TheirTurnResult, } #[derive(Debug)] @@ -92,7 +85,6 @@ pub struct LiveGameReplay { #[derive(Debug)] pub enum TheirTurnCoinSpentResult { - Repeat(PuzzleHash, Amount), Timedout { my_reward_coin_string: Option, }, @@ -177,9 +169,6 @@ impl RefereePuzzleArgs { "VALIDATION_INFO_HASH {my_turn} {}", hex::encode(validation_info_hash.bytes()) ); - let mover_share = mover_share - .cloned() - .unwrap_or_else(|| initial_move.mover_share.clone()); RefereePuzzleArgs { mover_puzzle_hash: if my_turn { fixed_info.my_identity.puzzle_hash.clone() @@ -196,7 +185,9 @@ impl RefereePuzzleArgs { nonce: fixed_info.nonce, game_move: GameMoveDetails { basic: GameMoveStateInfo { - mover_share, + mover_share: mover_share + .cloned() + .unwrap_or_else(|| initial_move.mover_share.clone()), ..initial_move.clone() }, validation_info_hash: validation_info_hash.clone(), @@ -682,13 +673,18 @@ impl RefereeMaker { nonce, }); + let mover_share = if my_turn { + fixed_info.amount.clone() - initial_move.mover_share.clone() + } else { + initial_move.mover_share.clone() + }; // TODO: Revisit how we create initial_move let ref_puzzle_args = Rc::new(RefereePuzzleArgs::new( &fixed_info, &initial_move, None, &Hash::default(), - Some(&initial_move.mover_share.clone()), + Some(&mover_share), my_turn, )); // If this reflects my turn, then we will spend the next parameter set. @@ -884,7 +880,6 @@ impl RefereeMaker { state_number: usize, ) -> Result<(), Error> { debug!("{state_number} accept move {details:?}"); - assert_ne!(current_puzzle_args.game_move.basic.mover_share, Amount::default()); assert_ne!( current_puzzle_args.mover_puzzle_hash, new_puzzle_args.mover_puzzle_hash @@ -996,7 +991,6 @@ impl RefereeMaker { debug!("my turn state {:?}", self.state); debug!("entropy {state_number} {new_entropy:?}"); - assert_ne!(args.game_move.basic.mover_share, Amount::default()); let result = Rc::new(game_handler.call_my_turn_driver( allocator, &MyTurnInputs { @@ -1133,6 +1127,16 @@ impl RefereeMaker { ) } + pub fn outcome_referee_puzzle(&self, allocator: &mut AllocEncoder) -> Result { + let args = self.spend_this_coin(); + curry_referee_puzzle( + allocator, + &self.fixed.referee_coin_puzzle, + &self.fixed.referee_coin_puzzle_hash, + &args, + ) + } + pub fn on_chain_referee_puzzle_hash( &self, allocator: &mut AllocEncoder, @@ -1154,12 +1158,19 @@ impl RefereeMaker { &self, allocator: &mut AllocEncoder, coin_string: &CoinString, - puzzle: &Puzzle, always_produce_transaction: bool, + puzzle: &Puzzle, targs: &RefereePuzzleArgs, args: &OnChainRefereeSolution, ) -> Result, Error> { - let my_mover_share = targs.game_move.basic.mover_share.clone(); + let our_move = self.is_my_turn(); + + let my_mover_share = + if our_move { + targs.game_move.basic.mover_share.clone() + } else { + self.fixed.amount.clone() - targs.game_move.basic.mover_share.clone() + }; if always_produce_transaction || my_mover_share != Amount::default() { let signature = args.get_signature().unwrap_or_default(); @@ -1198,21 +1209,32 @@ impl RefereeMaker { /// Output coin_string: /// Parent is hash of current_coin /// Puzzle hash is my_referee_puzzle_hash. + /// + /// Timeout unlike other actions applies to the current ph, not the one at the + /// start of a turn proper. pub fn get_transaction_for_timeout( &mut self, allocator: &mut AllocEncoder, coin_string: &CoinString, ) -> Result, Error> { - let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; - if let Some((_, ph, _)) = coin_string.to_parts() { - assert_eq!(spend_puzzle.sha256tree(allocator), ph); - } + debug!("get_transaction_for_timeout turn {}", self.is_my_turn()); + debug!("mover share at start of action {:?}", self.args_for_this_coin().game_move.basic.mover_share); + debug!("mover share at end of action {:?}", self.spend_this_coin().game_move.basic.mover_share); + + let targs = self.spend_this_coin(); + let puzzle = curry_referee_puzzle( + allocator, + &self.fixed.referee_coin_puzzle, + &self.fixed.referee_coin_puzzle_hash, + &targs + )?; + self.get_transaction( allocator, coin_string, - &spend_puzzle, false, - &self.spend_this_coin(), + &puzzle, + &targs, &OnChainRefereeSolution::Timeout, ) } @@ -1253,6 +1275,7 @@ impl RefereeMaker { // We can only do a move to replicate our turn. assert!(self.processing_my_turn()); let args = self.spend_this_coin(); + let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; let state_node = self.get_game_state().to_nodeptr(allocator)?; let nil = allocator.allocator().null(); @@ -1289,15 +1312,6 @@ impl RefereeMaker { // debug!("get_transaction_for_move: previous curry"); let args = self.args_for_this_coin(); - let current_referee_puzzle_hash = self.on_chain_referee_puzzle_hash(allocator)?; - debug!("spend from puzzle hash {current_referee_puzzle_hash:?}"); - let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; - - let spend_puzzle_nodeptr = spend_puzzle.to_clvm(allocator).into_gen()?; - assert_eq!( - spend_puzzle.sha256tree(allocator), - current_referee_puzzle_hash - ); debug!("transaction for move: state {:?}", self.state); debug!("get_transaction_for_move: source curry {args:?}"); @@ -1405,8 +1419,8 @@ impl RefereeMaker { if let Some(transaction) = self.get_transaction( allocator, coin_string, - &spend_puzzle, true, + &spend_puzzle, &target_args, &args_list, )? { @@ -1534,7 +1548,7 @@ impl RefereeMaker { true, )); - let (readable_move, message, mover_share) = match &result { + match &result { TheirTurnResult::FinalMove(readable_move, mover_share) => { self.accept_their_move( allocator, @@ -1544,8 +1558,6 @@ impl RefereeMaker { details, state_number, )?; - - (*readable_move, vec![], mover_share) } TheirTurnResult::MakeMove(readable_move, handler, message, mover_share) => { // Mover puzzle turns the given solution into coin conditions @@ -1568,18 +1580,13 @@ impl RefereeMaker { details, state_number, )?; - - debug!( - "readable_move {}", - disassemble(allocator.allocator(), *readable_move, None) - ); - debug!("message {message:?}"); - - (*readable_move, message.clone(), mover_share) } // Slash can't be used when we're off chain. - TheirTurnResult::Slash(ev) => { - return Ok(TheirTurnMoveResult::Slash { evidence: ev.clone() }); + TheirTurnResult::Slash(_evidence) => { + return Ok(TheirTurnMoveResult { + puzzle_hash_for_unroll: None, + original: result.clone(), + }) } }; @@ -1594,11 +1601,8 @@ impl RefereeMaker { ); // Coin calculated off the new new state. - Ok(TheirTurnMoveResult::Move { - puzzle_hash_for_unroll, - readable_move, - message: message.clone(), - mover_share: mover_share.clone(), + Ok(TheirTurnMoveResult { + puzzle_hash_for_unroll: Some(puzzle_hash_for_unroll), original: result, }) } @@ -1811,12 +1815,20 @@ impl RefereeMaker { }; if repeat { - return Ok(TheirTurnCoinSpentResult::Repeat(after_puzzle_hash, self.fixed.amount.clone())); + let nil = allocator.allocator().null(); + debug!("rems in spend {conditions:?}"); + debug!("current state {:?}", self.state); + return Ok(TheirTurnCoinSpentResult::Moved { + new_coin_string: CoinString::from_parts( + &coin_string.to_coin_id(), + &after_puzzle_hash, + &self.fixed.amount, + ), + readable: ReadableMove::from_nodeptr(allocator, nil)?, + mover_share: self.spend_this_coin().game_move.basic.mover_share.clone(), + }); } - debug!("repeat {repeat}"); - assert!(self.processing_my_turn()); - // Read parameters off conditions let rem_condition = if let Some(CoinCondition::Rem(rem_condition)) = conditions .iter() @@ -1828,6 +1840,8 @@ impl RefereeMaker { Vec::default() }; + let mover_share = self.get_our_current_share(); + // Check properties of conditions if rem_condition.is_empty() { // Timeout case @@ -1839,7 +1853,7 @@ impl RefereeMaker { let my_reward_coin_string = CoinString::from_parts( &coin_string.to_coin_id(), &self.fixed.my_identity.puzzle_hash, - &self.get_our_current_share(), + &mover_share, ); return Ok(TheirTurnCoinSpentResult::Timedout { @@ -1876,7 +1890,6 @@ impl RefereeMaker { }; let result = self.their_turn_move_off_chain(allocator, &details, state_number)?; - assert!(self.is_my_turn() || matches!(result, TheirTurnMoveResult::Slash { .. })); let args = self.spend_this_coin(); @@ -1892,10 +1905,8 @@ impl RefereeMaker { let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr, mover_share: Amount| { if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { - assert!(self.is_my_turn()); Ok(result) } else { - assert!(self.is_my_turn()); Ok(TheirTurnCoinSpentResult::Moved { new_coin_string: CoinString::from_parts( &coin_string.to_coin_id(), @@ -1909,37 +1920,28 @@ impl RefereeMaker { }; debug!("referee move details {details:?}"); - debug!("result {result:?}"); - match &result { - TheirTurnMoveResult::Move { original, .. } => { - let final_result = match original { - TheirTurnResult::Slash(evidence) => { - let slash_spend = self.make_slash_spend(allocator)?; - let full_slash_solution = self.make_full_slash_solution(allocator)?; - return self.make_slash_for_their_turn( - allocator, - coin_string, - &new_puzzle, - &new_puzzle_hash, - full_slash_solution, - evidence.clone(), - &slash_spend.signature, - ); - } - TheirTurnResult::FinalMove(readable_move, mover_share) => { - assert!(self.is_my_turn()); - check_and_report_slash(allocator, *readable_move, mover_share.clone()) - } - TheirTurnResult::MakeMove(readable_move, _, _, mover_share) => { - assert!(self.is_my_turn()); - check_and_report_slash(allocator, *readable_move, mover_share.clone()) - } - }; - final_result + let final_result = match result.original { + TheirTurnResult::Slash(evidence) => { + let slash_spend = self.make_slash_spend(allocator)?; + let full_slash_solution = self.make_full_slash_solution(allocator)?; + return self.make_slash_for_their_turn( + allocator, + coin_string, + &new_puzzle, + &new_puzzle_hash, + full_slash_solution, + evidence, + &slash_spend.signature, + ); + } + TheirTurnResult::FinalMove(readable_move, mover_share) => { + check_and_report_slash(allocator, readable_move, mover_share) } - _ => { - todo!(); + TheirTurnResult::MakeMove(readable_move, _, _, _) => { + check_and_report_slash(allocator, readable_move, mover_share) } - } + }; + + final_result } } diff --git a/src/tests/calpoker.rs b/src/tests/calpoker.rs index f13c1246..b13a580c 100644 --- a/src/tests/calpoker.rs +++ b/src/tests/calpoker.rs @@ -94,7 +94,7 @@ pub fn test_moves_1(allocator: &mut AllocEncoder) -> [GameAction; 5] { let bob_picks = [1, 0, 1, 0, 1, 0, 1, 0] .to_clvm(allocator) .expect("should work"); - let win_move = ().to_clvm(allocator).expect("should work"); + let win_move_200 = 200.to_clvm(allocator).expect("should work"); [ GameAction::Move(0, alice_word_hash, true), @@ -104,7 +104,7 @@ pub fn test_moves_1(allocator: &mut AllocEncoder) -> [GameAction; 5] { GameAction::Move(0, alice_picks, true), GameAction::Move(1, bob_picks, true), // Move is a declared split. - GameAction::Move(0, win_move, true), + GameAction::Move(0, win_move_200, true), ] } diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index 45eb8985..1698f1f1 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -11,15 +11,11 @@ use crate::referee::{GameMoveDetails, GameMoveStateInfo}; #[test] fn test_game_handler_their_move_slash() { let mut allocator = AllocEncoder::new(); - let default_aggsig = Aggsig::default(); - let aggsig_node = default_aggsig.to_clvm(&mut allocator).expect("should make"); - let dis_aggsig = disassemble(allocator.allocator(), aggsig_node, None); let program = assemble( allocator.allocator(), &format!( - "(c (1 . 2) (c (c (1 . 1337) 1) (c (1 . {}) ())))", - dis_aggsig + "(c (1 . 2) (c (c (1 . 1337) 1) ()))", ), ) .expect("should assemble"); diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index f201d4a0..0e89dfa7 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -690,6 +690,7 @@ impl ToLocalUI for LocalTestUIReceiver { } fn shutdown_complete(&mut self, _reward_coin_string: Option<&CoinString>) -> Result<(), Error> { + todo!(); self.shutdown_complete = true; Ok(()) } @@ -794,7 +795,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( let mut game_ids = Vec::default(); let mut handshake_done = false; let mut can_move = false; - let mut ending = false; + let mut ending = None; let mut current_move = moves.iter(); let mut num_steps = 0; @@ -803,15 +804,10 @@ fn run_calpoker_container_with_action_list_with_success_predicate( cradles[0].opening_coin(allocator, &mut rng, parent_coin_0)?; cradles[1].opening_coin(allocator, &mut rng, parent_coin_1)?; - // XXX Move on to shutdown complete. - while !ending - && !local_uis - .iter() - .all(|l| l.game_finished.is_some() || l.shutdown_complete) - { + while !matches!(ending, Some(0)) { num_steps += 1; - assert!(num_steps < 100); + assert!(num_steps < 1000); simulator.farm_block(&neutral_identity.puzzle_hash); let current_height = simulator.get_current_height(); @@ -832,6 +828,27 @@ fn run_calpoker_container_with_action_list_with_success_predicate( } for i in 0..=1 { + if cradles[i].handshake_finished() { + let reward_ph = cradles[i].get_reward_puzzle_hash(allocator, &mut rng)?; + let reward_coins = simulator.get_my_coins(&reward_ph).into_gen()?; + debug!("{i} reward coins {reward_coins:?}"); + // Spend the reward coin to the player. + if !reward_coins.is_empty() { + let spends = cradles[i].spend_reward_coins( + allocator, + &mut rng, + &reward_coins, + &identities[i].puzzle_hash + )?; + let included = simulator.push_tx( + allocator, + &spends.coins_with_solutions + ).into_gen()?; + debug!("reward spends: {included:?}"); + assert_eq!(included.code, 1); + } + } + if local_uis[i].go_on_chain { // Perform on chain move. // Turn off the flag to go on chain. @@ -886,6 +903,15 @@ fn run_calpoker_container_with_action_list_with_success_predicate( } } + let should_end = cradles.iter().all(|c| c.finished()) && ending.is_none(); + if should_end { + ending = Some(10); + } + + if let Some(ending) = &mut ending { + *ending -= 1; + } + if !handshake_done && cradles[0].handshake_finished() && cradles[1].handshake_finished() { // Start game. handshake_done = true; @@ -924,8 +950,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( } else if can_move || local_uis .iter() - .any(|l| l.opponent_moved || l.shutdown_complete) - || ending + .any(|l| l.opponent_moved) { can_move = false; assert!(!game_ids.is_empty()); @@ -1000,6 +1025,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .accept(allocator, &mut rng, &game_ids[0])?; } GameAction::Shutdown(who, _) => { + can_move = true; cradles[*who] .shut_down(allocator, &mut rng)?; } @@ -1023,24 +1049,6 @@ fn run_calpoker_container_with_action_list( run_calpoker_container_with_action_list_with_success_predicate(allocator, moves, None) } -#[test] -fn sim_test_with_peer_container() { - let mut allocator = AllocEncoder::new(); - - // Play moves - let mut moves = test_moves_1(&mut allocator).to_vec(); - let nil = allocator.encode_atom(&[]).into_gen().expect("should work"); - moves.push(GameAction::Accept(0)); - moves.push(GameAction::Accept(1)); - moves.push(GameAction::Shutdown(0, nil)); - moves.push(GameAction::Shutdown(1, nil)); - run_calpoker_container_with_action_list_with_success_predicate( - &mut allocator, - &moves, - Some(&|cradles| cradles[0].finished().is_some() && cradles[1].finished().is_some()), - ).expect("should finish"); -} - #[test] fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { let mut allocator = AllocEncoder::new(); @@ -1064,10 +1072,10 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { let mut moves = test_moves_1(&mut allocator).to_vec(); let nil = allocator.encode_atom(&[]).into_gen().expect("should work"); - moves.push(GameAction::Accept(1)); moves.push(GameAction::Accept(0)); - moves.push(GameAction::Shutdown(1, nil)); + moves.push(GameAction::Accept(1)); moves.push(GameAction::Shutdown(0, nil)); + moves.push(GameAction::Shutdown(1, nil)); if let GameAction::Move(player, readable, _) = moves[3].clone() { moves.insert(3, GameAction::FakeMove(player, readable, vec![0; 500])); } else { @@ -1100,9 +1108,12 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { ).expect("should decode"); debug!("outcome move {}", disassemble(allocator.allocator(), outcome_node, None)); debug!("game outcome {decoded_outcome:?}"); - if decoded_outcome.win_direction != 0 { + debug!("p1 balance {p1_balance:?} p2 {p2_balance:?}"); + if decoded_outcome.win_direction == 1 { + assert_eq!(p2_balance + 200, p1_balance); + } else if decoded_outcome.win_direction == -1 { assert_eq!(p2_balance, p1_balance + 200); } else { - assert_eq!(p2_balance + 200, p1_balance); + assert_eq!(p2_balance, p1_balance); } } diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 321a0bfb..9a9c8fbf 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -8,14 +8,14 @@ use clvmr::NodePtr; use log::debug; -use crate::channel_handler::game_handler::GameHandler; +use crate::channel_handler::game_handler::{GameHandler, TheirTurnResult}; use crate::channel_handler::types::{GameStartInfo, ReadableMove, ValidationProgram}; use crate::common::standard_coin::{read_hex_puzzle, ChiaIdentity}; use crate::common::types::{ Aggsig, AllocEncoder, Amount, Error, GameID, PrivateKey, Program, Puzzle, PuzzleHash, Sha256tree, Timeout, }; -use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker, TheirTurnMoveResult}; +use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker}; pub struct DebugGamePrograms { pub my_validation_program: NodePtr, @@ -241,7 +241,6 @@ fn test_referee_smoke() { debug!("their move result {their_move_result:?}"); if let Err(Error::StrErr(s)) = their_move_result { assert!(s.contains("slash")); - assert!(s.contains("off chain")); } else { unreachable!(); } @@ -264,13 +263,20 @@ fn test_referee_smoke() { .my_referee .their_turn_move_off_chain(&mut allocator, &my_move_wire_data.details, 0) .expect("should run"); - if let TheirTurnMoveResult::Move { message, readable_move, .. } = &their_move_result { - assert_eq!(message, b"message data"); - let readable_prog = - Program::from_nodeptr(&mut allocator, *readable_move).expect("should cvt"); - assert_eq!(format!("{:?}", readable_prog), "Program(ff8080)"); - } else { - assert!(false); - } + let (readable_move, message) = match &their_move_result.original { + TheirTurnResult::MakeMove(readable_node, _, message, _) => { + (*readable_node, message.clone()) + } + TheirTurnResult::FinalMove(readable_node, _) => { + (*readable_node, vec![]) + } + _ => { + panic!(); + } + }; + assert_eq!(message, b"message data"); + let readable_prog = + Program::from_nodeptr(&mut allocator, readable_move).expect("should cvt"); + assert_eq!(format!("{:?}", readable_prog), "Program(ff8080)"); assert!(!reftest.my_referee.processing_my_turn()); } diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index 70bbd679..fc412e1f 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -577,6 +577,7 @@ fn test_referee_can_slash_on_chain() { let init_state = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); + let agg_sig_me_additional_data = Hash::from_slice(&AGG_SIG_ME_ADDITIONAL_DATA); let amount = Amount::new(100); let game_start_info = GameStartInfo { @@ -612,9 +613,21 @@ fn test_referee_can_slash_on_chain() { .expect("got coins"); assert!(!coins.is_empty()); let (_, _, amt) = coins[0].to_parts().unwrap(); + + // Timeout applies after this move. It will be their move, with their claim being 0. + // Therefore, the timeout gives _us_ 100. + let readable_move = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); + let readable_my_move = + ReadableMove::from_nodeptr(&mut allocator, readable_move).expect("should work"); + let _my_move_wire_data = reftest + .my_referee + .my_turn_make_move(&mut allocator, &readable_my_move, rng.gen(), 0) + .expect("should move"); + + // We get the outcome puzzle hash for the most recent move to spend to. let spend_to_referee = reftest .my_referee - .on_chain_referee_puzzle(&mut allocator) + .outcome_referee_puzzle(&mut allocator) .expect("should work"); let referee_puzzle_hash = spend_to_referee.sha256tree(&mut allocator); let referee_coins = s @@ -627,22 +640,14 @@ fn test_referee_can_slash_on_chain() { ) .expect("should create referee coin"); - let readable_move = assemble(allocator.allocator(), "(100 . 0)").expect("should assemble"); - let readable_my_move = - ReadableMove::from_nodeptr(&mut allocator, readable_move).expect("should work"); - let _my_move_wire_data = reftest - .my_referee - .my_turn_make_move(&mut allocator, &readable_my_move, rng.gen(), 0) - .expect("should move"); - - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); + assert_eq!(reftest.my_referee.get_our_current_share(), amount); // Farm 20 blocks to get past the time limit. for _ in 0..20 { s.farm_block(&reftest.my_identity.puzzle_hash); } - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); + assert_eq!(reftest.my_referee.get_our_current_share(), amount); let timeout_transaction = reftest .my_referee .get_transaction_for_timeout(&mut allocator, &referee_coins[0]) From cfc7ab21c579613807affc6b816912abfb39c90e Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 22 Dec 2024 02:02:01 -0800 Subject: [PATCH 24/50] fmt --- src/channel_handler/game_handler.rs | 14 +- src/channel_handler/mod.rs | 30 ++-- src/peer_container.rs | 3 +- src/potato_handler.rs | 26 +-- src/referee.rs | 54 +++--- src/tests/game_handler.rs | 4 +- src/tests/peer/potato_handler.rs | 3 +- src/tests/peer/potato_handler_sim.rs | 259 +++++++++++++-------------- src/tests/referee.rs | 7 +- 9 files changed, 207 insertions(+), 193 deletions(-) diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 210bcad7..6f26545c 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -356,7 +356,10 @@ impl GameHandler { let driver_node = self.get_their_turn_driver(allocator)?; debug!("call their turn driver: {self:?}"); - debug!("call their turn args {}", disassemble(allocator.allocator(), driver_args, None)); + debug!( + "call their turn args {}", + disassemble(allocator.allocator(), driver_args, None) + ); let run_result = run_code( allocator, @@ -397,7 +400,10 @@ impl GameHandler { "final move with data {}", disassemble(allocator.allocator(), pl[1], None) ); - Ok(TheirTurnResult::FinalMove(pl[1], inputs.new_move.basic.mover_share.clone())) + Ok(TheirTurnResult::FinalMove( + pl[1], + inputs.new_move.basic.mover_share.clone(), + )) } else { let message_data = if pl.len() == 4 { allocator.allocator().atom(pl[3]).to_vec() @@ -418,9 +424,7 @@ impl GameHandler { disassemble(allocator.allocator(), run_result, None) ))); } - Ok(TheirTurnResult::Slash( - Evidence::from_nodeptr(pl[1]), - )) + Ok(TheirTurnResult::Slash(Evidence::from_nodeptr(pl[1]))) } else { Err(Error::StrErr("unknown move result type".to_string())) } diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index c3108ba6..765aa9b9 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -15,6 +15,7 @@ use rand::prelude::*; use clvm_traits::ToClvm; use clvmr::allocator::NodePtr; +use crate::channel_handler::game_handler::TheirTurnResult; use crate::channel_handler::types::{ CachedPotatoRegenerateLastHop, ChannelCoin, ChannelCoinInfo, ChannelCoinSpendInfo, ChannelCoinSpentResult, ChannelHandlerEnv, ChannelHandlerInitiationData, @@ -24,12 +25,13 @@ use crate::channel_handler::types::{ MoveResult, OnChainGameCoin, OnChainGameState, PotatoAcceptCachedData, PotatoMoveCachedData, PotatoSignatures, ReadableMove, UnrollCoin, UnrollCoinConditionInputs, UnrollTarget, }; -use crate::channel_handler::game_handler::TheirTurnResult; use crate::common::constants::{CREATE_COIN, DEFAULT_HIDDEN_PUZZLE_HASH}; use crate::common::standard_coin::{ - private_to_public_key, puzzle_for_pk, puzzle_for_synthetic_public_key, puzzle_hash_for_pk, - puzzle_hash_for_synthetic_public_key, sign_agg_sig_me, standard_solution_partial, standard_solution_unsafe, calculate_synthetic_secret_key, calculate_synthetic_public_key, ChiaIdentity, + calculate_synthetic_public_key, calculate_synthetic_secret_key, private_to_public_key, + puzzle_for_pk, puzzle_for_synthetic_public_key, puzzle_hash_for_pk, + puzzle_hash_for_synthetic_public_key, sign_agg_sig_me, standard_solution_partial, + standard_solution_unsafe, ChiaIdentity, }; use crate::common::types::{ usize_from_atom, Aggsig, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinID, CoinSpend, @@ -163,7 +165,7 @@ impl ChannelHandler { pub fn get_reward_puzzle_hash( &self, - env: &mut ChannelHandlerEnv + env: &mut ChannelHandlerEnv, ) -> Result { let referee_pk = private_to_public_key(&self.referee_private_key()); puzzle_hash_for_pk(env.allocator, &referee_pk) @@ -884,7 +886,9 @@ impl ChannelHandler { (readable_move, message.clone(), mover_share.clone()) } TheirTurnResult::Slash(_) => { - return Err(Error::StrErr("slash when off chain: go on chain".to_string())); + return Err(Error::StrErr( + "slash when off chain: go on chain".to_string(), + )); } }; @@ -1832,7 +1836,10 @@ impl ChannelHandler { let mut coins_with_solutions = Vec::default(); let default_hidden_puzzle_hash = Hash::from_bytes(DEFAULT_HIDDEN_PUZZLE_HASH); - let synthetic_referee_private_key = calculate_synthetic_secret_key(&self.private_keys.my_referee_private_key, &default_hidden_puzzle_hash)?; + let synthetic_referee_private_key = calculate_synthetic_secret_key( + &self.private_keys.my_referee_private_key, + &default_hidden_puzzle_hash, + )?; let my_referee_public_key = private_to_public_key(&self.private_keys.my_referee_private_key); let synthetic_referee_public_key = calculate_synthetic_public_key( @@ -1845,8 +1852,11 @@ impl ChannelHandler { let parent_id = coin.coin_string.to_coin_id(); let conditions = if i == 0 { ( - (CREATE_COIN, (target_puzzle_hash.clone(), (total_amount.clone(), ()))), - () + ( + CREATE_COIN, + (target_puzzle_hash.clone(), (total_amount.clone(), ())), + ), + (), ) .to_clvm(env.allocator) .into_gen()? @@ -1861,7 +1871,7 @@ impl ChannelHandler { conditions, &my_referee_public_key, &env.agg_sig_me_additional_data, - false + false, )?; let standard_solution = @@ -1872,7 +1882,7 @@ impl ChannelHandler { puzzle: puzzle.clone(), solution: spend.solution.clone(), signature: spend.signature.clone(), - } + }, }); } diff --git a/src/peer_container.rs b/src/peer_container.rs index 1f853b7c..b3eeec75 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -413,7 +413,8 @@ impl ToLocalUI for SynchronousGameCradleState { readable: ReadableMove, my_share: Amount, ) -> Result<(), Error> { - self.opponent_moves.push_back((id.clone(), readable, my_share)); + self.opponent_moves + .push_back((id.clone(), readable, my_share)); Ok(()) } fn raw_game_message(&mut self, id: &GameID, readable: &[u8]) -> Result<(), Error> { diff --git a/src/potato_handler.rs b/src/potato_handler.rs index f174e1a5..063f7256 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -646,7 +646,6 @@ impl PotatoHandler { player_ch.spend_reward_coins(env, coin_string, target) } - pub fn start<'a, G, R: Rng + 'a>( &mut self, penv: &'a mut dyn PeerEnv<'a, G, R>, @@ -761,7 +760,12 @@ impl PotatoHandler { let (env, system_interface) = penv.env(); let opponent_readable = ReadableMove::from_nodeptr(env.allocator, readable_move)?; - system_interface.opponent_moved(env.allocator, &game_id, opponent_readable, mover_share)?; + system_interface.opponent_moved( + env.allocator, + &game_id, + opponent_readable, + mover_share, + )?; if !message.is_empty() { system_interface.send_message(&PeerMessage::Message(game_id, message))?; } @@ -1918,8 +1922,7 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - let initial_potato = - { + let initial_potato = { let player_ch = self.channel_handler()?; player_ch.is_initial_potato() }; @@ -1948,9 +1951,7 @@ impl PotatoHandler { // Remember that we spent this one. { let player_ch = self.channel_handler()?; - debug!( - "{initial_potato} created puzzle hash for redo {new_ph:?}", - ); + debug!("{initial_potato} created puzzle hash for redo {new_ph:?}",); self.my_game_spends.insert(new_ph.clone()); } let (_env, system_interface) = penv.env(); @@ -1996,7 +1997,8 @@ impl PotatoHandler { if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { if !game_map.is_empty() { debug!("Can't shut down yet, still have games"); - self.game_action_queue.push_front(GameAction::Shutdown(conditions)); + self.game_action_queue + .push_front(GameAction::Shutdown(conditions)); return Ok(()); } } @@ -2452,8 +2454,12 @@ impl Result, Error> { let our_move = self.is_my_turn(); - let my_mover_share = - if our_move { - targs.game_move.basic.mover_share.clone() - } else { - self.fixed.amount.clone() - targs.game_move.basic.mover_share.clone() - }; + let my_mover_share = if our_move { + targs.game_move.basic.mover_share.clone() + } else { + self.fixed.amount.clone() - targs.game_move.basic.mover_share.clone() + }; if always_produce_transaction || my_mover_share != Amount::default() { let signature = args.get_signature().unwrap_or_default(); @@ -1218,15 +1217,21 @@ impl RefereeMaker { coin_string: &CoinString, ) -> Result, Error> { debug!("get_transaction_for_timeout turn {}", self.is_my_turn()); - debug!("mover share at start of action {:?}", self.args_for_this_coin().game_move.basic.mover_share); - debug!("mover share at end of action {:?}", self.spend_this_coin().game_move.basic.mover_share); + debug!( + "mover share at start of action {:?}", + self.args_for_this_coin().game_move.basic.mover_share + ); + debug!( + "mover share at end of action {:?}", + self.spend_this_coin().game_move.basic.mover_share + ); let targs = self.spend_this_coin(); let puzzle = curry_referee_puzzle( allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, - &targs + &targs, )?; self.get_transaction( @@ -1903,21 +1908,22 @@ impl RefereeMaker { curry_referee_puzzle_hash(allocator, &self.fixed.referee_coin_puzzle_hash, &args)?; debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); - let check_and_report_slash = |allocator: &mut AllocEncoder, readable_move: NodePtr, mover_share: Amount| { - if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { - Ok(result) - } else { - Ok(TheirTurnCoinSpentResult::Moved { - new_coin_string: CoinString::from_parts( - &coin_string.to_coin_id(), - &new_puzzle_hash, - &self.fixed.amount, - ), - readable: ReadableMove::from_nodeptr(allocator, readable_move)?, - mover_share: args.game_move.basic.mover_share.clone(), - }) - } - }; + let check_and_report_slash = + |allocator: &mut AllocEncoder, readable_move: NodePtr, mover_share: Amount| { + if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { + Ok(result) + } else { + Ok(TheirTurnCoinSpentResult::Moved { + new_coin_string: CoinString::from_parts( + &coin_string.to_coin_id(), + &new_puzzle_hash, + &self.fixed.amount, + ), + readable: ReadableMove::from_nodeptr(allocator, readable_move)?, + mover_share: args.game_move.basic.mover_share.clone(), + }) + } + }; debug!("referee move details {details:?}"); let final_result = match result.original { diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index 1698f1f1..dba2ee2a 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -14,9 +14,7 @@ fn test_game_handler_their_move_slash() { let program = assemble( allocator.allocator(), - &format!( - "(c (1 . 2) (c (c (1 . 1337) 1) ()))", - ), + &format!("(c (1 . 2) (c (c (1 . 1337) 1) ()))",), ) .expect("should assemble"); diff --git a/src/tests/peer/potato_handler.rs b/src/tests/peer/potato_handler.rs index 0fc984ed..918b1369 100644 --- a/src/tests/peer/potato_handler.rs +++ b/src/tests/peer/potato_handler.rs @@ -139,7 +139,8 @@ impl ToLocalUI for Pipe { readable: ReadableMove, mover_share: Amount, ) -> Result<(), Error> { - self.opponent_moves.push((id.clone(), readable, mover_share)); + self.opponent_moves + .push((id.clone(), readable, mover_share)); Ok(()) } fn raw_game_message(&mut self, id: &GameID, readable: &[u8]) -> Result<(), Error> { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 0e89dfa7..211d43a0 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -19,8 +19,8 @@ use crate::common::types::{ AllocEncoder, Amount, CoinSpend, CoinString, Error, GameID, IntoErr, PrivateKey, Program, PuzzleHash, Sha256tree, Spend, SpendBundle, Timeout, ToQuotedProgram, }; -use crate::games::poker_collection; use crate::games::calpoker::decode_calpoker_readable; +use crate::games::poker_collection; use crate::peer_container::{ report_coin_changes_to_peer, FullCoinSetAdapter, GameCradle, MessagePeerQueue, MessagePipe, SynchronousGameCradle, SynchronousGameCradleConfig, WatchEntry, WatchReport, @@ -741,27 +741,27 @@ fn run_calpoker_container_with_action_list_with_success_predicate( simulator.farm_block(&identities[1].puzzle_hash); let coins0 = simulator - .get_my_coins(&identities[0].puzzle_hash).into_gen()?; + .get_my_coins(&identities[0].puzzle_hash) + .into_gen()?; let coins1 = simulator - .get_my_coins(&identities[1].puzzle_hash).into_gen()?; + .get_my_coins(&identities[1].puzzle_hash) + .into_gen()?; // Make a 100 coin for each player (and test the deleted and created events). - let (parent_coin_0, _rest_0) = simulator - .transfer_coin_amount( - allocator, - &identities[0], - &identities[0], - &coins0[0], - Amount::new(100), - )?; - let (parent_coin_1, _rest_1) = simulator - .transfer_coin_amount( - allocator, - &identities[1], - &identities[1], - &coins1[0], - Amount::new(100), - )?; + let (parent_coin_0, _rest_0) = simulator.transfer_coin_amount( + allocator, + &identities[0], + &identities[0], + &coins0[0], + Amount::new(100), + )?; + let (parent_coin_1, _rest_1) = simulator.transfer_coin_amount( + allocator, + &identities[1], + &identities[1], + &coins1[0], + Amount::new(100), + )?; simulator.farm_block(&neutral_identity.puzzle_hash); @@ -838,12 +838,11 @@ fn run_calpoker_container_with_action_list_with_success_predicate( allocator, &mut rng, &reward_coins, - &identities[i].puzzle_hash + &identities[i].puzzle_hash, )?; - let included = simulator.push_tx( - allocator, - &spends.coins_with_solutions - ).into_gen()?; + let included = simulator + .push_tx(allocator, &spends.coins_with_solutions) + .into_gen()?; debug!("reward spends: {included:?}"); assert_eq!(included.code, 1); } @@ -854,16 +853,14 @@ fn run_calpoker_container_with_action_list_with_success_predicate( // Turn off the flag to go on chain. local_uis[i].go_on_chain = false; let got_error = local_uis[i].got_error; - cradles[i] - .go_on_chain(allocator, &mut rng, &mut local_uis[i], got_error)?; + cradles[i].go_on_chain(allocator, &mut rng, &mut local_uis[i], got_error)?; } - cradles[i] - .new_block(allocator, &mut rng, current_height, &watch_report)?; + cradles[i].new_block(allocator, &mut rng, current_height, &watch_report)?; loop { - let result = if let Some(result) = cradles[i] - .idle(allocator, &mut rng, &mut local_uis[i])? + let result = if let Some(result) = + cradles[i].idle(allocator, &mut rng, &mut local_uis[i])? { result } else { @@ -875,20 +872,18 @@ fn run_calpoker_container_with_action_list_with_success_predicate( .get_puzzle_and_solution(coin) .expect("should work"); for cradle in cradles.iter_mut() { - cradle - .report_puzzle_and_solution( - allocator, - &mut rng, - coin, - ps_res.as_ref().map(|ps| (&ps.0, &ps.1)), - )?; + cradle.report_puzzle_and_solution( + allocator, + &mut rng, + coin, + ps_res.as_ref().map(|ps| (&ps.0, &ps.1)), + )?; } } for tx in result.outbound_transactions.iter() { debug!("PROCESS TX {tx:?}"); - let included_result = simulator - .push_tx(allocator, &tx.spends).into_gen()?; + let included_result = simulator.push_tx(allocator, &tx.spends).into_gen()?; debug!("included_result {included_result:?}"); assert_eq!(included_result.code, 1); } @@ -916,42 +911,36 @@ fn run_calpoker_container_with_action_list_with_success_predicate( // Start game. handshake_done = true; - game_ids = cradles[0] - .start_games( - allocator, - &mut rng, - true, - &GameStart { - amount: Amount::new(200), - my_contribution: Amount::new(100), - game_type: GameType(b"calpoker".to_vec()), - timeout: Timeout::new(10), - my_turn: true, - parameters: vec![0x80], - }, - )?; - - cradles[1] - .start_games( - allocator, - &mut rng, - false, - &GameStart { - amount: Amount::new(200), - my_contribution: Amount::new(100), - game_type: GameType(b"calpoker".to_vec()), - timeout: Timeout::new(10), - my_turn: false, - parameters: vec![0x80], - }, - )?; + game_ids = cradles[0].start_games( + allocator, + &mut rng, + true, + &GameStart { + amount: Amount::new(200), + my_contribution: Amount::new(100), + game_type: GameType(b"calpoker".to_vec()), + timeout: Timeout::new(10), + my_turn: true, + parameters: vec![0x80], + }, + )?; + + cradles[1].start_games( + allocator, + &mut rng, + false, + &GameStart { + amount: Amount::new(200), + my_contribution: Amount::new(100), + game_type: GameType(b"calpoker".to_vec()), + timeout: Timeout::new(10), + my_turn: false, + parameters: vec![0x80], + }, + )?; can_move = true; - } else if can_move - || local_uis - .iter() - .any(|l| l.opponent_moved) - { + } else if can_move || local_uis.iter().any(|l| l.opponent_moved) { can_move = false; assert!(!game_ids.is_empty()); @@ -964,18 +953,16 @@ fn run_calpoker_container_with_action_list_with_success_predicate( match ga { GameAction::Move(who, readable, _) => { debug!("make move"); - let readable_program = - Program::from_nodeptr(allocator, *readable)?; + let readable_program = Program::from_nodeptr(allocator, *readable)?; let encoded_readable_move = readable_program.bytes(); let entropy = rng.gen(); - cradles[*who] - .make_move( - allocator, - &mut rng, - &game_ids[0], - encoded_readable_move.to_vec(), - entropy, - )?; + cradles[*who].make_move( + allocator, + &mut rng, + &game_ids[0], + encoded_readable_move.to_vec(), + entropy, + )?; } GameAction::GoOnChain(_who) => { debug!("go on chain"); @@ -985,49 +972,43 @@ fn run_calpoker_container_with_action_list_with_success_predicate( // This is a fake move. We give that move to the given target channel // handler as a their move. debug!("make move"); - let readable_program = - Program::from_nodeptr(allocator, *readable)?; + let readable_program = Program::from_nodeptr(allocator, *readable)?; let encoded_readable_move = readable_program.bytes(); let entropy = rng.gen(); // Do like we're sending a real message. - cradles[*who] - .make_move( - allocator, - &mut rng, - &game_ids[0], - encoded_readable_move.to_vec(), - entropy, - )?; - - cradles[*who] - .replace_last_message(|msg_envelope| { - debug!("sabotage envelope = {msg_envelope:?}"); - let (game_id, m) = - if let PeerMessage::Move(game_id, m) = msg_envelope { - (game_id, m) - } else { - todo!(); - }; - - let mut fake_move = m.clone(); - fake_move - .game_move - .basic - .move_made - .append(&mut move_data.clone()); - Ok(PeerMessage::Move(game_id.clone(), fake_move)) - })?; + cradles[*who].make_move( + allocator, + &mut rng, + &game_ids[0], + encoded_readable_move.to_vec(), + entropy, + )?; + + cradles[*who].replace_last_message(|msg_envelope| { + debug!("sabotage envelope = {msg_envelope:?}"); + let (game_id, m) = if let PeerMessage::Move(game_id, m) = msg_envelope { + (game_id, m) + } else { + todo!(); + }; + + let mut fake_move = m.clone(); + fake_move + .game_move + .basic + .move_made + .append(&mut move_data.clone()); + Ok(PeerMessage::Move(game_id.clone(), fake_move)) + })?; } GameAction::Accept(who) | GameAction::Timeout(who) => { debug!("{who} doing ACCEPT"); can_move = true; - cradles[*who] - .accept(allocator, &mut rng, &game_ids[0])?; + cradles[*who].accept(allocator, &mut rng, &game_ids[0])?; } GameAction::Shutdown(who, _) => { can_move = true; - cradles[*who] - .shut_down(allocator, &mut rng)?; + cradles[*who].shut_down(allocator, &mut rng)?; } } } @@ -1044,7 +1025,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( fn run_calpoker_container_with_action_list( allocator: &mut AllocEncoder, - moves: &[GameAction] + moves: &[GameAction], ) -> Result { run_calpoker_container_with_action_list_with_success_predicate(allocator, moves, None) } @@ -1063,7 +1044,8 @@ fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { &mut allocator, &moves, Some(&|cradles| cradles[0].is_on_chain() && cradles[1].is_on_chain()), - ).expect("should finish"); + ) + .expect("should finish"); } #[test] @@ -1081,32 +1063,41 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { } else { panic!("no move 1 to replace"); } - let outcome = run_calpoker_container_with_action_list(&mut allocator, &moves).expect("should finish"); + let outcome = + run_calpoker_container_with_action_list(&mut allocator, &moves).expect("should finish"); let p1_ph = outcome.identities[0].puzzle_hash.clone(); let p2_ph = outcome.identities[1].puzzle_hash.clone(); let p1_coins = outcome.simulator.get_my_coins(&p1_ph).expect("should work"); let p2_coins = outcome.simulator.get_my_coins(&p2_ph).expect("should work"); - let p1_balance: u64 = p1_coins.iter().map(|c| { - c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0) - }).sum(); - let p2_balance: u64 = p2_coins.iter().map(|c| { - c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0) - }).sum(); + let p1_balance: u64 = p1_coins + .iter() + .map(|c| c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0)) + .sum(); + let p2_balance: u64 = p2_coins + .iter() + .map(|c| c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0)) + .sum(); for (pn, lui) in outcome.local_uis.iter().enumerate() { for the_move in lui.opponent_moves.iter() { let the_move_to_node = the_move.1.to_nodeptr(&mut allocator).expect("should work"); - debug!("player {pn} opponent move {the_move:?} {}", disassemble(allocator.allocator(), the_move_to_node, None)); + debug!( + "player {pn} opponent move {the_move:?} {}", + disassemble(allocator.allocator(), the_move_to_node, None) + ); } } let outcome_move = &outcome.local_uis[0].opponent_moves[2]; - let outcome_node = outcome_move.1.to_nodeptr(&mut allocator).expect("should work"); - let decoded_outcome = decode_calpoker_readable( - &mut allocator, - outcome_node, - Amount::new(200), - false - ).expect("should decode"); - debug!("outcome move {}", disassemble(allocator.allocator(), outcome_node, None)); + let outcome_node = outcome_move + .1 + .to_nodeptr(&mut allocator) + .expect("should work"); + let decoded_outcome = + decode_calpoker_readable(&mut allocator, outcome_node, Amount::new(200), false) + .expect("should decode"); + debug!( + "outcome move {}", + disassemble(allocator.allocator(), outcome_node, None) + ); debug!("game outcome {decoded_outcome:?}"); debug!("p1 balance {p1_balance:?} p2 {p2_balance:?}"); if decoded_outcome.win_direction == 1 { diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 9a9c8fbf..8c3039c5 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -267,16 +267,13 @@ fn test_referee_smoke() { TheirTurnResult::MakeMove(readable_node, _, message, _) => { (*readable_node, message.clone()) } - TheirTurnResult::FinalMove(readable_node, _) => { - (*readable_node, vec![]) - } + TheirTurnResult::FinalMove(readable_node, _) => (*readable_node, vec![]), _ => { panic!(); } }; assert_eq!(message, b"message data"); - let readable_prog = - Program::from_nodeptr(&mut allocator, readable_move).expect("should cvt"); + let readable_prog = Program::from_nodeptr(&mut allocator, readable_move).expect("should cvt"); assert_eq!(format!("{:?}", readable_prog), "Program(ff8080)"); assert!(!reftest.my_referee.processing_my_turn()); } From 888c125bceb6fc12b91f07b4e693e2766e92f8f6 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 22 Dec 2024 02:05:38 -0800 Subject: [PATCH 25/50] fmt+clippy --- src/channel_handler/game_handler.rs | 4 ++-- src/channel_handler/mod.rs | 17 ++++------------- src/potato_handler.rs | 6 ++---- src/referee.rs | 6 +++--- src/tests/game_handler.rs | 3 +-- src/tests/peer/potato_handler_sim.rs | 2 +- src/tests/simenv.rs | 1 - 7 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 6f26545c..238ba69b 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -22,8 +22,8 @@ use log::debug; use crate::channel_handler::types::{Evidence, ReadableMove, ValidationInfo, ValidationProgram}; use crate::common::types::{ - atom_from_clvm, chia_dialect, u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, - Error, Hash, IntoErr, Node, Program, + atom_from_clvm, chia_dialect, u64_from_atom, usize_from_atom, AllocEncoder, Amount, Error, + Hash, IntoErr, Node, Program, }; use crate::referee::{GameMoveDetails, GameMoveStateInfo}; diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 765aa9b9..cb1045c0 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -28,15 +28,14 @@ use crate::channel_handler::types::{ use crate::common::constants::{CREATE_COIN, DEFAULT_HIDDEN_PUZZLE_HASH}; use crate::common::standard_coin::{ - calculate_synthetic_public_key, calculate_synthetic_secret_key, private_to_public_key, - puzzle_for_pk, puzzle_for_synthetic_public_key, puzzle_hash_for_pk, - puzzle_hash_for_synthetic_public_key, sign_agg_sig_me, standard_solution_partial, - standard_solution_unsafe, ChiaIdentity, + calculate_synthetic_secret_key, private_to_public_key, puzzle_for_pk, + puzzle_for_synthetic_public_key, puzzle_hash_for_pk, puzzle_hash_for_synthetic_public_key, + standard_solution_partial, ChiaIdentity, }; use crate::common::types::{ usize_from_atom, Aggsig, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinID, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, PrivateKey, Program, PublicKey, Puzzle, - PuzzleHash, Sha256tree, Spend, SpendBundle, SpendRewardResult, Timeout, ToQuotedProgram, + PuzzleHash, Sha256tree, Spend, SpendRewardResult, Timeout, }; use crate::potato_handler::GameAction; use crate::referee::{GameMoveDetails, RefereeMaker, RefereeOnChainTransaction}; @@ -1590,7 +1589,6 @@ impl ChannelHandler { ); let live_game_idx = self.get_game_by_id(game_id)?; - let referee_pk = private_to_public_key(&self.referee_private_key()); let reward_puzzle_hash = self.get_reward_puzzle_hash(env)?; let (ph, amt) = if let Some((ph, amt)) = conditions @@ -1815,7 +1813,6 @@ impl ChannelHandler { let mut exploded_coins = Vec::new(); let referee_pk = private_to_public_key(&self.referee_private_key()); let referee_puzzle_hash = puzzle_hash_for_pk(env.allocator, &referee_pk)?; - let spend_coin_puzzle = puzzle_for_pk(env.allocator, &referee_pk)?; for c in coins.iter() { if let Some((_parent, ph, amount)) = c.to_parts() { @@ -1842,10 +1839,6 @@ impl ChannelHandler { )?; let my_referee_public_key = private_to_public_key(&self.private_keys.my_referee_private_key); - let synthetic_referee_public_key = calculate_synthetic_public_key( - &my_referee_public_key, - &PuzzleHash::from_hash(default_hidden_puzzle_hash.clone()), - ); let puzzle = puzzle_for_pk(env.allocator, &my_referee_public_key)?; for (i, coin) in exploded_coins.iter().enumerate() { @@ -1874,8 +1867,6 @@ impl ChannelHandler { false, )?; - let standard_solution = - standard_solution_unsafe(env.allocator, &self.referee_private_key(), conditions)?; coins_with_solutions.push(CoinSpend { coin: coin.coin_string.clone(), bundle: Spend { diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 063f7256..a780f499 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1950,7 +1950,6 @@ impl PotatoHandler { GameAction::RedoMove(_game_id, coin, new_ph, tx) => { // Remember that we spent this one. { - let player_ch = self.channel_handler()?; debug!("{initial_potato} created puzzle hash for redo {new_ph:?}",); self.my_game_spends.insert(new_ph.clone()); } @@ -1985,7 +1984,6 @@ impl PotatoHandler { "{initial_potato} on chain (my turn {my_turn:?}): accept game coin {current_coin:?}", ); - let (env, system_interface) = penv.env(); if let HandshakeState::OnChain(game_map) = &mut self.handshake_state { if let Some(coin_def) = game_map.get_mut(¤t_coin) { coin_def.accept = true; @@ -2003,9 +2001,9 @@ impl PotatoHandler { } } - let (env, system_interface) = penv.env(); + let (_env, system_interface) = penv.env(); debug!("notify shutdown complete"); - system_interface.shutdown_complete(None); + system_interface.shutdown_complete(None)?; Ok(()) } } diff --git a/src/referee.rs b/src/referee.rs index 46d71148..605f3c3f 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -1554,7 +1554,7 @@ impl RefereeMaker { )); match &result { - TheirTurnResult::FinalMove(readable_move, mover_share) => { + TheirTurnResult::FinalMove(_readable_move, _mover_share) => { self.accept_their_move( allocator, None, @@ -1564,7 +1564,7 @@ impl RefereeMaker { state_number, )?; } - TheirTurnResult::MakeMove(readable_move, handler, message, mover_share) => { + TheirTurnResult::MakeMove(_readable_move, handler, _message, _mover_share) => { // Mover puzzle turns the given solution into coin conditions // that pay the game's amount to us. It checks whether the // originally curried mover puzzle hash is the sha256tree of the @@ -1909,7 +1909,7 @@ impl RefereeMaker { debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); let check_and_report_slash = - |allocator: &mut AllocEncoder, readable_move: NodePtr, mover_share: Amount| { + |allocator: &mut AllocEncoder, readable_move: NodePtr, _mover_share: Amount| { if let Some(result) = self.check_their_turn_for_slash(allocator, coin_string)? { Ok(result) } else { diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index dba2ee2a..fc685459 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -1,11 +1,10 @@ use clvm_tools_rs::classic::clvm_tools::binutils::{assemble, disassemble}; -use clvm_traits::ToClvm; use std::rc::Rc; use crate::channel_handler::game_handler::GameHandler; use crate::channel_handler::game_handler::{MyTurnInputs, TheirTurnInputs, TheirTurnResult}; use crate::channel_handler::types::ReadableMove; -use crate::common::types::{Aggsig, AllocEncoder, Amount, Hash, Program}; +use crate::common::types::{AllocEncoder, Amount, Hash, Program}; use crate::referee::{GameMoveDetails, GameMoveStateInfo}; #[test] diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 211d43a0..129b182f 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -690,7 +690,6 @@ impl ToLocalUI for LocalTestUIReceiver { } fn shutdown_complete(&mut self, _reward_coin_string: Option<&CoinString>) -> Result<(), Error> { - todo!(); self.shutdown_complete = true; Ok(()) } @@ -706,6 +705,7 @@ type GameRunEarlySuccessPredicate<'a> = Option<&'a dyn Fn(&[SynchronousGameCradl struct CalpokerRunOutcome { identities: [ChiaIdentity; 2], + #[allow(dead_code)] cradles: [SynchronousGameCradle; 2], local_uis: [LocalTestUIReceiver; 2], simulator: Simulator, diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index fc412e1f..2a97e682 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -577,7 +577,6 @@ fn test_referee_can_slash_on_chain() { let init_state = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); - let agg_sig_me_additional_data = Hash::from_slice(&AGG_SIG_ME_ADDITIONAL_DATA); let amount = Amount::new(100); let game_start_info = GameStartInfo { From cdfa88936ca0fa0e6b9208935c98e9dc7f9c21a6 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 22 Dec 2024 02:08:23 -0800 Subject: [PATCH 26/50] fmt+clippy --- src/potato_handler.rs | 2 +- src/referee.rs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index a780f499..2b4ea523 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -2652,7 +2652,7 @@ impl { let slash_spend = self.make_slash_spend(allocator)?; let full_slash_solution = self.make_full_slash_solution(allocator)?; @@ -1946,8 +1946,6 @@ impl RefereeMaker { TheirTurnResult::MakeMove(readable_move, _, _, _) => { check_and_report_slash(allocator, readable_move, mover_share) } - }; - - final_result + } } } From 607f932a79e08327d4247026a3c338a825e1b3a5 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 22 Dec 2024 02:11:00 -0800 Subject: [PATCH 27/50] fmt+clippy --- src/referee.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/referee.rs b/src/referee.rs index bd5b6028..dd130d2c 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -1930,7 +1930,7 @@ impl RefereeMaker { TheirTurnResult::Slash(evidence) => { let slash_spend = self.make_slash_spend(allocator)?; let full_slash_solution = self.make_full_slash_solution(allocator)?; - return self.make_slash_for_their_turn( + self.make_slash_for_their_turn( allocator, coin_string, &new_puzzle, @@ -1938,7 +1938,7 @@ impl RefereeMaker { full_slash_solution, evidence, &slash_spend.signature, - ); + ) } TheirTurnResult::FinalMove(readable_move, mover_share) => { check_and_report_slash(allocator, readable_move, mover_share) From c0df0213254db8625651b91944a34a7d3153f598 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 22 Dec 2024 09:38:21 -0800 Subject: [PATCH 28/50] Fix wasm --- wasm/src/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wasm/src/mod.rs b/wasm/src/mod.rs index cdf61ffd..74d078a2 100644 --- a/wasm/src/mod.rs +++ b/wasm/src/mod.rs @@ -440,7 +440,7 @@ impl ToLocalUI for JsLocalUI { }) } - fn opponent_moved(&mut self, _allocator: &mut AllocEncoder, game_id: &GameID, readable_move: ReadableMove) -> Result<(), chia_gaming::common::types::Error> { + fn opponent_moved(&mut self, _allocator: &mut AllocEncoder, game_id: &GameID, readable_move: ReadableMove, _amount: Amount) -> Result<(), chia_gaming::common::types::Error> { call_javascript_from_collection(&self.callbacks, "opponent_moved", |args_array| { args_array.set(0, JsValue::from_str(&game_id_to_string(game_id))); args_array.set(1, JsValue::from_str(&readable_move.to_program().to_hex())); From f42f79a3a52e6fc4cef68812457a168dd91f341d Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 12:15:05 -0800 Subject: [PATCH 29/50] wip --- src/channel_handler/mod.rs | 104 ++++++++++++++++++--------- src/common/standard_coin.rs | 20 +++--- src/lib.rs | 1 + src/peer_container.rs | 7 +- src/potato_handler.rs | 40 +++++++++-- src/referee.rs | 66 ++++++----------- src/tests/calpoker.rs | 17 ++--- src/tests/game.rs | 26 +++++-- src/tests/peer/potato_handler_sim.rs | 67 +++++++++++++++-- src/tests/simenv.rs | 15 ++-- 10 files changed, 245 insertions(+), 118 deletions(-) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index cb1045c0..84d8acaf 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -162,6 +162,14 @@ impl ChannelHandler { self.live_games.is_empty() } + pub fn get_our_current_share(&self) -> Amount { + self.my_out_of_game_balance.clone() + } + + pub fn get_their_current_share(&self) -> Amount { + self.their_out_of_game_balance.clone() + } + pub fn get_reward_puzzle_hash( &self, env: &mut ChannelHandlerEnv, @@ -170,6 +178,10 @@ impl ChannelHandler { puzzle_hash_for_pk(env.allocator, &referee_pk) } + pub fn get_opponent_reward_puzzle_hash(&self) -> PuzzleHash { + self.their_referee_puzzle_hash.clone() + } + pub fn get_finished_unroll_coin(&self) -> &ChannelHandlerUnrollSpendInfo { if let Some(t) = self.timeout.as_ref() { t @@ -193,8 +205,8 @@ impl ChannelHandler { fn unroll_coin_condition_inputs( &self, - my_ending_game_value: Amount, - their_ending_game_value: Amount, + my_balance: Amount, + their_balance: Amount, puzzle_hashes_and_amounts: &[(PuzzleHash, Amount)], ) -> UnrollCoinConditionInputs { let my_referee_public_key = @@ -202,11 +214,8 @@ impl ChannelHandler { UnrollCoinConditionInputs { ref_pubkey: my_referee_public_key, their_referee_puzzle_hash: self.their_referee_puzzle_hash.clone(), - my_balance: self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone() - + my_ending_game_value, - their_balance: self.their_out_of_game_balance.clone() - - self.their_allocated_balance.clone() - + their_ending_game_value, + my_balance, + their_balance, puzzle_hashes_and_amounts: puzzle_hashes_and_amounts.to_vec(), } } @@ -360,7 +369,11 @@ impl ChannelHandler { // We need a spend of the channel coin to sign. // The seq number is zero. // There are no game coins and a balance for both sides. - let inputs = myself.unroll_coin_condition_inputs(Amount::default(), Amount::default(), &[]); + let inputs = myself.unroll_coin_condition_inputs( + myself.my_out_of_game_balance.clone() - myself.my_allocated_balance.clone(), + myself.their_out_of_game_balance.clone() - myself.their_allocated_balance.clone(), + &[] + ); myself.unroll.coin.update( env, &myself.private_keys.my_unroll_coin_private_key, @@ -488,8 +501,8 @@ impl ChannelHandler { self.compute_unroll_data_for_games(&[], None, &self.live_games)?; let unroll_inputs = self.unroll_coin_condition_inputs( - Amount::default(), - Amount::default(), + self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone(), + self.their_out_of_game_balance.clone() - self.their_allocated_balance.clone(), &new_game_coins_on_chain, ); @@ -620,7 +633,11 @@ impl ChannelHandler { let spend = self.received_potato_verify_signatures( env, signatures, - &self.unroll_coin_condition_inputs(Amount::default(), Amount::default(), &unroll_data), + &self.unroll_coin_condition_inputs( + self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone(), + self.their_out_of_game_balance.clone() - self.their_allocated_balance.clone(), + &unroll_data + ), )?; Ok(ChannelCoinSpendInfo { @@ -762,8 +779,8 @@ impl ChannelHandler { env, signatures, &self.unroll_coin_condition_inputs( - Amount::default(), - Amount::default(), + self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone(), + self.their_out_of_game_balance.clone() - self.their_allocated_balance.clone(), &unroll_data_for_all_games, ), )?; @@ -876,6 +893,11 @@ impl ChannelHandler { "{} their_move_result {their_move_result:?}", self.unroll.coin.started_with_potato ); + debug!( + "{} my share after their move {:?}", + self.unroll.coin.started_with_potato, + self.live_games[game_idx].get_our_current_share() + ); let (readable_move, message, mover_share) = match their_move_result.original { TheirTurnResult::FinalMove(readable_move, mover_share) => { @@ -896,7 +918,11 @@ impl ChannelHandler { let spend = self.received_potato_verify_signatures( env, &move_result.signatures, - &self.unroll_coin_condition_inputs(Amount::default(), Amount::default(), &unroll_data), + &self.unroll_coin_condition_inputs( + self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone(), + self.their_out_of_game_balance.clone() - self.their_allocated_balance.clone(), + &unroll_data + ), )?; // Needs to know their puzzle_hash_for_unroll so we can keep it to do @@ -936,7 +962,7 @@ impl ChannelHandler { game_id: &GameID, ) -> Result<(PotatoSignatures, Amount), Error> { assert!(self.have_potato); - debug!("SEND_POTATO_ACCEPT"); + debug!("{} SEND_POTATO_ACCEPT", self.is_initial_potato()); let game_idx = self.get_game_by_id(game_id)?; // referee maker is removed and will be destroyed when we leave this @@ -948,6 +974,13 @@ impl ChannelHandler { let amount = live_game.get_our_current_share(); let at_stake = live_game.get_amount(); + self.my_out_of_game_balance -= live_game.my_contribution.clone(); + self.my_out_of_game_balance += amount.clone(); + self.their_out_of_game_balance -= live_game.their_contribution.clone(); + self.their_out_of_game_balance += at_stake.clone() - amount.clone(); + + debug!("accept: my_allocated {:?} their_allocated {:?} my_balance {:?} their_balance {:?}", self.my_allocated_balance, self.their_allocated_balance, self.my_out_of_game_balance, self.their_out_of_game_balance); + self.update_cache_for_potato_send(if amount == Amount::default() { None } else { @@ -974,7 +1007,7 @@ impl ChannelHandler { game_id: &GameID, ) -> Result { assert!(!self.have_potato); - debug!("RECEIVED_POTATO_ACCEPT"); + debug!("{} RECEIVED_POTATO_ACCEPT", self.is_initial_potato()); let game_idx = self.get_game_by_id(game_id)?; let unroll_data = self.compute_unroll_data_for_games( // Skip the removed game. @@ -983,30 +1016,31 @@ impl ChannelHandler { &self.live_games, )?; - let game_amount_for_me = self - .live_games - .iter() - .find(|l| &l.game_id == game_id) - .map(|l| l.my_contribution.clone()) - .unwrap_or_default(); - let game_amount_for_them = self - .live_games - .iter() - .find(|l| &l.game_id == game_id) - .map(|l| l.their_contribution.clone()) - .unwrap_or_default(); + let game_amount_for_me = self.live_games[game_idx].get_our_current_share(); + let game_amount_for_them = self.live_games[game_idx].get_amount() - self.live_games[game_idx].get_our_current_share(); + + debug!("received potato accept, my share {game_amount_for_me:?}"); + let new_my_allocated = self.my_allocated_balance.clone() - self.live_games[game_idx].my_contribution.clone(); + let new_their_allocated = self.their_allocated_balance.clone() - self.live_games[game_idx].their_contribution.clone(); + let my_balance = self.my_out_of_game_balance.clone() - self.live_games[game_idx].my_contribution.clone() + game_amount_for_me; + let their_balance = self.their_out_of_game_balance.clone() - self.live_games[game_idx].their_contribution.clone() + game_amount_for_them; + + debug!("accept: my_allocated {:?} their_allocated {:?} my_balance {:?} their_balance {:?}", new_my_allocated, new_their_allocated, my_balance, their_balance); let unroll_condition_inputs = self.unroll_coin_condition_inputs( - game_amount_for_me, - game_amount_for_them, + my_balance.clone(), + their_balance.clone(), &unroll_data, ); let spend = self.received_potato_verify_signatures(env, signatures, &unroll_condition_inputs)?; let live_game = self.live_games.remove(game_idx); - self.my_allocated_balance -= live_game.my_contribution.clone(); - self.their_allocated_balance -= live_game.their_contribution.clone(); + self.my_allocated_balance = new_my_allocated; + self.their_allocated_balance = new_their_allocated; + + self.my_out_of_game_balance = my_balance; + self.their_out_of_game_balance = their_balance; Ok(ChannelCoinSpendInfo { aggsig: spend.signature, @@ -1039,12 +1073,13 @@ impl ChannelHandler { env: &mut ChannelHandlerEnv, conditions: NodePtr, ) -> Result { - debug!("SEND_POTATO_CLEAN_SHUTDOWN"); + debug!("{} SEND_POTATO_CLEAN_SHUTDOWN", self.is_initial_potato()); assert!(self.have_potato); let aggregate_public_key = self.get_aggregate_channel_public_key(); let spend = self.state_channel_coin(); let conditions_program = Program::from_nodeptr(env.allocator, conditions)?; + debug!("conditions {conditions_program:?}"); let channel_coin_spend = spend.get_solution_and_signature_from_conditions( env, &self.private_keys.my_channel_coin_private_key, @@ -1070,9 +1105,10 @@ impl ChannelHandler { their_channel_half_signature: &Aggsig, conditions: NodePtr, ) -> Result { - debug!("RECEIVED_POTATO_CLEAN_SHUTDOWN"); + debug!("{} RECEIVED_POTATO_CLEAN_SHUTDOWN", self.is_initial_potato()); assert!(!self.have_potato); let conditions_program = Program::from_nodeptr(env.allocator, conditions)?; + debug!("conditions {conditions_program:?}"); let channel_spend = self.verify_channel_coin_from_peer_signatures( env, their_channel_half_signature, diff --git a/src/common/standard_coin.rs b/src/common/standard_coin.rs index 1a545254..ab0f9f4d 100644 --- a/src/common/standard_coin.rs +++ b/src/common/standard_coin.rs @@ -472,18 +472,22 @@ pub fn standard_solution_partial( // so in this case we can front load the conditions without running the puzzle. // Ensure we unborrow allocator before the code below. let conds = CoinCondition::from_nodeptr(allocator, conditions); + let mut one_create = false; for cond in conds.iter() { match cond { CoinCondition::CreateCoin(_, _) => { debug!("adding signature based on create coin: {aggregate_public_key:?} {coin_agg_sig_me_message:?}"); - add_signature( - &mut aggregated_signature, - if partial { - partial_signer(private_key, aggregate_public_key, &coin_agg_sig_me_message) - } else { - private_key.sign(&coin_agg_sig_me_message) - }, - ); + if !one_create { + one_create = true; + add_signature( + &mut aggregated_signature, + if partial { + partial_signer(private_key, aggregate_public_key, &coin_agg_sig_me_message) + } else { + private_key.sign(&coin_agg_sig_me_message) + }, + ); + } } CoinCondition::AggSigMe(pubkey, data) => { let mut message = pubkey.bytes().to_vec(); diff --git a/src/lib.rs b/src/lib.rs index c82af86c..f1d2da78 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,7 @@ pub mod log; pub mod peer_container; pub mod potato_handler; mod referee; +pub mod shutdown; #[cfg(any(feature = "sim-tests", feature = "simulator"))] pub mod simulator; diff --git a/src/peer_container.rs b/src/peer_container.rs index b3eeec75..5fcd8088 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -21,6 +21,7 @@ use crate::potato_handler::{ PeerEnv, PeerMessage, PotatoHandler, PotatoHandlerInit, SpendWalletReceiver, ToLocalUI, WalletSpendInterface, }; +use crate::shutdown::ShutdownConditions; #[derive(Default)] pub struct MessagePipe { @@ -197,7 +198,7 @@ pub trait GameCradle { /// Signal shutdown. Forwards to FromLocalUI::shut_down. /// Perhaps we should consider reporting the reward coins. - fn shut_down(&mut self, allocator: &mut AllocEncoder, rng: &mut R) + fn shut_down(&mut self, allocator: &mut AllocEncoder, rng: &mut R, conditions: Rc) -> Result<(), Error>; /// Tell the game cradle that a new block arrived, giving a watch report. @@ -808,15 +809,15 @@ impl GameCradle for SynchronousGameCradle { &mut self, allocator: &mut AllocEncoder, rng: &mut R, + conditions: Rc, ) -> Result<(), Error> { // The conditions relate to spending the remaining money in the channel coin. - let nil = allocator.encode_atom(&[]).into_gen()?; let mut env = channel_handler_env(allocator, rng); let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, }; - self.peer.shut_down(&mut penv, nil)?; + self.peer.shut_down(&mut penv, conditions)?; Ok(()) } diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 2b4ea523..01d93d13 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1,3 +1,4 @@ +use std::borrow::Borrow; use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::mem::swap; use std::rc::Rc; @@ -27,6 +28,7 @@ use crate::common::types::{ Sha256tree, Spend, SpendBundle, SpendRewardResult, Timeout, }; use crate::referee::{RefereeOnChainTransaction, TheirTurnCoinSpentResult}; +use crate::shutdown::{get_conditions_with_channel_handler, ShutdownConditions}; use clvm_tools_rs::classic::clvm::sexp::proper_list; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] @@ -318,7 +320,7 @@ pub trait FromLocalUI< fn shut_down<'a>( &mut self, penv: &mut dyn PeerEnv<'a, G, R>, - condition: NodePtr, + condition: Rc, ) -> Result<(), Error> where G: 'a, @@ -420,7 +422,6 @@ enum PotatoState { Present, } -#[derive(Debug)] pub enum GameAction { Move(GameID, ReadableMove, Hash), RedoMove( @@ -430,7 +431,18 @@ pub enum GameAction { Box, ), Accept(GameID), - Shutdown(NodePtr), + Shutdown(Rc), +} + +impl std::fmt::Debug for GameAction { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + match self { + GameAction::Move(gi,rm,h) => write!(formatter, "Move({gi:?},{rm:?},{h:?})"), + GameAction::RedoMove(gi,cs,ph,rt) => write!(formatter, "RedoMove({gi:?},{cs:?},{ph:?},{rt:?})"), + GameAction::Accept(gi) => write!(formatter, "Accept({gi:?})"), + GameAction::Shutdown(_) => write!(formatter, "Shutdown(..)"), + } + } } pub struct PotatoHandlerInit { @@ -1030,10 +1042,19 @@ impl PotatoHandler { } Some(GameAction::Shutdown(conditions)) => { let timeout = self.channel_timeout.clone(); + let real_conditions = { + let ch = self.channel_handler_mut()?; + let (env, _) = penv.env(); + get_conditions_with_channel_handler( + env, + ch, + conditions.borrow(), + )? + }; let (state_channel_coin, spend, want_puzzle_hash, want_amount) = { let ch = self.channel_handler_mut()?; let (env, _) = penv.env(); - let spend = ch.send_potato_clean_shutdown(env, conditions)?; + let spend = ch.send_potato_clean_shutdown(env, real_conditions)?; // conditions must have a reward coin targeted at our referee_public_key. // this is how we'll know we're being paid. @@ -1060,7 +1081,7 @@ impl PotatoHandler { HandshakeState::WaitingForShutdown(my_reward, state_channel_coin.clone()); // If the state channel coin is spent, then we signal full shutdown. - let shutdown_condition_program = Program::from_nodeptr(env.allocator, conditions)?; + let shutdown_condition_program = Program::from_nodeptr(env.allocator, real_conditions)?; system_interface.send_message(&PeerMessage::Shutdown( spend.signature.clone(), shutdown_condition_program, @@ -2443,7 +2464,7 @@ impl( &mut self, penv: &mut dyn PeerEnv<'a, G, R>, - conditions: NodePtr, + conditions: Rc, ) -> Result<(), Error> where G: 'a, @@ -2451,6 +2472,12 @@ impl Amount { - let args = self.args_for_this_coin(); + let args = self.spend_this_coin(); if self.processing_my_turn() { args.game_move.basic.mover_share.clone() } else { @@ -1544,56 +1544,36 @@ impl RefereeMaker { }, )?; + let (handler, mover_share) = + match &result { + TheirTurnResult::FinalMove(_readable_move, mover_share) => (None, mover_share.clone()), + TheirTurnResult::MakeMove(_, handler, _, mover_share) => (Some(handler.clone()), mover_share.clone()), + // Slash can't be used when we're off chain. + TheirTurnResult::Slash(_evidence) => { + return Ok(TheirTurnMoveResult { + puzzle_hash_for_unroll: None, + original: result.clone(), + }) + } + }; + let puzzle_args = Rc::new(RefereePuzzleArgs::new( &self.fixed, &details.basic, Some(&args.game_move.validation_info_hash), &details.validation_info_hash, - None, + Some(&mover_share), true, )); - match &result { - TheirTurnResult::FinalMove(_readable_move, _mover_share) => { - self.accept_their_move( - allocator, - None, - args.clone(), - puzzle_args.clone(), - details, - state_number, - )?; - } - TheirTurnResult::MakeMove(_readable_move, handler, _message, _mover_share) => { - // Mover puzzle turns the given solution into coin conditions - // that pay the game's amount to us. It checks whether the - // originally curried mover puzzle hash is the sha256tree of the - // mover puzzle. - // - // This referee expects the mover puzzle to be a standard-like - // puzzle or at least take standard coin arguments including the - // list of conditions it produces itself. - // - // In case this succeeds, we'll direct the result to our mover - // puzzle, which sets our identity for the game and is a value- - // holding coin spendable by us. - self.accept_their_move( - allocator, - Some(handler.clone()), - args.clone(), - puzzle_args.clone(), - details, - state_number, - )?; - } - // Slash can't be used when we're off chain. - TheirTurnResult::Slash(_evidence) => { - return Ok(TheirTurnMoveResult { - puzzle_hash_for_unroll: None, - original: result.clone(), - }) - } - }; + self.accept_their_move( + allocator, + handler, + args.clone(), + puzzle_args.clone(), + details, + state_number, + )?; let puzzle_hash_for_unroll = curry_referee_puzzle_hash( allocator, diff --git a/src/tests/calpoker.rs b/src/tests/calpoker.rs index b13a580c..8ea14348 100644 --- a/src/tests/calpoker.rs +++ b/src/tests/calpoker.rs @@ -1,10 +1,15 @@ #[cfg(feature = "sim-tests")] +use std::rc::Rc; +#[cfg(feature = "sim-tests")] use log::debug; #[cfg(feature = "sim-tests")] use rand::prelude::*; #[cfg(feature = "sim-tests")] use rand_chacha::ChaCha8Rng; +#[cfg(feature = "sim-tests")] +use clvmr::allocator::NodePtr; + use clvm_traits::{ClvmEncoder, ToClvm}; #[cfg(feature = "sim-tests")] @@ -17,7 +22,7 @@ use crate::common::constants::CREATE_COIN; use crate::common::standard_coin::ChiaIdentity; use crate::common::types::{AllocEncoder, Sha256Input}; #[cfg(feature = "sim-tests")] -use crate::common::types::{Amount, PrivateKey}; +use crate::common::types::{Amount, PrivateKey, PuzzleHash}; #[cfg(feature = "sim-tests")] use crate::common::types::{Error, GameID, Hash}; #[cfg(feature = "sim-tests")] @@ -30,6 +35,8 @@ use crate::games::calpoker::make_cards; use crate::games::calpoker::CalpokerResult; #[cfg(feature = "sim-tests")] use crate::games::calpoker::{CalpokerHandValue, RawCalpokerHandValue}; +#[cfg(feature = "sim-tests")] +use crate::shutdown::BasicShutdownConditions; use crate::tests::game::GameAction; #[cfg(feature = "sim-tests")] use crate::tests::game::GameActionResult; @@ -269,13 +276,7 @@ fn test_play_calpoker_end_game_reward() { let mut moves = test_moves_1(&mut allocator).to_vec(); moves.push(GameAction::Accept(1)); - let win_conditions = [( - CREATE_COIN, - (output_identity.puzzle_hash.clone(), (Amount::new(200), ())), - )] - .to_clvm(&mut allocator) - .unwrap(); - moves.push(GameAction::Shutdown(0, win_conditions)); + moves.push(GameAction::Shutdown(0, Rc::new(BasicShutdownConditions))); debug!("running moves {moves:?}"); let _game_action_results = run_calpoker_play_test(&mut allocator, &moves).expect("should work"); diff --git a/src/tests/game.rs b/src/tests/game.rs index 9ff77df5..c98ce54b 100644 --- a/src/tests/game.rs +++ b/src/tests/game.rs @@ -1,8 +1,12 @@ #[cfg(feature = "sim-tests")] +use std::rc::Rc; +#[cfg(feature = "sim-tests")] use crate::channel_handler::types::ReadableMove; #[cfg(feature = "sim-tests")] use crate::common::types::Hash; use crate::common::types::Timeout; +#[cfg(feature = "sim-tests")] +use crate::shutdown::ShutdownConditions; #[cfg(test)] use clvmr::NodePtr; @@ -29,14 +33,12 @@ use crate::common::standard_coin::{ private_to_public_key, puzzle_hash_for_synthetic_public_key, ChiaIdentity, }; #[cfg(feature = "sim-tests")] -use crate::common::types::Amount; -#[cfg(feature = "sim-tests")] -use crate::common::types::{CoinString, Error, IntoErr}; +use crate::common::types::{Amount, AllocEncoder, CoinString, Error, IntoErr, PuzzleHash}; #[cfg(feature = "sim-tests")] use crate::simulator::Simulator; -#[derive(Debug, Clone)] +#[derive(Clone)] #[cfg(test)] pub enum GameAction { /// Do a timeout @@ -56,9 +58,23 @@ pub enum GameAction { Accept(usize), /// Shut down #[cfg(feature = "sim-tests")] - Shutdown(usize, NodePtr), + Shutdown(usize, Rc), } +impl std::fmt::Debug for GameAction { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + match self { + GameAction::Timeout(t) => write!(formatter, "Timeout({t})"), + GameAction::Move(p,n,r) => write!(formatter, "Move({p},{n:?},{r})"), + GameAction::FakeMove(p,n,v) => write!(formatter, "FakeMove({p},{n:?},{v:?})"), + GameAction::GoOnChain(p) => write!(formatter, "GoOnChain({p})"), + GameAction::Accept(p) => write!(formatter, "Accept({p})"), + GameAction::Shutdown(p,_) => write!(formatter, "Shutdown({p},..)"), + } + } +} + + impl GameAction { #[cfg(feature = "sim-tests")] pub fn lose(&self) -> GameAction { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 129b182f..c3aeb871 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -30,6 +30,7 @@ use crate::potato_handler::{ PeerEnv, PeerMessage, PotatoHandler, PotatoHandlerInit, ToLocalUI, WalletSpendInterface, }; +use crate::shutdown::BasicShutdownConditions; use crate::simulator::Simulator; use crate::tests::calpoker::test_moves_1; use crate::tests::game::GameAction; @@ -807,7 +808,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( while !matches!(ending, Some(0)) { num_steps += 1; - assert!(num_steps < 1000); + assert!(num_steps < 200); simulator.farm_block(&neutral_identity.puzzle_hash); let current_height = simulator.get_current_height(); @@ -1006,9 +1007,9 @@ fn run_calpoker_container_with_action_list_with_success_predicate( can_move = true; cradles[*who].accept(allocator, &mut rng, &game_ids[0])?; } - GameAction::Shutdown(who, _) => { + GameAction::Shutdown(who, conditions) => { can_move = true; - cradles[*who].shut_down(allocator, &mut rng)?; + cradles[*who].shut_down(allocator, &mut rng, conditions.clone())?; } } } @@ -1048,16 +1049,70 @@ fn sim_test_with_peer_container_piss_off_peer_basic_on_chain() { .expect("should finish"); } +#[test] +fn sim_test_with_peer_container_off_chain_complete() { + let mut allocator = AllocEncoder::new(); + + let mut moves = test_moves_1(&mut allocator).to_vec(); + moves.push(GameAction::Accept(0)); + moves.push(GameAction::Shutdown(1, Rc::new(BasicShutdownConditions))); + let outcome = + run_calpoker_container_with_action_list(&mut allocator, &moves).expect("should finish"); + let p1_ph = outcome.identities[0].puzzle_hash.clone(); + let p2_ph = outcome.identities[1].puzzle_hash.clone(); + let p1_coins = outcome.simulator.get_my_coins(&p1_ph).expect("should work"); + let p2_coins = outcome.simulator.get_my_coins(&p2_ph).expect("should work"); + let p1_balance: u64 = p1_coins + .iter() + .map(|c| c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0)) + .sum(); + let p2_balance: u64 = p2_coins + .iter() + .map(|c| c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0)) + .sum(); + for (pn, lui) in outcome.local_uis.iter().enumerate() { + for the_move in lui.opponent_moves.iter() { + let the_move_to_node = the_move.1.to_nodeptr(&mut allocator).expect("should work"); + debug!( + "player {pn} opponent move {the_move:?} {}", + disassemble(allocator.allocator(), the_move_to_node, None) + ); + } + } + let opponent_moves = &outcome.local_uis[0].opponent_moves; + let olen = opponent_moves.len(); + let outcome_move = &opponent_moves[olen - 1]; + let outcome_node = outcome_move + .1 + .to_nodeptr(&mut allocator) + .expect("should work"); + let decoded_outcome = + decode_calpoker_readable(&mut allocator, outcome_node, Amount::new(200), false) + .expect("should decode"); + debug!( + "outcome move {}", + disassemble(allocator.allocator(), outcome_node, None) + ); + debug!("game outcome {decoded_outcome:?}"); + debug!("p1 balance {p1_balance:?} p2 {p2_balance:?}"); + if decoded_outcome.win_direction == 1 { + assert_eq!(p2_balance + 200, p1_balance); + } else if decoded_outcome.win_direction == -1 { + assert_eq!(p2_balance, p1_balance + 200); + } else { + assert_eq!(p2_balance, p1_balance); + } +} + #[test] fn sim_test_with_peer_container_piss_off_peer_complete() { let mut allocator = AllocEncoder::new(); let mut moves = test_moves_1(&mut allocator).to_vec(); - let nil = allocator.encode_atom(&[]).into_gen().expect("should work"); moves.push(GameAction::Accept(0)); moves.push(GameAction::Accept(1)); - moves.push(GameAction::Shutdown(0, nil)); - moves.push(GameAction::Shutdown(1, nil)); + moves.push(GameAction::Shutdown(0, Rc::new(BasicShutdownConditions))); + moves.push(GameAction::Shutdown(1, Rc::new(BasicShutdownConditions))); if let GameAction::Move(player, readable, _) = moves[3].clone() { moves.insert(3, GameAction::FakeMove(player, readable, vec![0; 500])); } else { diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index 2a97e682..f3738cb2 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -1,3 +1,4 @@ +use std::borrow::Borrow; use rand::{Rng, SeedableRng}; use rand_chacha::ChaCha8Rng; @@ -21,6 +22,7 @@ use crate::common::types::{ chia_dialect, AllocEncoder, Amount, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, PrivateKey, PuzzleHash, Sha256tree, Spend, Timeout, }; +use crate::shutdown::get_conditions_with_channel_handler; use crate::simulator::Simulator; use crate::tests::game::{new_channel_handler_game, GameAction, GameActionResult}; use crate::tests::referee::{make_debug_game_handler, RefereeTest}; @@ -395,11 +397,16 @@ impl<'a, R: Rng> SimulatorEnvironment<'a, R> { Ok(GameActionResult::Accepted) } GameAction::Shutdown(player, target_conditions) => { + let real_target_conditions = get_conditions_with_channel_handler( + &mut self.env, + &self.parties.player(*player).ch, + target_conditions.borrow() + )?; let spend = self .parties .player(*player) .ch - .send_potato_clean_shutdown(&mut self.env, *target_conditions)?; + .send_potato_clean_shutdown(&mut self.env, real_target_conditions)?; let full_spend = self .parties @@ -408,7 +415,7 @@ impl<'a, R: Rng> SimulatorEnvironment<'a, R> { .received_potato_clean_shutdown( &mut self.env, &spend.signature, - *target_conditions, + real_target_conditions, )?; // The shutdown gives a spend, which we need to do here. @@ -639,14 +646,14 @@ fn test_referee_can_slash_on_chain() { ) .expect("should create referee coin"); - assert_eq!(reftest.my_referee.get_our_current_share(), amount); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::default()); // Farm 20 blocks to get past the time limit. for _ in 0..20 { s.farm_block(&reftest.my_identity.puzzle_hash); } - assert_eq!(reftest.my_referee.get_our_current_share(), amount); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::default()); let timeout_transaction = reftest .my_referee .get_transaction_for_timeout(&mut allocator, &referee_coins[0]) From 2693d7e755b2e64c7becd7709d54f96a350689d7 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 12:16:11 -0800 Subject: [PATCH 30/50] add --- src/shutdown.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/shutdown.rs diff --git a/src/shutdown.rs b/src/shutdown.rs new file mode 100644 index 00000000..9bdcd244 --- /dev/null +++ b/src/shutdown.rs @@ -0,0 +1,79 @@ +use clvm_traits::ToClvm; +use clvmr::NodePtr; +use log::debug; +use rand::Rng; + +use crate::channel_handler::types::ChannelHandlerEnv; +use crate::channel_handler::ChannelHandler; +use crate::common::constants::CREATE_COIN; +use crate::common::types::{AllocEncoder, Amount, Error, IntoErr, Node, PuzzleHash}; + +pub trait ShutdownConditions { + fn compute( + &self, + allocator: &mut AllocEncoder, + our_reward_ph: &PuzzleHash, + our_share: &Amount, + their_reward_ph: &PuzzleHash, + their_share: &Amount, + ) -> Result; +} + +pub struct BasicShutdownConditions; + +impl ShutdownConditions for BasicShutdownConditions { + fn compute( + &self, + allocator: &mut AllocEncoder, + our_reward_ph: &PuzzleHash, + our_share: &Amount, + their_reward_ph: &PuzzleHash, + their_share: &Amount + ) -> Result { + let mut v = Vec::new(); + if *our_share != Amount::default() { + v.push(Node(( + CREATE_COIN, + (our_reward_ph, (our_share, ())), + ) + .to_clvm(allocator) + .into_gen()? + )); + } + if *their_share != Amount::default() { + v.push(Node(( + CREATE_COIN, + (their_reward_ph, (their_share, ())), + ) + .to_clvm(allocator) + .into_gen()? + )); + } + + debug!("Reward coins:"); + debug!("me {our_share:?} {our_reward_ph:?}"); + debug!("them {their_share:?} {their_reward_ph:?}"); + + // Return the full list. + v.to_clvm(allocator).into_gen() + } +} + +/// Given a channel handler, env and conditions generator, make the conditions. +pub fn get_conditions_with_channel_handler( + env: &mut ChannelHandlerEnv, + ch: &ChannelHandler, + conditions: &dyn ShutdownConditions +) -> Result { + let our_reward_ph = ch.get_reward_puzzle_hash(env)?; + let our_share = ch.get_our_current_share(); + let their_reward_ph = ch.get_opponent_reward_puzzle_hash(); + let their_share = ch.get_their_current_share(); + conditions.compute( + env.allocator, + &our_reward_ph, + &our_share, + &their_reward_ph, + &their_share + ) +} From 8501dacb48235679a537b10c2039358635f21582 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 12:20:34 -0800 Subject: [PATCH 31/50] One more --- src/potato_handler.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 01d93d13..e14447fc 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -393,7 +393,7 @@ enum HandshakeState { Finished(Box), // Going on chain ourselves route. OnChainTransition(CoinString, Box), - OnChainWaitingForUnrollTimeoutOrSpend(CoinString, Box), + OnChainWaitingForUnrollTimeoutOrSpend(CoinString), // Other party went on chain, we're catching up route. OnChainWaitForConditions(CoinString, Box), // Converge here to on chain state. @@ -1583,7 +1583,6 @@ impl PotatoHandler { self.handshake_state = HandshakeState::OnChainWaitingForUnrollTimeoutOrSpend( unroll_coin.clone(), - t, ); let (_, system_interface) = penv.env(); system_interface.register_coin( @@ -1651,7 +1650,7 @@ impl PotatoHandler { assert!(!matches!(self.handshake_state, HandshakeState::StepA)); let is_unroll_coin = match &self.handshake_state { HandshakeState::OnChainWaitingForUnrollSpend(unroll_coin) => coin_id == unroll_coin, - HandshakeState::OnChainWaitingForUnrollTimeoutOrSpend(unroll_coin, _) => { + HandshakeState::OnChainWaitingForUnrollTimeoutOrSpend(unroll_coin) => { coin_id == unroll_coin } _ => false, @@ -2657,7 +2656,7 @@ impl Date: Mon, 23 Dec 2024 12:39:13 -0800 Subject: [PATCH 32/50] separate function to start on chain transition --- src/potato_handler.rs | 67 ++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index e14447fc..24f0274f 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -1664,7 +1664,9 @@ impl PotatoHandler { Ok(false) } - pub fn do_channel_spend_to_unroll<'a, G, R: Rng + 'a>( + // Do work needed to set us up in on chain state waiting for the spend of the channel + // coin as specified. + fn setup_for_on_chain_waiting_for_unroll<'a, G, R: Rng + 'a>( &mut self, penv: &mut dyn PeerEnv<'a, G, R>, spend: Box, @@ -1672,31 +1674,8 @@ impl PotatoHandler { where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { - let (env, system_interface) = penv.env(); - - { - let player_ch = self.channel_handler_mut()?; - player_ch.set_initiated_on_chain(); - } - + let (env, _) = penv.env(); let player_ch = self.channel_handler()?; - debug!("GO ON CHAIN: initiated {}", player_ch.is_initial_potato()); - // Channel coin - let finished_unroll_coin = player_ch.get_finished_unroll_coin(); - - // For debugging: get internal idea of what's signed. - let unroll_puzzle_solution = finished_unroll_coin - .coin - .get_internal_conditions_for_unroll_coin_spend()?; - let unroll_puzzle_solution_hash = Node(unroll_puzzle_solution).sha256tree(env.allocator); - let aggregate_unroll_signature = finished_unroll_coin.coin.get_unroll_coin_signature()? - + finished_unroll_coin - .signatures - .my_unroll_half_signature_peer - .clone(); - - debug!("{} CHANNEL: AGGREGATE UNROLL hash {unroll_puzzle_solution_hash:?} {aggregate_unroll_signature:?}", player_ch.is_initial_potato()); - let run_puzzle = spend.spend.spends[0] .bundle .puzzle @@ -1739,12 +1718,48 @@ impl PotatoHandler { return Err(Error::StrErr("no unroll coin created".to_string())); }; - system_interface.spend_transaction_and_add_fee(&spend.spend)?; self.handshake_state = HandshakeState::OnChainTransition(unroll_result.clone(), spend); Ok(()) } + pub fn do_channel_spend_to_unroll<'a, G, R: Rng + 'a>( + &mut self, + penv: &mut dyn PeerEnv<'a, G, R>, + spend: Box, + ) -> Result<(), Error> + where + G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, + { + let (env, system_interface) = penv.env(); + + { + let player_ch = self.channel_handler_mut()?; + player_ch.set_initiated_on_chain(); + } + + let player_ch = self.channel_handler()?; + debug!("GO ON CHAIN: initiated {}", player_ch.is_initial_potato()); + // Channel coin + let finished_unroll_coin = player_ch.get_finished_unroll_coin(); + + // For debugging: get internal idea of what's signed. + let unroll_puzzle_solution = finished_unroll_coin + .coin + .get_internal_conditions_for_unroll_coin_spend()?; + let unroll_puzzle_solution_hash = Node(unroll_puzzle_solution).sha256tree(env.allocator); + let aggregate_unroll_signature = finished_unroll_coin.coin.get_unroll_coin_signature()? + + finished_unroll_coin + .signatures + .my_unroll_half_signature_peer + .clone(); + + debug!("{} CHANNEL: AGGREGATE UNROLL hash {unroll_puzzle_solution_hash:?} {aggregate_unroll_signature:?}", player_ch.is_initial_potato()); + + system_interface.spend_transaction_and_add_fee(&spend.spend)?; + self.setup_for_on_chain_waiting_for_unroll(penv, spend) + } + pub fn do_unroll_spend_to_games<'a, G, R: Rng + 'a>( &mut self, penv: &mut dyn PeerEnv<'a, G, R>, From ca6c6e67d05e384a9139952848321ae6e247c3bf Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 13:50:16 -0800 Subject: [PATCH 33/50] Can be said to be 'working' for the first time. --- src/potato_handler.rs | 63 +++++++++++++++------------- src/tests/peer/potato_handler_sim.rs | 6 +-- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 24f0274f..68ded32e 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -813,20 +813,22 @@ impl PotatoHandler { let want_public_key = private_to_public_key(&ch.referee_private_key()); let want_puzzle_hash = puzzle_hash_for_pk(env.allocator, &want_public_key)?; let want_amount = ch.clean_shutdown_amount(); - let condition_list = CoinCondition::from_nodeptr(env.allocator, clvm_conditions); - let found_conditions = condition_list.iter().any(|cond| { - if let CoinCondition::CreateCoin(ph, amt) = cond { - *ph == want_puzzle_hash && *amt >= want_amount - } else { - false - } - }); + if want_amount != Amount::default() { + let condition_list = CoinCondition::from_nodeptr(env.allocator, clvm_conditions); + let found_conditions = condition_list.iter().any(|cond| { + if let CoinCondition::CreateCoin(ph, amt) = cond { + *ph == want_puzzle_hash && *amt >= want_amount + } else { + false + } + }); - if !found_conditions { - return Err(Error::StrErr( - "given conditions don't pay our referee puzzle hash what's expected" - .to_string(), - )); + if !found_conditions { + return Err(Error::StrErr( + "given conditions don't pay our referee puzzle hash what's expected" + .to_string(), + )); + } } let my_reward = @@ -842,24 +844,20 @@ impl PotatoHandler { &env.standard_puzzle, &channel_puzzle_public_key, )?; + let spend = Spend { + solution: full_spend.solution.clone(), + puzzle, + signature: full_spend.signature.clone(), + }; system_interface.spend_transaction_and_add_fee(&SpendBundle { - name: Some("Create channel 2".to_string()), + name: Some("Create unroll".to_string()), spends: vec![CoinSpend { coin: coin.clone(), - bundle: Spend { - solution: full_spend.solution.clone(), - puzzle, - signature: full_spend.signature.clone(), - }, + bundle: spend, }], })?; - // Expected reward coin is shutdown amount + puzzle hash of referee - // coin and parent is the reported reward coin. - return Ok(Some(HandshakeState::WaitingForShutdown( - my_reward, - coin.clone(), - ))); + self.handshake_state = HandshakeState::OnChainWaitingForUnrollSpend(coin.clone()); } _ => { todo!("unhandled passthrough message {msg_envelope:?}"); @@ -1077,8 +1075,6 @@ impl PotatoHandler { let (env, system_interface) = penv.env(); system_interface.register_coin(&my_reward, &timeout, Some("reward"))?; - self.handshake_state = - HandshakeState::WaitingForShutdown(my_reward, state_channel_coin.clone()); // If the state channel coin is spent, then we signal full shutdown. let shutdown_condition_program = Program::from_nodeptr(env.allocator, real_conditions)?; @@ -1087,6 +1083,8 @@ impl PotatoHandler { shutdown_condition_program, ))?; + self.handshake_state = HandshakeState::OnChainWaitingForUnrollSpend(state_channel_coin.clone()); + Ok(true) } None => Ok(false), @@ -1607,6 +1605,16 @@ impl PotatoHandler { assert!(!matches!(self.handshake_state, HandshakeState::StepA)); return Ok(true); } + HandshakeState::OnChainWaitingForUnrollSpend(_) => { + debug!( + "{} notified of channel coin spend in waiting for unroll state. this is used to collect rewards in a clean shutdown.", + ch.is_initial_potato() + ); + self.handshake_state = HandshakeState::Completed; + let (_, system_interface) = penv.env(); + system_interface.shutdown_complete(None)?; + return Ok(false); + } x => { self.handshake_state = x; assert!(!matches!(self.handshake_state, HandshakeState::StepA)); @@ -1647,7 +1655,6 @@ impl PotatoHandler { G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, { // Channel coin was spent so we're going on chain. - assert!(!matches!(self.handshake_state, HandshakeState::StepA)); let is_unroll_coin = match &self.handshake_state { HandshakeState::OnChainWaitingForUnrollSpend(unroll_coin) => coin_id == unroll_coin, HandshakeState::OnChainWaitingForUnrollTimeoutOrSpend(unroll_coin) => { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index c3aeb871..c20e3b29 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -829,7 +829,7 @@ fn run_calpoker_container_with_action_list_with_success_predicate( } for i in 0..=1 { - if cradles[i].handshake_finished() { + if cradles[i].handshake_finished() || cradles[i].finished() { let reward_ph = cradles[i].get_reward_puzzle_hash(allocator, &mut rng)?; let reward_coins = simulator.get_my_coins(&reward_ph).into_gen()?; debug!("{i} reward coins {reward_coins:?}"); @@ -1096,9 +1096,9 @@ fn sim_test_with_peer_container_off_chain_complete() { debug!("game outcome {decoded_outcome:?}"); debug!("p1 balance {p1_balance:?} p2 {p2_balance:?}"); if decoded_outcome.win_direction == 1 { - assert_eq!(p2_balance + 200, p1_balance); - } else if decoded_outcome.win_direction == -1 { assert_eq!(p2_balance, p1_balance + 200); + } else if decoded_outcome.win_direction == -1 { + assert_eq!(p2_balance + 200, p1_balance); } else { assert_eq!(p2_balance, p1_balance); } From e761bbb51f3ad8def6e9ecdf0ef2064a86061706 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 13:54:16 -0800 Subject: [PATCH 34/50] lint --- src/channel_handler/mod.rs | 1 - src/peer_container.rs | 2 +- src/potato_handler.rs | 47 ++-------------------------- src/tests/calpoker.rs | 14 +-------- src/tests/game.rs | 2 +- src/tests/peer/potato_handler_sim.rs | 2 +- 6 files changed, 6 insertions(+), 62 deletions(-) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 84d8acaf..05b5ca2f 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -1035,7 +1035,6 @@ impl ChannelHandler { let spend = self.received_potato_verify_signatures(env, signatures, &unroll_condition_inputs)?; - let live_game = self.live_games.remove(game_idx); self.my_allocated_balance = new_my_allocated; self.their_allocated_balance = new_their_allocated; diff --git a/src/peer_container.rs b/src/peer_container.rs index 5fcd8088..fe2e0c37 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -2,7 +2,7 @@ use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::mem::swap; use std::rc::Rc; -use clvm_traits::{ClvmEncoder, ToClvm}; +use clvm_traits::ToClvm; use log::debug; use rand::Rng; diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 68ded32e..b18b145d 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -400,7 +400,6 @@ enum HandshakeState { OnChainWaitingForUnrollSpend(CoinString), OnChainWaitingForUnrollConditions(CoinString), OnChain(HashMap), - WaitingForShutdown(CoinString, CoinString), Completed, } @@ -1573,7 +1572,7 @@ impl PotatoHandler { let mut hs = HandshakeState::StepA; swap(&mut hs, &mut self.handshake_state); match hs { - HandshakeState::OnChainTransition(unroll_coin, t) => { + HandshakeState::OnChainTransition(unroll_coin, _t) => { debug!( "{} notified of channel coin spend in on chain transition state", ch.is_initial_potato() @@ -2493,12 +2492,7 @@ impl Date: Mon, 23 Dec 2024 13:54:29 -0800 Subject: [PATCH 35/50] fmt --- src/channel_handler/mod.rs | 41 +++++++++++++++++++++++++++---------- src/common/standard_coin.rs | 6 +++++- src/peer_container.rs | 8 ++++++-- src/potato_handler.rs | 21 ++++++++++--------- src/referee.rs | 25 +++++++++++----------- src/shutdown.rs | 22 ++++++++------------ src/tests/calpoker.rs | 6 +++--- src/tests/game.rs | 11 +++++----- src/tests/simenv.rs | 14 +++++++++---- 9 files changed, 92 insertions(+), 62 deletions(-) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 05b5ca2f..dc4ccec4 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -372,7 +372,7 @@ impl ChannelHandler { let inputs = myself.unroll_coin_condition_inputs( myself.my_out_of_game_balance.clone() - myself.my_allocated_balance.clone(), myself.their_out_of_game_balance.clone() - myself.their_allocated_balance.clone(), - &[] + &[], ); myself.unroll.coin.update( env, @@ -636,7 +636,7 @@ impl ChannelHandler { &self.unroll_coin_condition_inputs( self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone(), self.their_out_of_game_balance.clone() - self.their_allocated_balance.clone(), - &unroll_data + &unroll_data, ), )?; @@ -921,7 +921,7 @@ impl ChannelHandler { &self.unroll_coin_condition_inputs( self.my_out_of_game_balance.clone() - self.my_allocated_balance.clone(), self.their_out_of_game_balance.clone() - self.their_allocated_balance.clone(), - &unroll_data + &unroll_data, ), )?; @@ -979,7 +979,13 @@ impl ChannelHandler { self.their_out_of_game_balance -= live_game.their_contribution.clone(); self.their_out_of_game_balance += at_stake.clone() - amount.clone(); - debug!("accept: my_allocated {:?} their_allocated {:?} my_balance {:?} their_balance {:?}", self.my_allocated_balance, self.their_allocated_balance, self.my_out_of_game_balance, self.their_out_of_game_balance); + debug!( + "accept: my_allocated {:?} their_allocated {:?} my_balance {:?} their_balance {:?}", + self.my_allocated_balance, + self.their_allocated_balance, + self.my_out_of_game_balance, + self.their_out_of_game_balance + ); self.update_cache_for_potato_send(if amount == Amount::default() { None @@ -1017,15 +1023,25 @@ impl ChannelHandler { )?; let game_amount_for_me = self.live_games[game_idx].get_our_current_share(); - let game_amount_for_them = self.live_games[game_idx].get_amount() - self.live_games[game_idx].get_our_current_share(); + let game_amount_for_them = self.live_games[game_idx].get_amount() + - self.live_games[game_idx].get_our_current_share(); debug!("received potato accept, my share {game_amount_for_me:?}"); - let new_my_allocated = self.my_allocated_balance.clone() - self.live_games[game_idx].my_contribution.clone(); - let new_their_allocated = self.their_allocated_balance.clone() - self.live_games[game_idx].their_contribution.clone(); - let my_balance = self.my_out_of_game_balance.clone() - self.live_games[game_idx].my_contribution.clone() + game_amount_for_me; - let their_balance = self.their_out_of_game_balance.clone() - self.live_games[game_idx].their_contribution.clone() + game_amount_for_them; + let new_my_allocated = + self.my_allocated_balance.clone() - self.live_games[game_idx].my_contribution.clone(); + let new_their_allocated = self.their_allocated_balance.clone() + - self.live_games[game_idx].their_contribution.clone(); + let my_balance = self.my_out_of_game_balance.clone() + - self.live_games[game_idx].my_contribution.clone() + + game_amount_for_me; + let their_balance = self.their_out_of_game_balance.clone() + - self.live_games[game_idx].their_contribution.clone() + + game_amount_for_them; - debug!("accept: my_allocated {:?} their_allocated {:?} my_balance {:?} their_balance {:?}", new_my_allocated, new_their_allocated, my_balance, their_balance); + debug!( + "accept: my_allocated {:?} their_allocated {:?} my_balance {:?} their_balance {:?}", + new_my_allocated, new_their_allocated, my_balance, their_balance + ); let unroll_condition_inputs = self.unroll_coin_condition_inputs( my_balance.clone(), @@ -1104,7 +1120,10 @@ impl ChannelHandler { their_channel_half_signature: &Aggsig, conditions: NodePtr, ) -> Result { - debug!("{} RECEIVED_POTATO_CLEAN_SHUTDOWN", self.is_initial_potato()); + debug!( + "{} RECEIVED_POTATO_CLEAN_SHUTDOWN", + self.is_initial_potato() + ); assert!(!self.have_potato); let conditions_program = Program::from_nodeptr(env.allocator, conditions)?; debug!("conditions {conditions_program:?}"); diff --git a/src/common/standard_coin.rs b/src/common/standard_coin.rs index ab0f9f4d..93a04874 100644 --- a/src/common/standard_coin.rs +++ b/src/common/standard_coin.rs @@ -482,7 +482,11 @@ pub fn standard_solution_partial( add_signature( &mut aggregated_signature, if partial { - partial_signer(private_key, aggregate_public_key, &coin_agg_sig_me_message) + partial_signer( + private_key, + aggregate_public_key, + &coin_agg_sig_me_message, + ) } else { private_key.sign(&coin_agg_sig_me_message) }, diff --git a/src/peer_container.rs b/src/peer_container.rs index fe2e0c37..397fb297 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -198,8 +198,12 @@ pub trait GameCradle { /// Signal shutdown. Forwards to FromLocalUI::shut_down. /// Perhaps we should consider reporting the reward coins. - fn shut_down(&mut self, allocator: &mut AllocEncoder, rng: &mut R, conditions: Rc) - -> Result<(), Error>; + fn shut_down( + &mut self, + allocator: &mut AllocEncoder, + rng: &mut R, + conditions: Rc, + ) -> Result<(), Error>; /// Tell the game cradle that a new block arrived, giving a watch report. fn new_block( diff --git a/src/potato_handler.rs b/src/potato_handler.rs index b18b145d..0d5e6798 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -436,8 +436,10 @@ pub enum GameAction { impl std::fmt::Debug for GameAction { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { match self { - GameAction::Move(gi,rm,h) => write!(formatter, "Move({gi:?},{rm:?},{h:?})"), - GameAction::RedoMove(gi,cs,ph,rt) => write!(formatter, "RedoMove({gi:?},{cs:?},{ph:?},{rt:?})"), + GameAction::Move(gi, rm, h) => write!(formatter, "Move({gi:?},{rm:?},{h:?})"), + GameAction::RedoMove(gi, cs, ph, rt) => { + write!(formatter, "RedoMove({gi:?},{cs:?},{ph:?},{rt:?})") + } GameAction::Accept(gi) => write!(formatter, "Accept({gi:?})"), GameAction::Shutdown(_) => write!(formatter, "Shutdown(..)"), } @@ -813,7 +815,8 @@ impl PotatoHandler { let want_puzzle_hash = puzzle_hash_for_pk(env.allocator, &want_public_key)?; let want_amount = ch.clean_shutdown_amount(); if want_amount != Amount::default() { - let condition_list = CoinCondition::from_nodeptr(env.allocator, clvm_conditions); + let condition_list = + CoinCondition::from_nodeptr(env.allocator, clvm_conditions); let found_conditions = condition_list.iter().any(|cond| { if let CoinCondition::CreateCoin(ph, amt) = cond { *ph == want_puzzle_hash && *amt >= want_amount @@ -1042,11 +1045,7 @@ impl PotatoHandler { let real_conditions = { let ch = self.channel_handler_mut()?; let (env, _) = penv.env(); - get_conditions_with_channel_handler( - env, - ch, - conditions.borrow(), - )? + get_conditions_with_channel_handler(env, ch, conditions.borrow())? }; let (state_channel_coin, spend, want_puzzle_hash, want_amount) = { let ch = self.channel_handler_mut()?; @@ -1076,13 +1075,15 @@ impl PotatoHandler { system_interface.register_coin(&my_reward, &timeout, Some("reward"))?; // If the state channel coin is spent, then we signal full shutdown. - let shutdown_condition_program = Program::from_nodeptr(env.allocator, real_conditions)?; + let shutdown_condition_program = + Program::from_nodeptr(env.allocator, real_conditions)?; system_interface.send_message(&PeerMessage::Shutdown( spend.signature.clone(), shutdown_condition_program, ))?; - self.handshake_state = HandshakeState::OnChainWaitingForUnrollSpend(state_channel_coin.clone()); + self.handshake_state = + HandshakeState::OnChainWaitingForUnrollSpend(state_channel_coin.clone()); Ok(true) } diff --git a/src/referee.rs b/src/referee.rs index 3cced89e..812df778 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -1544,18 +1544,19 @@ impl RefereeMaker { }, )?; - let (handler, mover_share) = - match &result { - TheirTurnResult::FinalMove(_readable_move, mover_share) => (None, mover_share.clone()), - TheirTurnResult::MakeMove(_, handler, _, mover_share) => (Some(handler.clone()), mover_share.clone()), - // Slash can't be used when we're off chain. - TheirTurnResult::Slash(_evidence) => { - return Ok(TheirTurnMoveResult { - puzzle_hash_for_unroll: None, - original: result.clone(), - }) - } - }; + let (handler, mover_share) = match &result { + TheirTurnResult::FinalMove(_readable_move, mover_share) => (None, mover_share.clone()), + TheirTurnResult::MakeMove(_, handler, _, mover_share) => { + (Some(handler.clone()), mover_share.clone()) + } + // Slash can't be used when we're off chain. + TheirTurnResult::Slash(_evidence) => { + return Ok(TheirTurnMoveResult { + puzzle_hash_for_unroll: None, + original: result.clone(), + }) + } + }; let puzzle_args = Rc::new(RefereePuzzleArgs::new( &self.fixed, diff --git a/src/shutdown.rs b/src/shutdown.rs index 9bdcd244..6c256203 100644 --- a/src/shutdown.rs +++ b/src/shutdown.rs @@ -28,25 +28,21 @@ impl ShutdownConditions for BasicShutdownConditions { our_reward_ph: &PuzzleHash, our_share: &Amount, their_reward_ph: &PuzzleHash, - their_share: &Amount + their_share: &Amount, ) -> Result { let mut v = Vec::new(); if *our_share != Amount::default() { - v.push(Node(( - CREATE_COIN, - (our_reward_ph, (our_share, ())), - ) + v.push(Node( + (CREATE_COIN, (our_reward_ph, (our_share, ()))) .to_clvm(allocator) - .into_gen()? + .into_gen()?, )); } if *their_share != Amount::default() { - v.push(Node(( - CREATE_COIN, - (their_reward_ph, (their_share, ())), - ) + v.push(Node( + (CREATE_COIN, (their_reward_ph, (their_share, ()))) .to_clvm(allocator) - .into_gen()? + .into_gen()?, )); } @@ -63,7 +59,7 @@ impl ShutdownConditions for BasicShutdownConditions { pub fn get_conditions_with_channel_handler( env: &mut ChannelHandlerEnv, ch: &ChannelHandler, - conditions: &dyn ShutdownConditions + conditions: &dyn ShutdownConditions, ) -> Result { let our_reward_ph = ch.get_reward_puzzle_hash(env)?; let our_share = ch.get_our_current_share(); @@ -74,6 +70,6 @@ pub fn get_conditions_with_channel_handler( &our_reward_ph, &our_share, &their_reward_ph, - &their_share + &their_share, ) } diff --git a/src/tests/calpoker.rs b/src/tests/calpoker.rs index 27191d42..ffb3ae7b 100644 --- a/src/tests/calpoker.rs +++ b/src/tests/calpoker.rs @@ -1,11 +1,11 @@ #[cfg(feature = "sim-tests")] -use std::rc::Rc; -#[cfg(feature = "sim-tests")] use log::debug; #[cfg(feature = "sim-tests")] use rand::prelude::*; #[cfg(feature = "sim-tests")] use rand_chacha::ChaCha8Rng; +#[cfg(feature = "sim-tests")] +use std::rc::Rc; use clvm_traits::{ClvmEncoder, ToClvm}; @@ -13,9 +13,9 @@ use clvm_traits::{ClvmEncoder, ToClvm}; use crate::channel_handler::game::Game; #[cfg(feature = "sim-tests")] use crate::channel_handler::types::ReadableMove; -use crate::common::types::{AllocEncoder, Sha256Input}; #[cfg(feature = "sim-tests")] use crate::common::types::Amount; +use crate::common::types::{AllocEncoder, Sha256Input}; #[cfg(feature = "sim-tests")] use crate::common::types::{Error, GameID, Hash}; #[cfg(feature = "sim-tests")] diff --git a/src/tests/game.rs b/src/tests/game.rs index a489f4e9..d24b328e 100644 --- a/src/tests/game.rs +++ b/src/tests/game.rs @@ -1,12 +1,12 @@ #[cfg(feature = "sim-tests")] -use std::rc::Rc; -#[cfg(feature = "sim-tests")] use crate::channel_handler::types::ReadableMove; #[cfg(feature = "sim-tests")] use crate::common::types::Hash; use crate::common::types::Timeout; #[cfg(feature = "sim-tests")] use crate::shutdown::ShutdownConditions; +#[cfg(feature = "sim-tests")] +use std::rc::Rc; #[cfg(test)] use clvmr::NodePtr; @@ -65,16 +65,15 @@ impl std::fmt::Debug for GameAction { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { match self { GameAction::Timeout(t) => write!(formatter, "Timeout({t})"), - GameAction::Move(p,n,r) => write!(formatter, "Move({p},{n:?},{r})"), - GameAction::FakeMove(p,n,v) => write!(formatter, "FakeMove({p},{n:?},{v:?})"), + GameAction::Move(p, n, r) => write!(formatter, "Move({p},{n:?},{r})"), + GameAction::FakeMove(p, n, v) => write!(formatter, "FakeMove({p},{n:?},{v:?})"), GameAction::GoOnChain(p) => write!(formatter, "GoOnChain({p})"), GameAction::Accept(p) => write!(formatter, "Accept({p})"), - GameAction::Shutdown(p,_) => write!(formatter, "Shutdown({p},..)"), + GameAction::Shutdown(p, _) => write!(formatter, "Shutdown({p},..)"), } } } - impl GameAction { #[cfg(feature = "sim-tests")] pub fn lose(&self) -> GameAction { diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index f3738cb2..01b11695 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -1,6 +1,6 @@ -use std::borrow::Borrow; use rand::{Rng, SeedableRng}; use rand_chacha::ChaCha8Rng; +use std::borrow::Borrow; use clvm_traits::ToClvm; use clvmr::{run_program, NodePtr}; @@ -400,7 +400,7 @@ impl<'a, R: Rng> SimulatorEnvironment<'a, R> { let real_target_conditions = get_conditions_with_channel_handler( &mut self.env, &self.parties.player(*player).ch, - target_conditions.borrow() + target_conditions.borrow(), )?; let spend = self .parties @@ -646,14 +646,20 @@ fn test_referee_can_slash_on_chain() { ) .expect("should create referee coin"); - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::default()); + assert_eq!( + reftest.my_referee.get_our_current_share(), + Amount::default() + ); // Farm 20 blocks to get past the time limit. for _ in 0..20 { s.farm_block(&reftest.my_identity.puzzle_hash); } - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::default()); + assert_eq!( + reftest.my_referee.get_our_current_share(), + Amount::default() + ); let timeout_transaction = reftest .my_referee .get_transaction_for_timeout(&mut allocator, &referee_coins[0]) From 35e23981340e02297130c28ace3eac6e5d770b7e Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 13:58:09 -0800 Subject: [PATCH 36/50] mask sim-tests feature --- src/tests/game.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/game.rs b/src/tests/game.rs index d24b328e..a630c6dc 100644 --- a/src/tests/game.rs +++ b/src/tests/game.rs @@ -66,9 +66,13 @@ impl std::fmt::Debug for GameAction { match self { GameAction::Timeout(t) => write!(formatter, "Timeout({t})"), GameAction::Move(p, n, r) => write!(formatter, "Move({p},{n:?},{r})"), + #[cfg(feature = "sim-tests")] GameAction::FakeMove(p, n, v) => write!(formatter, "FakeMove({p},{n:?},{v:?})"), + #[cfg(feature = "sim-tests")] GameAction::GoOnChain(p) => write!(formatter, "GoOnChain({p})"), + #[cfg(feature = "sim-tests")] GameAction::Accept(p) => write!(formatter, "Accept({p})"), + #[cfg(feature = "sim-tests")] GameAction::Shutdown(p, _) => write!(formatter, "Shutdown({p},..)"), } } From 8c0e9ae0686b0f3f8d13373656fde4adbd940897 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 23 Dec 2024 14:13:01 -0800 Subject: [PATCH 37/50] api drift --- wasm/src/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wasm/src/mod.rs b/wasm/src/mod.rs index 74d078a2..f5ca3fad 100644 --- a/wasm/src/mod.rs +++ b/wasm/src/mod.rs @@ -4,6 +4,7 @@ use js_sys::{Array, Function, JsString, Object}; use std::cell::RefCell; use std::collections::{BTreeMap, HashMap}; +use std::rc::Rc; use std::sync::atomic::{AtomicI32, Ordering}; use hex::FromHexError; @@ -21,6 +22,7 @@ use chia_gaming::channel_handler::types::ReadableMove; use chia_gaming::potato_handler::{GameStart, GameType, ToLocalUI}; use chia_gaming::peer_container::{GameCradle, IdleResult, SynchronousGameCradle, SynchronousGameCradleConfig, WatchReport}; use chia_gaming::common::standard_coin::{ChiaIdentity, wasm_deposit_file}; +use chia_gaming::shutdown::BasicShutdownConditions; use crate::map_m::map_m; @@ -398,7 +400,7 @@ pub fn accept(cid: i32, id: &str) -> Result<(), JsValue> { #[wasm_bindgen] pub fn shut_down(cid: i32) -> Result<(), JsValue> { with_game(cid, move |cradle: &mut JsCradle| { - cradle.cradle.shut_down(&mut cradle.allocator, &mut cradle.rng) + cradle.cradle.shut_down(&mut cradle.allocator, &mut cradle.rng, Rc::new(BasicShutdownConditions)) }) } From 443d2a1795ad2facb2bc443ddee1aed4c35baf5b Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 00:05:57 -0800 Subject: [PATCH 38/50] Add some commentary, align results to what should be expected (more tests required) --- clsp/calpoker_generate.clinc | 4 ++ clsp/std/list_compare.clinc | 1 + src/channel_handler/mod.rs | 8 ++-- src/games/calpoker.rs | 70 ++++++++++++++++++++++++++-- src/referee.rs | 4 +- src/tests/calpoker.rs | 10 ++-- src/tests/peer/potato_handler_sim.rs | 49 +++++++++++++++---- src/tests/simenv.rs | 16 ++----- 8 files changed, 130 insertions(+), 32 deletions(-) diff --git a/clsp/calpoker_generate.clinc b/clsp/calpoker_generate.clinc index b6628b7b..f49f46dd 100644 --- a/clsp/calpoker_generate.clinc +++ b/clsp/calpoker_generate.clinc @@ -121,7 +121,10 @@ bob_all_cards (map make_card (append bob_cards_bob my_cards_bob)) (my_hand_value my_picks) (handcalc (map card_list_to_pair my_all_cards)) (bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards)) + ;; win_result is 1 if my_hand_value is greater than bob_hand_value win_result (list_compare my_hand_value bob_hand_value) + ;; split is captured in a their turn handler below so it's the opposite of what + ;; this turn would specify. split (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount) (list MAKE_MOVE (list move (indices_to_bitfield my_picks) (indices_to_bitfield bob_picks) @@ -228,6 +231,7 @@ (alice_hand_value alice_picks) (handcalc (map card_list_to_pair alice_all_cards)) (bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards)) win_result (list_compare alice_hand_value bob_hand_value) + ;; win_result 1 means alice wins. correct_split (print (list "bob driver e checking correct split" win_result split amount) (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)) (if (!= split correct_split) (list SLASH (indices_to_bitfield bob_picks)) diff --git a/clsp/std/list_compare.clinc b/clsp/std/list_compare.clinc index 838fa2a7..d5142533 100644 --- a/clsp/std/list_compare.clinc +++ b/clsp/std/list_compare.clinc @@ -1,3 +1,4 @@ +;; List compare returns 1 if the a list is greater than the b list. (defun list_compare (a b) (if (= (f a) (f b)) (if (r a) diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index dc4ccec4..74c59793 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -700,7 +700,7 @@ impl ChannelHandler { env: &mut ChannelHandlerEnv, start_info_list: &[GameStartInfo], ) -> Result { - debug!("SEND POTATO START GAME"); + debug!("{} SEND POTATO START GAME", self.is_initial_potato()); let (my_full_contribution, their_full_contribution) = self.start_game_contributions(start_info_list); @@ -738,8 +738,10 @@ impl ChannelHandler { start_info_list: &[GameStartInfo], ) -> Result { debug!( - "RECEIVED_POTATO_START_GAME: our state is {}, unroll state is {}", - self.current_state_number, self.unroll.coin.state_number + "{} RECEIVED_POTATO_START_GAME: our state is {}, unroll state is {}", + self.is_initial_potato(), + self.current_state_number, + self.unroll.coin.state_number ); let mut new_games = self.add_games(env, start_info_list)?; diff --git a/src/games/calpoker.rs b/src/games/calpoker.rs index 2e771293..6a33bda1 100644 --- a/src/games/calpoker.rs +++ b/src/games/calpoker.rs @@ -1,5 +1,7 @@ use std::cmp::Ordering; +use log::debug; + use crate::channel_handler::types::ReadableMove; use clvmr::NodePtr; @@ -17,6 +19,12 @@ use crate::common::types::{ Sha256Input, }; +#[derive(Eq, PartialEq, Debug, Clone, Serialize, Deserialize)] +pub enum WinDirectionUser { + Alice, + Bob, +} + pub type Card = (usize, usize); #[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] @@ -149,7 +157,8 @@ pub struct CalpokerResult { pub bob_hand_result: CalpokerHandValue, pub alice_hand_value: RawCalpokerHandValue, pub alice_hand_result: CalpokerHandValue, - pub win_direction: i64, + pub raw_win_direction: i64, + pub win_direction: Option, pub game_amount: u64, pub your_share: u64, } @@ -329,6 +338,55 @@ pub fn decode_hand_result( Ok(RawCalpokerHandValue::SimpleList(result_list)) } +fn select_cards_using_bits(cardlist: &CardList, selections: usize) -> (CardList, CardList) { + let (p1, p2): (Vec<(usize, (usize, usize))>, Vec<(usize, (usize, usize))>) = cardlist + .iter() + .cloned() + .enumerate() + .partition(|(i, _c)| (selections & (1 << i)) != 0); + ( + p1.into_iter().map(|(_i, c)| c).collect(), + p2.into_iter().map(|(_i, c)| c).collect(), + ) +} + +/// Show the cards given a win result. +pub fn get_final_used_cards( + cardlists: &(CardList, CardList), + alice_result: &CalpokerResult, + bob_result: &CalpokerResult, +) -> (CardList, CardList) { + let (mut alice_giveaway_cards, alice_kept_cards) = + select_cards_using_bits(&cardlists.0, bob_result.raw_alice_selects); + let (mut bob_giveaway_cards, bob_kept_cards) = + select_cards_using_bits(&cardlists.1, alice_result.raw_alice_selects); + let mut alice_total_cards = alice_kept_cards; + alice_total_cards.append(&mut bob_giveaway_cards); + debug!("alice_total_cards {alice_total_cards:?}"); + let mut bob_total_cards = bob_kept_cards; + bob_total_cards.append(&mut alice_giveaway_cards); + debug!("bob_total_cards {bob_total_cards:?}"); + assert_eq!(alice_total_cards.len(), 8); + assert_eq!(bob_total_cards.len(), 8); + let alice_used_cards: CardList = alice_total_cards + .iter() + .cloned() + .enumerate() + .filter(|(i, _c)| alice_result.raw_alice_picks & (1 << i) != 0) + .map(|(_i, c)| c) + .collect(); + let bob_used_cards: CardList = bob_total_cards + .iter() + .cloned() + .enumerate() + .filter(|(i, _c)| alice_result.raw_bob_picks & (1 << i) != 0) + .map(|(_i, c)| c) + .collect(); + assert_eq!(alice_used_cards.len(), 5); + assert_eq!(bob_used_cards.len(), 5); + (alice_used_cards, bob_used_cards) +} + /// Given a readable move, decode it as a calpoker outcome. pub fn decode_calpoker_readable( allocator: &mut AllocEncoder, @@ -399,7 +457,12 @@ pub fn decode_calpoker_readable( alice_hand_result: hva?, bob_hand_value, alice_hand_value, - win_direction, + raw_win_direction: win_direction, + win_direction: match win_direction { + 1 => Some(WinDirectionUser::Alice), + -1 => Some(WinDirectionUser::Bob), + _ => None, + }, }) } @@ -429,7 +492,8 @@ fn test_decode_calpoker_readable() { bob_hand_value: bobv, your_share: 200, game_amount: 200, - win_direction: -1 + raw_win_direction: -1, + win_direction: Some(WinDirectionUser::Bob), } ); } diff --git a/src/referee.rs b/src/referee.rs index 812df778..c3fd6d86 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -860,9 +860,9 @@ impl RefereeMaker { pub fn get_our_current_share(&self) -> Amount { let args = self.spend_this_coin(); if self.processing_my_turn() { - args.game_move.basic.mover_share.clone() - } else { self.fixed.amount.clone() - args.game_move.basic.mover_share.clone() + } else { + args.game_move.basic.mover_share.clone() } } diff --git a/src/tests/calpoker.rs b/src/tests/calpoker.rs index ffb3ae7b..b7d9c477 100644 --- a/src/tests/calpoker.rs +++ b/src/tests/calpoker.rs @@ -19,13 +19,12 @@ use crate::common::types::{AllocEncoder, Sha256Input}; #[cfg(feature = "sim-tests")] use crate::common::types::{Error, GameID, Hash}; #[cfg(feature = "sim-tests")] -use crate::games::calpoker::decode_calpoker_readable; -#[cfg(feature = "sim-tests")] -use crate::games::calpoker::decode_readable_card_choices; -#[cfg(feature = "sim-tests")] use crate::games::calpoker::make_cards; #[cfg(feature = "sim-tests")] use crate::games::calpoker::CalpokerResult; +use crate::games::calpoker::WinDirectionUser; +#[cfg(feature = "sim-tests")] +use crate::games::calpoker::{decode_calpoker_readable, decode_readable_card_choices}; #[cfg(feature = "sim-tests")] use crate::games::calpoker::{CalpokerHandValue, RawCalpokerHandValue}; #[cfg(feature = "sim-tests")] @@ -150,7 +149,8 @@ fn test_verify_endgame_data() { bob_hand_value: RawCalpokerHandValue::SimpleList(vec![2, 1, 1, 1, 3, 14, 13, 11]), your_share: 200, game_amount: 200, - win_direction: 1 + raw_win_direction: 1, + win_direction: Some(WinDirectionUser::Alice), } ); } else { diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 956e500d..7e458f2d 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -19,7 +19,9 @@ use crate::common::types::{ AllocEncoder, Amount, CoinSpend, CoinString, Error, GameID, IntoErr, PrivateKey, Program, PuzzleHash, Sha256tree, Spend, SpendBundle, Timeout, ToQuotedProgram, }; -use crate::games::calpoker::decode_calpoker_readable; +use crate::games::calpoker::{ + decode_calpoker_readable, decode_readable_card_choices, get_final_used_cards, +}; use crate::games::poker_collection; use crate::peer_container::{ report_coin_changes_to_peer, FullCoinSetAdapter, GameCradle, MessagePeerQueue, MessagePipe, @@ -1070,15 +1072,46 @@ fn sim_test_with_peer_container_off_chain_complete() { .iter() .map(|c| c.to_parts().map(|(_, _, amt)| amt.to_u64()).unwrap_or(0)) .sum(); + for (pn, lui) in outcome.local_uis.iter().enumerate() { - for the_move in lui.opponent_moves.iter() { + for (mn, the_move) in lui.opponent_moves.iter().enumerate() { let the_move_to_node = the_move.1.to_nodeptr(&mut allocator).expect("should work"); debug!( - "player {pn} opponent move {the_move:?} {}", + "player {pn} opponent move {mn} {the_move:?} {}", disassemble(allocator.allocator(), the_move_to_node, None) ); } } + + let p0_view_of_cards = outcome.local_uis[0].opponent_moves[0].1.clone(); + let alice_cards = + decode_readable_card_choices(&mut allocator, p0_view_of_cards).expect("should get cards"); + let alice_outcome_node = outcome.local_uis[0].opponent_moves[1] + .1 + .to_nodeptr(&mut allocator) + .expect("should work"); + let alice_outcome = + decode_calpoker_readable(&mut allocator, alice_outcome_node, Amount::new(200), false) + .expect("should work"); + let p1_view_of_cards = outcome.local_uis[1].opponent_moves[1].1.clone(); + let bob_cards = + decode_readable_card_choices(&mut allocator, p1_view_of_cards).expect("should work"); + let bob_outcome_node = outcome.local_uis[1].opponent_moves[2] + .1 + .to_nodeptr(&mut allocator) + .expect("should work"); + let bob_outcome = + decode_calpoker_readable(&mut allocator, bob_outcome_node, Amount::new(200), true) + .expect("should work"); + + assert_eq!(alice_cards, bob_cards); + + let (alice_used_cards, bob_used_cards) = + get_final_used_cards(&alice_cards, &alice_outcome, &bob_outcome); + + debug!("alice_used_cards {alice_used_cards:?}"); + debug!("bob_used_cards {bob_used_cards:?}"); + let opponent_moves = &outcome.local_uis[0].opponent_moves; let olen = opponent_moves.len(); let outcome_move = &opponent_moves[olen - 1]; @@ -1095,10 +1128,10 @@ fn sim_test_with_peer_container_off_chain_complete() { ); debug!("game outcome {decoded_outcome:?}"); debug!("p1 balance {p1_balance:?} p2 {p2_balance:?}"); - if decoded_outcome.win_direction == 1 { - assert_eq!(p2_balance, p1_balance + 200); - } else if decoded_outcome.win_direction == -1 { + if decoded_outcome.raw_win_direction == 1 { assert_eq!(p2_balance + 200, p1_balance); + } else if decoded_outcome.raw_win_direction == -1 { + assert_eq!(p2_balance, p1_balance + 200); } else { assert_eq!(p2_balance, p1_balance); } @@ -1155,9 +1188,9 @@ fn sim_test_with_peer_container_piss_off_peer_complete() { ); debug!("game outcome {decoded_outcome:?}"); debug!("p1 balance {p1_balance:?} p2 {p2_balance:?}"); - if decoded_outcome.win_direction == 1 { + if decoded_outcome.raw_win_direction == 1 { assert_eq!(p2_balance + 200, p1_balance); - } else if decoded_outcome.win_direction == -1 { + } else if decoded_outcome.raw_win_direction == -1 { assert_eq!(p2_balance, p1_balance + 200); } else { assert_eq!(p2_balance, p1_balance); diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index 01b11695..bb3445c4 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -608,7 +608,7 @@ fn test_referee_can_slash_on_chain() { &game_start_info, ); - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(0)); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); // Make simulator and create referee coin. let s = Simulator::default(); @@ -646,20 +646,14 @@ fn test_referee_can_slash_on_chain() { ) .expect("should create referee coin"); - assert_eq!( - reftest.my_referee.get_our_current_share(), - Amount::default() - ); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); // Farm 20 blocks to get past the time limit. for _ in 0..20 { s.farm_block(&reftest.my_identity.puzzle_hash); } - assert_eq!( - reftest.my_referee.get_our_current_share(), - Amount::default() - ); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); let timeout_transaction = reftest .my_referee .get_transaction_for_timeout(&mut allocator, &referee_coins[0]) @@ -727,7 +721,7 @@ fn test_referee_can_move_on_chain() { ); let readable_move = assemble(allocator.allocator(), "(100 . 0)").expect("should assemble"); - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(0)); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); // Make our first move. let readable_my_move = @@ -738,7 +732,7 @@ fn test_referee_can_move_on_chain() { .my_turn_make_move(&mut allocator, &readable_my_move, rng.gen(), 0) .expect("should move"); - assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(100)); + assert_eq!(reftest.my_referee.get_our_current_share(), Amount::new(0)); // Make simulator and create referee coin. let s = Simulator::default(); From a5f68e1567c2dd0c2366592cf09cc68a961be559 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 00:28:05 -0800 Subject: [PATCH 39/50] Give a name to index and card --- src/games/calpoker.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/games/calpoker.rs b/src/games/calpoker.rs index 6a33bda1..b0da3a31 100644 --- a/src/games/calpoker.rs +++ b/src/games/calpoker.rs @@ -338,8 +338,10 @@ pub fn decode_hand_result( Ok(RawCalpokerHandValue::SimpleList(result_list)) } +type IndexAndCard = (usize, (usize, usize)); + fn select_cards_using_bits(cardlist: &CardList, selections: usize) -> (CardList, CardList) { - let (p1, p2): (Vec<(usize, (usize, usize))>, Vec<(usize, (usize, usize))>) = cardlist + let (p1, p2): (Vec, Vec) = cardlist .iter() .cloned() .enumerate() From 27192357ec5e44101ad417ee7d80252fad852ce4 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 13:24:43 -0800 Subject: [PATCH 40/50] Start removing diagnostics aids --- clsp/onchain/referee.clsp | 17 ++++++++--------- clsp/onchain/referee.hex | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/clsp/onchain/referee.clsp b/clsp/onchain/referee.clsp index cf47767b..20fb5905 100644 --- a/clsp/onchain/referee.clsp +++ b/clsp/onchain/referee.clsp @@ -8,7 +8,6 @@ (import std.condition_codes) (import std.match) (import std.li) -(import std.print) (import onchain.game_codes) ; @@ -39,7 +38,7 @@ ; (export (@ all_args ((MOVER_PUZZLE_HASH WAITER_PUZZLE_HASH TIMEOUT AMOUNT MOD_HASH NONCE MOVE MAX_MOVE_SIZE VALIDATION_INFO_HASH MOVER_SHARE PREVIOUS_VALIDATION_INFO_HASH) . args)) - (if (not (print "check args" args)) + (if (not args) ; timeout (list (list ASSERT_HEIGHT_RELATIVE TIMEOUT) @@ -99,18 +98,18 @@ conditions (a mover_puzzle solution) (assert VALIDATION_INFO_HASH - (print (list "strlen new_move" new_move MAX_MOVE_SIZE) (<= (strlen new_move) MAX_MOVE_SIZE)) - (print (list "v new_mover_share" new_mover_share AMOUNT) (<= new_mover_share AMOUNT)) - (print (list "check new mover share" new_mover_share) (>= new_mover_share 0)) - (print "logior check" (logior (not new_validation_info_hash) (= 32 (strlen new_validation_info_hash)))) - (print "check mover puzzle hash" (= MOVER_PUZZLE_HASH (shatree mover_puzzle))) + (<= (strlen new_move) MAX_MOVE_SIZE) + (<= new_mover_share AMOUNT) + (>= new_mover_share 0) + (= 32 (strlen new_validation_info_hash)) + (= MOVER_PUZZLE_HASH (shatree mover_puzzle)) ; Check that the child output is made - (print "match check" (match + (match (lambda ((& new_puzzle_hash AMOUNT) (condname arg1 arg2)) (logand (= condname CREATE_COIN) (= arg1 new_puzzle_hash) (= arg2 AMOUNT)) ) conditions - )) + ) (li (list REMARK new_move new_validation_info_hash new_mover_share new_max_move_size) (list ASSERT_BEFORE_HEIGHT_RELATIVE TIMEOUT) &rest conditions) ) diff --git a/clsp/onchain/referee.hex b/clsp/onchain/referee.hex index 143911bc..76c8050f 100644 --- a/clsp/onchain/referee.hex +++ b/clsp/onchain/referee.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff20ffff02ff3cffff04ff02ffff04ffff018a636865636b2061726773ffff04ff07ff808080808080ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff14ffff04ff02ffff04ffff05ff0580ffff04ffff02ff28ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff14ffff04ff02ffff04ff05ffff04ffff02ff28ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff2cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff38ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff018f7374726c656e206e65775f6d6f7665ffff04ff25ffff04ff8217f1ffff0180808080ffff04ffff20ffff15ffff0dff2580ff8217f18080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff019176206e65775f6d6f7665725f7368617265ffff04ff8200b5ffff04ff820171ffff0180808080ffff04ffff20ffff15ff8200b5ff8201718080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0195636865636b206e6577206d6f766572207368617265ffff04ff8200b5ffff01808080ffff04ffff20ffff15ffff0180ff8200b58080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018c6c6f67696f7220636865636bffff04ffff19ffff20ff5580ffff09ffff0120ffff0dff55808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff0197636865636b206d6f7665722070757a7a6c652068617368ffff04ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff018b6d6174636820636865636bffff04ffff02ff2cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff20ff0780ffff01ff02ffff01ff04ffff04ffff0152ffff04ff2dffff01808080ffff04ffff03ff8217fdffff04ffff0133ffff04ff09ffff04ff8217fdffff0180808080ffff04ffff0101ffff01808080ffff04ffff03ffff11ff5dff8217fd80ffff04ffff0133ffff04ff15ffff04ffff11ff5dff8217fd80ffff0180808080ffff04ffff0101ffff01808080ffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff07ffff05ffff06ff07808080ffff01ff02ffff01ff02ff2affff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff0180ffff01ff02ffff01ff02ff16ffff04ff02ffff04ffff06ff0180ffff04ff07ff8080808080ff018080ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff10ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff0bffff06ffff06ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ffff02ff2cffff04ff02ffff04ffff05ff0580ffff04ffff02ff18ffff04ff02ffff04ffff06ff0580ff80808080ff808080808080ff0180ffff01ff02ffff01ff06ffff05ffff01ffffa04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459aa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ffa102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222a102a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e7298a91ce119a63400ade7c58080ff018080ff0180ffff0bffff01a102a12871fee210fb8619291eaea194581cbd2531e4b23759d225f6806923f63222ffff02ff2cffff04ff02ffff04ff05ffff04ffff02ff18ffff04ff02ffff04ff07ff80808080ff808080808080ffff0bffff0102ffff0bffff0102ffff01a09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff0bffff0102ff0bffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a8080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff01808080ffff01ff02ffff01ff05ff0b80ff0180ffff01ff02ffff01ff02ff3cffff04ff02ffff04ff05ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff12ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff12ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ffff02ff3affff04ff02ffff04ff03ffff04ffff02ff12ffff04ff02ffff04ff5bff80808080ff8080808080ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff820175ff8080808080ffff01ff02ffff01ff02ffff03ffff09ff8300bff1ffff0bff0bffff02ff12ffff04ff02ffff04ff25ff808080808080ffff01ff02ffff01ff04ffff04ffff0101ffff018080ffff02ff10ffff04ff02ffff04ffff02ff8200b5ffff04ff0bffff04ffff04ff820bf1ffff04ff822ff1ffff04ff825ff1ffff04ff8300bff1ffff04ff21ffff04ff51ffff04ff820171ffff04ff8200b1ffff04ff8217f1ffff04ff8202f1ffff018080808080808080808080ff19808080ffff04ffff02ff820175ff8202f580ff808080808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ff2effff04ff02ffff04ff03ffff04ffff02ff14ffff04ff02ffff04ff820179ffff04ffff02ff12ffff04ff02ffff04ffff04ff29ffff04ff11ffff04ff59ffff04ff8200b9ffff04ff820179ffff04ff8202f9ffff04ff13ffff04ff8200bbffff04ff2bffff04ff5bffff04ff8217f9ff808080808080808080808080ff80808080ff8080808080ffff04ffff02ff82017bff8202fb80ff808080808080ffff02ffff03ff822ff1ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0dff2580ff8217f18080ffff01ff02ffff01ff02ffff03ffff20ffff15ff8200b5ff8201718080ffff01ff02ffff01ff02ffff03ffff20ffff15ffff0180ff8200b58080ffff01ff02ffff01ff02ffff03ffff09ffff0120ffff0dff558080ffff01ff02ffff01ff02ffff03ffff09ff21ffff02ff12ffff04ff02ffff04ff8202f5ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff3cffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff3e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff0bffff04ff820171ffff0180808080ffff04ffff0101ffff0180808080ffff0180808080ffff04ff17ff8080808080ffff01ff02ffff01ff04ffff04ffff0101ffff04ff25ffff04ff55ffff04ff8200b5ffff04ff820175ffff01808080808080ffff04ffff04ffff0156ffff04ff8200b1ffff01808080ff178080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff0180ffff01ff02ffff01ff0880ff018080ff0180ff18ffff09ff13ffff013380ffff09ff2bff0980ffff09ff5bff158080ff018080 \ No newline at end of file From 9abb2ddfc7e10ca128c2b52c2732af200cbd7ad3 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 13:40:17 -0800 Subject: [PATCH 41/50] remove more diagnostics --- clsp/calpoker_include_calpoker_factory.hex | 2 +- clsp/calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- clsp/calpoker_include_calpoker_template_hash.hex | 2 +- clsp/onchain/calpoker/a.clsp | 3 +-- clsp/onchain/calpoker/a.hex | 2 +- clsp/onchain/calpoker/b.clsp | 3 +-- clsp/onchain/calpoker/b.hex | 2 +- clsp/onchain/calpoker/c.clsp | 11 +++++------ clsp/onchain/calpoker/c.hex | 2 +- clsp/onchain/calpoker/d.clsp | 9 ++++----- clsp/onchain/calpoker/d.hex | 2 +- clsp/onchain/calpoker/e.clsp | 3 +-- clsp/onchain/calpoker/e.hex | 2 +- clsp/std/slice.clinc | 2 +- 15 files changed, 22 insertions(+), 27 deletions(-) diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 36bf79c4..7fe7c69a 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820206ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82025effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82025effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82025effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ff82025effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff8203aeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffffff02ff820306ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82030effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82038effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82028effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82038effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82024effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82024effff04ff02ffff04ff07ff80808080ff80808080ffff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffffffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0180ffff04ffff02ff82022effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82022effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ff05ff02ffff03ff0bffff01ff02ffff01ff02ff82026effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8202eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82021effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffffffffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82021effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82029effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82039effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820206ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82025effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82025effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82025effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ff82025effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff8203aeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffffff02ff820306ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82030effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82038effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82028effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82038effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82024effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82024effff04ff02ffff04ff07ff80808080ff80808080ffff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffffffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0180ffff04ffff02ff82022effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82022effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ff05ff02ffff03ff0bffff01ff02ffff01ff02ff82026effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8202eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82021effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffffffffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82021effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82029effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82039effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 28e65c2c..602b357a 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a0594105e348899f590ff4bcc61f9105dd533d72f1283d777ff8a4d5e5a59f3532 \ No newline at end of file +a0a07cda5341b560576c5c96a49d69b119ba39823e1534ed6073be6580c003c303 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index e41d2d5c..ffb36583 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82035effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82035effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82035effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82035effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080ffa038d87945f65a68a5e3a5d7da43561192961d1479a57249c9689ab07d0ca06df4ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82035effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82035effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82035effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82035effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index 3f076f19..13f669e2 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a044b67e0a252ae9e03840be175f85a20c4b8e803d5ab088ee4d56cfe65bcd1116 \ No newline at end of file +a09d859630738b733dc33bdfb243fdcc6bc69356e53ec29fd6704eb94e0eedb86c \ No newline at end of file diff --git a/clsp/onchain/calpoker/a.clsp b/clsp/onchain/calpoker/a.clsp index 53c5030d..567db95b 100644 --- a/clsp/onchain/calpoker/a.clsp +++ b/clsp/onchain/calpoker/a.clsp @@ -3,7 +3,6 @@ (import onchain.calpoker.b exposing (program_hash as bhash)) (import std.assert) (import std.and) -(import std.print) (import std.if_any_fail) ; Bob challenging @@ -16,7 +15,7 @@ state me mover_puzzle solution evidence) (if_any_fail - (print "poker a" (= new_validation_hash (sha256 bhash (sha256 1 move)))) + (= new_validation_hash (sha256 bhash (sha256 1 move))) (= (strlen move) 32) (= max_move_size 16) 0 diff --git a/clsp/onchain/calpoker/a.hex b/clsp/onchain/calpoker/a.hex index 7593c4e9..d4b85bff 100644 --- a/clsp/onchain/calpoker/a.hex +++ b/clsp/onchain/calpoker/a.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff02ffff04ff02ffff04ffff0187706f6b65722061ffff04ffff09ff2bffff0bffff01a087627e7e57cf2995f2fe3f032f5b0fc6cf2110168aa49587281ae13e73308900ffff0bffff0101ff13808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff012080ffff01ff02ffff01ff09ff5bffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff018080 \ No newline at end of file +ff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180 \ No newline at end of file diff --git a/clsp/onchain/calpoker/b.clsp b/clsp/onchain/calpoker/b.clsp index bf62c92d..04b81114 100644 --- a/clsp/onchain/calpoker/b.clsp +++ b/clsp/onchain/calpoker/b.clsp @@ -5,7 +5,6 @@ (import std.assert) (import std.if_any_fail) (import std.shatree) -(import std.print) ; Alice challenging ; state is alice's commit @@ -15,7 +14,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) alice_commit me mover_puzzle solution evidence) (if_any_fail - (print "poker b" (= new_validation_hash (sha256 chash (shatree (list alice_commit move))))) + (= new_validation_hash (sha256 chash (shatree (list alice_commit move)))) (= (strlen move) 16) (= max_move_size 48) 0 diff --git a/clsp/onchain/calpoker/b.hex b/clsp/onchain/calpoker/b.hex index 59cd16d2..49a6dfdc 100644 --- a/clsp/onchain/calpoker/b.hex +++ b/clsp/onchain/calpoker/b.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff04ffff04ff02ffff04ffff0187706f6b65722062ffff04ffff09ff2bffff0bffff01a064c70f74a793050d44ffea81f95f00999e602bd285991cf65c894e1588e197f5ffff02ff06ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/c.clsp b/clsp/onchain/calpoker/c.clsp index 771e4f3d..5d4c3716 100644 --- a/clsp/onchain/calpoker/c.clsp +++ b/clsp/onchain/calpoker/c.clsp @@ -5,7 +5,6 @@ (import std.relops) (import std.and) (import std.if_any_fail) -(import std.print) (import onchain.calpoker.d exposing (program_hash as dhash)) (import onchain.calpoker.make_cards) @@ -17,11 +16,11 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (alice_commit bob_seed) me mover_puzzle solution evidence)) (if_any_fail - (print (list "poker c" move "all args" move (strlen move)) (= (strlen move) 48)) - (print (list "check hash of move 0..16" (substr move 0 16) alice_commit) (= (sha256 (substr move 0 16)) alice_commit)) - (print (list "check new validation hash" new_validation_hash) (= new_validation_hash (sha256 dhash (shatree (list (make_cards - (sha256 (substr move 0 16) bob_seed amount)) (substr move 16 48)))))) - (print (list "check max move size" max_move_size) (= max_move_size 1)) + (= (strlen move) 48) + (= (sha256 (substr move 0 16)) alice_commit) + (= new_validation_hash (sha256 dhash (shatree (list (make_cards + (sha256 (substr move 0 16) bob_seed amount)) (substr move 16 48))))) + (= max_move_size 1) 0 (x) ) diff --git a/clsp/onchain/calpoker/c.hex b/clsp/onchain/calpoker/c.hex index 06e0a2f9..c168d118 100644 --- a/clsp/onchain/calpoker/c.hex +++ b/clsp/onchain/calpoker/c.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0187706f6b65722063ffff04ff13ffff04ffff0188616c6c2061726773ffff04ff13ffff04ffff0dff1380ffff01808080808080ffff04ffff09ffff0dff1380ffff013080ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0198636865636b2068617368206f66206d6f766520302e2e3136ffff04ffff0cff13ffff0180ffff011080ffff04ff27ffff0180808080ffff04ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff2effff04ff02ffff04ffff04ffff0199636865636b206e65772076616c69646174696f6e2068617368ffff04ff2bffff01808080ffff04ffff09ff2bffff0bffff01a034c87c349f6a28407fa96b291836e1c9c5a017ad37bf9e2ec32adf564e8dd3f6ffff02ff3effff04ff02ffff04ffff04ffff02ff2cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff2effff04ff02ffff04ffff04ffff0193636865636b206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff010180ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff24ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffff02ff34ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff2affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff3cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff26ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ff0bffff01ff02ffff01ff02ff3affff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff2affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff2affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff26ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/d.clsp b/clsp/onchain/calpoker/d.clsp index 81c70341..8f14253d 100644 --- a/clsp/onchain/calpoker/d.clsp +++ b/clsp/onchain/calpoker/d.clsp @@ -6,7 +6,6 @@ (import std.popcount) (import std.and) (import std.if_any_fail) -(import std.print) ; Alice challenging ; state is the cards for both players and alice's card pick commitment @@ -16,10 +15,10 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (cards alice_commit) me mover_puzzle solution evidence) (if_any_fail - (print (list "poker d" bob_picks) (= (strlen bob_picks) 1)) - (print "check popcount" (= (popcount bob_picks) 4)) - (print (list "check validation hash" new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit))))) - (print (list "check new max move size" max_move_size) (= max_move_size 18)) + (= (strlen bob_picks) 1) + (= (popcount bob_picks) 4) + (= new_validation_hash (sha256 ehash (shatree (list bob_picks cards alice_commit)))) + (= max_move_size 18) 0 (x) ) diff --git a/clsp/onchain/calpoker/d.hex b/clsp/onchain/calpoker/d.hex index a25b3e48..c1f8dfb3 100644 --- a/clsp/onchain/calpoker/d.hex +++ b/clsp/onchain/calpoker/d.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0187706f6b65722064ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff010180ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff018e636865636b20706f70636f756e74ffff04ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ff8080808080ffff01ff02ffff01ff02ffff03ffff02ff0affff04ff02ffff04ffff04ffff0195636865636b2076616c69646174696f6e2068617368ffff04ff2bffff04ffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff8080808080ffff0180808080ffff04ffff09ff2bffff0bffff01a0b4f6ccdf8eb60d86bb35480c7a8bf588de24c719f8d486b26883ce75210a8387ffff02ff0effff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ff8080808080ffff01ff02ffff01ff02ff0affff04ff02ffff04ffff04ffff0197636865636b206e6577206d6178206d6f76652073697a65ffff04ff8217fbffff01808080ffff04ffff09ff8217fbffff011280ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ffff05ff0580ff80808080ffff02ff0effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/onchain/calpoker/e.clsp b/clsp/onchain/calpoker/e.clsp index 7ea954c2..4669168f 100644 --- a/clsp/onchain/calpoker/e.clsp +++ b/clsp/onchain/calpoker/e.clsp @@ -9,7 +9,6 @@ (import std.popcount) (import std.if_any_fail) (import std.and) -(import std.print) ; Bob challenging ; state is (Bob's picks (alice_cards bob_cards) alice_commit) @@ -19,7 +18,7 @@ mover_puzzle_hash waiter_puzzle_hash amount timeout max_move_size referee_hash) (bob_picks (alice_cards bob_cards) alice_commit) me mover_puzzle solution bob_card_selections) (if_any_fail - (print (list "poker e" move) (= (strlen move) 18)) + (list "poker e" move) (= (strlen move) 18) (assign alice_salted_picks (substr move 0 17) alice_picks (substr move 16 17) diff --git a/clsp/onchain/calpoker/e.hex b/clsp/onchain/calpoker/e.hex index 34204127..1a49901a 100644 --- a/clsp/onchain/calpoker/e.hex +++ b/clsp/onchain/calpoker/e.hex @@ -1 +1 @@ -ff02ffff01ff02ffff03ffff02ffff03ffff02ff4effff04ff02ffff04ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff04ffff09ffff0dff1380ffff011280ff8080808080ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff48ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff48ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffff02ff78ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff74ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff74ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff74ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff68ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ffffff02ff6cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ffff04ffff02ff54ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff52ffff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff7c80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff56ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ffff02ff72ffff04ff02ffff04ff03ffff04ffff02ff6affff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff24ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff24ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff4affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff5affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff7affff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff7affff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff56ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff76ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff48ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff26ffff04ff02ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff4cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff76ffff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/std/slice.clinc b/clsp/std/slice.clinc index 19345110..57381be8 100644 --- a/clsp/std/slice.clinc +++ b/clsp/std/slice.clinc @@ -1,6 +1,6 @@ ; returns the first count elements of mylist (defun slice (mylist count) - (if (print (list "slice inputs" nylist count) (not count)) + (if (not count) 0 (c (f mylist) (slice (r mylist) (- count 1))) ) From 5df9f919c80f16e60bba4d46b3e804125608c439 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 13:54:17 -0800 Subject: [PATCH 42/50] Remove more --- clsp/calpoker_generate.clinc | 6 ++---- clsp/calpoker_include_calpoker_factory.hex | 2 +- clsp/calpoker_include_calpoker_factory_hash.hex | 2 +- clsp/calpoker_include_calpoker_template.hex | 2 +- clsp/calpoker_include_calpoker_template_hash.hex | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/clsp/calpoker_generate.clinc b/clsp/calpoker_generate.clinc index f49f46dd..343e8251 100644 --- a/clsp/calpoker_generate.clinc +++ b/clsp/calpoker_generate.clinc @@ -11,7 +11,6 @@ (import std.assert) (import std.append) (import std.relops) -(import std.print) (import std.list_compare) (import handcalc exposing handcalc) (import onchain.calpoker.onehandcalc exposing onehandcalc) @@ -129,9 +128,8 @@ (list MAKE_MOVE (list move (indices_to_bitfield my_picks) (indices_to_bitfield bob_picks) my_hand_value bob_hand_value win_result) - (lambda ((& MY_SALT MY_PICKS my_picks split amount)) (list (concat (print "MY_SALT is" MY_SALT) (print "MY_PICKS are" MY_PICKS) (print "my_selects are" (single-byte (indices_to_bitfield my_picks)))) 0 0 0 0 split 0 0) + (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)) 0 - ) ) ) ) @@ -232,7 +230,7 @@ (bob_hand_value bob_picks) (handcalc (map card_list_to_pair bob_all_cards)) win_result (list_compare alice_hand_value bob_hand_value) ;; win_result 1 means alice wins. - correct_split (print (list "bob driver e checking correct split" win_result split amount) (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount)) + correct_split (if (= win_result 1) 0 (= win_result 0) (lsh amount -1) amount) (if (!= split correct_split) (list SLASH (indices_to_bitfield bob_picks)) (list MAKE_MOVE diff --git a/clsp/calpoker_include_calpoker_factory.hex b/clsp/calpoker_include_calpoker_factory.hex index 7fe7c69a..9411645f 100644 --- a/clsp/calpoker_include_calpoker_factory.hex +++ b/clsp/calpoker_include_calpoker_factory.hex @@ -1 +1 @@ -ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820206ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82025effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82025effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82025effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff82034effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820206ffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82030effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ff82025effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff8203aeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffffff02ff820306ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820306ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82028effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8202eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82030effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82038effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82028effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82038effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82024effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82024effff04ff02ffff04ff07ff80808080ff80808080ffff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff82022effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffffffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0180ffff04ffff02ff82022effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82022effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ff05ff02ffff03ff0bffff01ff02ffff01ff02ff82026effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8202eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82021effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffffffffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82021effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82029effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82029effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82039effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82039effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file +ff02ffff01ff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff04ffff01ff80ffffffffffffff02ff820282ffff04ff02ffff04ff03ffff04ffff11ff05ff0b80ffff04ffff02ff82030affff04ff02ff808080ff808080808080ffff02ffff03ffff09ff15ffff05ffff14ff09ffff0102808080ffff01ff02ffff01ff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ff1780ffff04ffff0180ffff04ff15ffff04ff0bffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff04ffff04ffff04ffff0180ffff04ff09ffff04ffff05ffff06ff178080ffff04ffff0180ffff04ff0bffff04ff15ffff04ffff02ff8203feffff04ff02ffff04ff17ff80808080ffff04ffff0180ffff04ffff0180ffff04ffff02ff8203faffff04ff02ffff04ff17ff80808080ffff04ffff05ffff14ff09ffff01028080ffff01808080808080808080808080ffff018080ffff01808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820382ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffffff02ff820342ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff8202c2ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffffffff02ff820322ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820382ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8203a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203a280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff820106ffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff820106ffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffff02ff8203e2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff820212ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffffffffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82031280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ffff01ff8080808080ff04ffff0eff09ff15ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff8080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82039280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ff02ff820252ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82035280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff8203a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ffff02ff8203d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82023280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ffffffff02ff820332ffff04ff02ffff04ff03ffff04ffff02ff820382ffff04ff02ffff04ff2fff80808080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202b280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff820106ffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff820106ffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82024680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ff02ff82020affff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ffffffffffff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ff04ffff04ffff0102ffff04ffff04ffff0101ff82024280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8203a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202f6ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202f6ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8202feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820356ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff82033effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff01808200bdffffffffffff02ff820286ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820286ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820286ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ff19ffff17ff09ffff010480ff0d80ffffff02ff820346ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff820226ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ff04ffff04ff1bff8080ffff04ff13ff808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff8202c6ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ff02ff8202a6ffff04ff02ffff04ff03ffff04ffff02ff8202c6ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff8202e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff8202c6ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff820366ffff04ff02ffff04ff03ffff04ffff02ff8202c6ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ff04ff25ffff04ffff02ff820216ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ffff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff8202e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8202e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820316ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820216ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820216ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff820256ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820386ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820256ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820386ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820256ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff8203d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820396ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82033680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ff18ff0bffff010f80ffff02ff8203b6ffff04ff02ffff04ff03ffff04ffff02ff820376ffff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820296ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820296ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff820276ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff05ffff06ffff02ff8203f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff82020effff04ff02ffff04ffff06ff0180ffff04ffff02ff8203f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82030effff04ff02ffff04ffff06ff0180ffff04ffff02ff8203f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ffffffffffff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ff8202deffff04ff02ffff04ff80ffff04ff05ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ff8202deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff82035effff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82023effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8202beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82027effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff8203beffff04ff02ffff04ff03ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff82033effff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ff02ff8203deffff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ffffff02ff82037effff04ff02ffff04ff05ffff01ff80ff8080808080ff02ffff03ff05ffff01ff02ffff01ff02ff82037effff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ffff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8202feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff018082017dff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_factory_hash.hex b/clsp/calpoker_include_calpoker_factory_hash.hex index 602b357a..f81db3b4 100644 --- a/clsp/calpoker_include_calpoker_factory_hash.hex +++ b/clsp/calpoker_include_calpoker_factory_hash.hex @@ -1 +1 @@ -a0a07cda5341b560576c5c96a49d69b119ba39823e1534ed6073be6580c003c303 \ No newline at end of file +a0f093ebbb30e63030a4f582d99b87160a3e5b0996eacb3d4e79da782a1f99cd73 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template.hex b/clsp/calpoker_include_calpoker_template.hex index ffb36583..061c48a0 100644 --- a/clsp/calpoker_include_calpoker_template.hex +++ b/clsp/calpoker_include_calpoker_template.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ff80808080ff04ffff0effff02ff82035effff04ff02ffff04ffff018a4d595f53414c54206973ffff04ff09ff8080808080ffff02ff82035effff04ff02ffff04ffff018c4d595f5049434b5320617265ffff04ff15ff8080808080ffff02ff82035effff04ff02ffff04ffff018e6d795f73656c6563747320617265ffff04ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff80808080ff808080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8202ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82028effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8202eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ff82035effff04ff02ffff04ffff04ffff01a3626f6220647269766572206520636865636b696e6720636f72726563742073706c6974ffff04ff0bffff04ff8217c1ffff04ff820081ff8080808080ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff820376ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82026effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ae80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82029effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820256ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203ce80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820216ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ffff02ff820396ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820396ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ffffff02ff820356ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82038effff04ff02ffff04ffff02ff820296ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ffff02ff820336ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203d680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff8203eeffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ff17ff0bffff0181fc80ffffffff18ff0bffff010f80ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff820276ffff04ff02ff0b8080ff8080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820316ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820316ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff8203b6ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffffff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ff05ffff06ffff02ff8202f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ffff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff8203f6ffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8202f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffffffffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82028effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82024effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82038effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82024effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82024effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff82034effff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ffff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff82034effff04ff02ffff04ff07ff80808080ff80808080ff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ffffffff09ffff02ff82032effff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff82032effff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff82032effff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff018005ffffff02ffff03ff0bffff01ff02ffff01ff02ff82036effff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82026effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff8203eeffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffffffff02ff82031effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82031effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ff82039effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82039effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82025effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ff02ffff03ffff22ffff0187247072696e7424ff05ff0b80ffff01ff02ffff010bff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82025effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ffff01ff80ffffffffffffff02ff8203aaffff04ff02ffff04ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff19ffff05ff0580ffff17ffff02ff820102ffff04ff02ffff04ffff06ff0580ff80808080ffff01018080ff018080ff0180ff80808080ffff02ff820382ffff04ff02ffff04ff03ffff04ffff0cff5fff80ffff011080ff8080808080ff02ff820242ffff04ff02ffff04ff03ffff04ffff0bff0b80ff8080808080ffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ff2bffff0bffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff02ff02ffff04ff02ffff04ffff04ff17ffff04ff13ffff01808080ff808080808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011080ffff01ff02ffff01ff09ff5bffff013080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff02ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff02ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff04ff0bffff04ffff0110ffff04ffff05ffff14ff29ffff01028080ffff04ffff02ff8203ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff0bff808080808080ffff01ff808080808080808080ff04ff80ffff04ffff02ff8203caffff04ff02ffff04ffff0bff05ff5fff1780ff80808080ffff04ffff02ff8203ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202c280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff04ff5fff808080808080ffff04ff05ff8080808080ffff02ff8203c2ffff04ff02ffff04ff03ffff04ffff0cff82017fff80ffff011080ffff04ffff02ff820102ffff04ff02ffff04ff17ff80808080ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bff05ff0bff2f80ff80808080ff80808080808080ff02ff820222ffff04ff02ffff04ff03ffff04ffff0bffff0eff0bff178080ff8080808080ffffffff04ffff0eff11ff0b80ffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff010180ffff01ff02ffff01ff02ffff03ffff09ffff02ff04ffff04ff02ffff04ff13ff80808080ffff010480ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff02ff06ffff04ff02ffff04ffff04ff13ffff04ff27ffff04ff57ffff0180808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff011280ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff04ffff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ffff05ff0580ff80808080ffff02ff06ffff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff04ffff04ff5dffff04ff0bff808080ffff04ffff0101ffff04ffff05ffff14ff8200b9ffff01028080ffff04ffff02ff8203ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff15ffff04ff2dff808080808080ffff01ff808080808080808080ff02ff8202a2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff5fffff04ff82014fff8080808080ffff04ffff02ff8203faffff04ff02ffff04ff0bffff04ff818fff8080808080ff808080808080ffff02ff8203a2ffff04ff02ffff04ff03ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82038effff04ff02ffff04ff13ffff04ff57ff8080808080ffff01ff808080808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82038effff04ff02ffff04ff27ffff04ff2bff8080808080ffff01ff808080808080ff808080808080ff02ff820262ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ff808080808080ffffff02ff820362ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ff27ffff04ff13ff8080808080ff8080808080ff02ff8202e2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820161ffff0181ff80ff0180ffff01ff02ffff01820161ff018080ff0180ff018080ff0180ff8080808080ffff04ff80ffff04ffff04ff820bc1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff15ff80808080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203e280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff820081ffff04ff820141ffff04ff820159ffff04ff0bffff04ff8202c1ff80808080808080ffff01ff01808080ff80808080ffff01ff8080808080ff04ffff0eff09ff15ffff02ff8203aaffff04ff02ffff04ffff02ff82038affff04ff02ffff04ff2dff80808080ff8080808080ffff04ff80ffff04ff80ffff04ff80ffff04ff80ffff04ff5dffff01ff80ff8080808080808080ffffffff04ff80ffff04ff80ffff04ffff02ff8203ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82029280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ff8080808080ffff01ff8080808080ffff02ff820392ffff04ff02ffff04ff03ffff04ffff0cff8200bfff80ffff011080ff8080808080ff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff09ffff0dff1380ffff013080ffff01ff02ffff01ff02ffff03ffff09ffff0bffff0cff13ffff0180ffff01108080ff2780ffff01ff02ffff01ff02ffff03ffff09ff2bffff0bffff01a0dac9b3641c1ff33d6b7bb565ad5055b5fb24d503774af3c5b978207e24dd5cedffff02ff3effff04ff02ffff04ffff04ffff02ff3cffff04ff02ffff04ffff0bffff0cff13ffff0180ffff011080ff57ff8205fb80ff80808080ffff04ffff0cff13ffff0110ffff013080ffff01808080ff808080808080ffff01ff02ffff01ff09ff8217fbffff010180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff38ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff14ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffff02ff2cffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ffff04ffff02ff3affff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ff02ff12ffff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ffffff02ff2affff04ff02ffff04ff03ffff04ffff02ff10ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffff04ff25ffff04ffff02ff36ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ff0bffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff3affff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff3affff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff02ff2effff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff02ffff03ff09ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff36ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff0bffff02ff36ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff02ffff03ffff07ff0580ffff01ff02ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ffff05ff0580ff80808080ffff02ff3effff04ff02ffff04ffff06ff0580ff8080808080ff0180ffff01ff02ffff01ff0bffff0101ff0580ff018080ff0180ff018080ffff04ffff01a0142453e408bc4d8782fa52ab4f692f3bca82a781a90d6466baaee38a48a1c386ffff04ffff04ff09ffff04ff0bff808080ffff04ffff0130ffff04ffff05ffff14ff2dffff01028080ffff04ffff02ff8203ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82025280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bff8080808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff8202aa80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ff808080808080808080ffffff02ff820352ffff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ffff0bffff0cff2fff80ffff011080ff05ff0b80ff80808080ff8080808080ff02ff8202d2ffff04ff02ffff04ff03ffff04ffff02ff82032affff04ff02ffff04ff2bff80808080ff8080808080ffff04ff80ffff04ffff04ffff02ff82032affff04ff02ffff04ff25ff80808080ffff04ff0bff808080ffff04ffff02ff8203ceffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff8203d280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff25ffff04ff55ffff04ffff0cff8200b9ffff0110ffff0dff8200b98080ff80808080808080ffff01ff8080808080ff02ff820232ffff04ff02ffff04ff03ffff04ffff02ff820102ffff04ff02ffff04ff2fff80808080ff8080808080ffffffff04ff0bffff04ffff01ff02ffff01ff02ffff03ffff02ffff03ffff04ffff0187706f6b65722065ffff04ff13ffff01808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff1380ffff011280ffff01ff02ffff01ff02ff6effff04ff02ffff04ffff06ff0180ffff04ffff0cff13ffff0180ffff011180ffff04ffff0cff13ffff0110ffff011180ffff04ffff0cff13ffff0111ffff011280ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff04ffff01ffffffffff02ffff03ffff09ffff02ff4effff04ff02ffff04ff05ff80808080ffff010580ffff01ff02ffff01ff02ff50ffff04ff02ff038080ff0180ffff01ff02ffff01ff0880ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff04ffff02ff78ffff04ff02ffff04ffff05ff0b80ff80808080ffff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff808080808080ff0180ffff01ff02ffff01ff02ff20ffff04ff02ffff04ffff17ffff0181ffff0580ffff04ffff06ff0b80ff8080808080ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff28ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff28ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff24ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff4cffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff4cffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff4cffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff0180ffff01ff02ffff01ff04ffff02ff58ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff018080ff0180ff02ff5cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff7cffff04ff02ffff04ff03ffff04ffff02ff7affff04ff02ffff04ffff02ff74ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff72ffff04ff02ffff04ff03ffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff2280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff76ffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff5280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ffff18ff0bffff010f80ff02ff4affff04ff02ffff04ff03ffff04ffff02ff5affff04ff02ff0b8080ff8080808080ffffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff54ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff54ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff6affff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff01807fffff02ffff03ffff09ff05ffff010180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0dffff01ff02ffff01ff02ffff03ff1dffff01ff02ffff01ff02ff26ffff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff7affff04ff02ffff04ff3dff80808080ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff26ffff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff26ffff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff0180ffff01ff02ffff0105ff018080ff0180ff0180ffff01ff02ffff010bff018080ff0180ffff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff56ffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff76ffff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ffffff02ffff03ff05ffff01ff02ffff01ff10ffff18ff05ffff010180ffff02ff4effff04ff02ffff04ffff17ff05ffff0181ff80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff5effff04ff02ffff04ff03ffff04ffff02ff28ffff04ff02ffff04ff4dffff04ff8202adffff02ff70ffff04ff02ffff04ff17ffff04ff82012dff808080808080808080ff8080808080ffff02ff7effff04ff02ffff04ff03ffff04ffff02ff56ffff04ff02ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff5dffff04ff13ff8080808080ff80808080ffff04ffff02ff6cffff04ff02ffff04ffff02ff20ffff04ff02ffff04ff8205f9ffff04ff2bff8080808080ff80808080ff8080808080ff8080808080ff02ffff03ffff02ffff03ffff09ffff0bff29ff8205b18080ffff01ff02ffff01ff02ffff03ffff09ffff02ff4effff04ff02ffff04ff59ff80808080ffff010480ffff01ff02ffff01ff20ffff15ff8202d1ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff05ffff14ff822fd1ffff01028080ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01822fd1ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff01808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ffff04ffff01a08d85de470a5bff6cdab35d73f9b40ee01c64ee70237af68a4d5e41d43a1eda37ffff04ffff04ff0bffff04ffff04ff09ffff04ff15ff808080ffff04ff2dff80808080ffff04ffff0112ffff04ffff05ffff14ff8200bdffff01028080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82033280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff808080808080808080ff02ff8202b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff13ffff04ff8200abff8080808080ffff04ffff0cff17ffff0111ffff0dff178080ffff04ffff0cff17ffff0110ffff011180ff80808080808080ffff02ff8203b2ffff04ff02ffff04ff03ffff04ffff02ff8203faffff04ff02ffff04ff2fffff04ff820095ff8080808080ff8080808080ff02ff820272ffff04ff02ffff04ff03ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82038effff04ff02ffff04ff25ffff04ff2bff8080808080ffff01ff808080808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82038680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82038effff04ff02ffff04ff13ffff04ff55ff8080808080ffff01ff808080808080ff808080808080ffffff02ff820372ffff04ff02ffff04ff03ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff17ffff01ff808080808080ff80808080ffff04ffff02ff8202eaffff04ff02ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82028a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff80808080ff808080808080ff02ff8202f2ffff04ff02ffff04ff03ffff04ffff02ff8203eeffff04ff02ffff04ff13ffff04ff27ff8080808080ff8080808080ffff02ff8203f2ffff04ff02ffff04ff03ffff04ffff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff018080ffff01ff02ffff01ff17ff820081ffff0181ff80ff0180ffff01ff02ffff01820081ff018080ff0180ff018080ff0180ff8080808080ff02ffff03ffff20ffff09ff822f81ff0b8080ffff01ff02ffff01ff04ffff0102ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff01808080ff0180ffff01ff02ffff01ff04ffff0180ffff04ffff04ff8205c1ffff04ffff02ff82038affff04ff02ffff04ff820159ff80808080ffff04ffff02ff82038affff04ff02ffff04ff8200a9ff80808080ffff04ff820099ffff04ff49ffff04ff822f81ffff0180808080808080ffff01808080ff018080ff0180ffffffffff04ffff04ffff0102ffff04ffff04ffff0101ff82028280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ffff0102ffff04ffff04ffff0101ff82011280ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff01ff80ff8200c8ff20ffff02ffff03ffff02ffff03ffff09ff15ffff0bffff01a0d0ae87434a55a2af35392fb6563e06d617b0925d536ace533c72e512c2284a40ffff0bffff0101ff09808080ffff01ff02ffff01ff02ffff03ffff09ffff0dff0980ffff012080ffff01ff02ffff01ff09ff2dffff011080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ffff01ff02ffff01ff0880ff0180ffff01ff02ffff01ff0180ff018080ff0180ffa0c06d35558386abdd6de5d252f8d28ecb4a4d4f512fe44bdc7160518a73fa6417ff80ff64808080ffff04ff09ff1580ff02ff8203aaffff04ff02ffff04ffff02ff82024affff04ff02ffff04ff05ffff01ff8080808080ff80808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff19ffff0101ffff17ffff02ff82024affff04ff02ffff04ffff06ff0580ffff04ffff10ff0bffff010180ff8080808080ffff01018080ff0180ffff01ff02ffff01ff17ffff02ff82024affff04ff02ffff04ff05ffff04ffff10ff0bffff010180ff8080808080ffff010180ff018080ff0180ff018080ff0180ff02ff8202caffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffff02ffff03ffff09ff13ffff010c80ffff01ff02ffff01ff04ffff0101ffff04ffff10ffff0101ff1b80ffff01808080ff0180ffff01ff02ffff01ff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ffff01808080ff018080ff0180ff02ff82022affff04ff02ffff04ff03ffff04ffff02ff8202a6ffff04ff02ffff04ff05ff80808080ff8080808080ffffffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff13ffff01ff808080808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bffff01ff808080808080ff808080ff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82034a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ffff01ff808080808080ffff02ffff03ffff09ffff0bff0580ff1380ffff01ff02ffff01ff02ff8203caffff04ff02ffff04ffff0bffff0cff05ffff0180ffff011080ffff0cff2bffff0180ffff011080ff1780ff80808080ff0180ffff01ff02ffff01ff0880ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff02ff82026affff04ff02ffff04ffff06ff0180ffff04ffff0dff0580ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ffffff0cff09ffff11ff0bffff010180ff0b80ff02ffff03ffff09ff17ffff010580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff09ff17ffff010480ffff09ff0bffff01058080ffff01ff02ffff01ff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff2f80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff82008fffff11ff0bff178080ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff0bffff04ffff10ffff0101ff1780ffff04ffff06ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82036affff04ff02ffff04ff05ffff04ff82008fffff04ffff0101ffff04ffff06ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff02ff82031affff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203ea80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82031effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82021a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff05ff8080808080ff8080808080ff808080808080ff04ff13ffff04ff1bffff04ff17ff80808080ffffffffff04ff1bffff04ff13ffff04ff17ff80808080ff02ff82039affff04ff02ffff04ff03ffff04ffff02ff82037affff04ff02ffff04ff0bff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82029a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202f6ffff04ff02ffff04ff0bff80808080ff8080808080ff8080808080ffff01ff808080808080ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82032e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff8202f6ffff04ff02ffff04ff17ff80808080ff8080808080ff80808080808080ff8200bbff02ff82035affff04ff02ffff04ff03ffff04ffff02ffff03ffff15ffff0105ff82008f80ffff01ff02ffff01ff04ffff0180ffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82025a80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff04ffff0101ff80808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff018080ffff04ffff0101ffff0180808080ffff0180808080ffff04ffff02ff8203feffff04ff02ffff04ffff0105ffff04ff2fff8080808080ffff04ffff0180ff808080808080ffff04ffff02ff82037affff04ff02ffff04ffff02ff82027affff04ff02ffff04ff82014fffff04ff2fff8080808080ff80808080ffff01808080ff018080ff0180ff8080808080ffff8200bbff02ff8202daffff04ff02ffff04ff03ffff04ffff02ff82036effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82026e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff04ff2dffff04ff15ffff04ff13ffff04ff2bff8080808080ffff01ff808080808080ff8080808080ffff02ff82023affff04ff02ffff04ff03ffff04ffff02ff82039effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff8203da80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff04ffff04ffff0104ffff04ffff04ffff0101ffff04ff41ff808080ffff01ff01808080ff80808080ffff04ff0bffff01ff808080808080ff8080808080ff8080808080ff04ffff02ff820356ffff04ff02ffff04ffff02ff82033affff04ff02ffff04ff0bffff04ff09ff8080808080ff80808080ffff04ff0bff808080ffffffff04ff13ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff2bff8080808080ff808080ff02ff8202baffff04ff02ffff04ff80ffff04ffff02ff8202beffff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ff82022e80ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff80808080ffff04ff05ff8080808080ffff04ff0bff808080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff1780ffff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ffff06ff0b80ffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff02ff8202baffff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff05ff2380ffff01ff02ffff01ff04ff8200b3ffff02ff8203baffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff02ff8203baffff04ff02ffff04ff05ffff04ff1bff8080808080ff018080ff0180ff018080ff0180ffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ffff09ff05ff538080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff04ffff04ff8200b3ffff04ff53ffff04ff820173ffff0180808080ffff02ff82027affff04ff02ffff04ff05ffff04ff1bff808080808080ff018080ff0180ff018080ff0180ff02ff8202faffff04ff02ffff04ff03ffff04ffff02ff82036affff04ff02ffff04ffff09ff11ffff010e80ffff04ff80ffff04ff80ffff04ff05ff80808080808080ff8080808080ffff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff0bffff010580ffff01ff02ffff01ff04ff8200b1ffff02ff8203baffff04ff02ffff04ffff0105ffff04ff09ff808080808080ff0180ffff01ff02ffff01ff02ff8203feffff04ff02ffff04ffff0105ffff04ffff02ff8203baffff04ff02ffff04ff0bffff04ff09ff8080808080ff8080808080ff018080ff0180ff018080ff0180ff02ff820106ffff04ff02ffff04ff05ffff04ff0bffff01ff80ff808080808080ffffffffffff02ffff03ffff20ff0b80ffff01ff02ffff01ff04ff17ffff04ff2fffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff18ff05ffff010180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff820106ffff04ff02ffff04ffff17ff05ffff0181ff80ffff04ffff06ff0b80ffff04ffff04ffff05ff0b80ff1780ffff04ff2fff80808080808080ff018080ff0180ff018080ff0180ffff19ffff17ff09ffff010480ff0d80ff02ff820246ffff04ff02ffff04ff03ffff04ffff14ff05ffff010480ff8080808080ffffff04ffff10ffff0102ff1380ffff04ffff10ffff0101ff1b80ff808080ff02ffff03ffff09ff0bffff010180ffff01ff02ffff01ff02ff8202c6ffff04ff02ffff04ffff06ff0180ffff04ffff14ff17ff0580ff8080808080ff0180ffff01ff02ffff01ff02ff8203c6ffff04ff02ffff04ffff06ff0180ffff04ffff17ff0bffff0181ff80ff8080808080ff018080ff0180ffff04ffff04ff1bff8080ffff04ff13ff808080ff02ff820226ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ff09ffff04ff0bffff04ff2dff808080808080ff8080808080ffffffff02ff820326ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff11ff11ff1580ffff04ffff11ff29ff1580ffff04ff2bff808080808080ff8080808080ff04ffff02ff820366ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ffff04ff2bff808080ffff02ff8203a6ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff0134ffff04ffff0108ffff04ff05ff808080808080ff8080808080ff02ff820266ffff04ff02ffff04ff03ffff04ffff02ff820346ffff04ff02ffff04ffff012cffff04ffff0108ffff04ff2bff808080808080ff8080808080ffffff04ff25ffff04ffff02ff8203e6ffff04ff02ffff04ff25ffff04ff13ffff01ff808080808080ff808080ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ff8202e6ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff04ffff05ff0980ffff02ff820366ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff80808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff820366ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0b80ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ff820116ffff04ff02ffff04ffff06ff0180ffff04ffff10ffff05ff0b80ff1780ff8080808080ff018080ff0180ffffffff02ffff03ffff20ff0980ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ffff0180ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ffff15ffff05ff0980ff0b8080ffff01ff02ffff01ff02ff8203e6ffff04ff02ffff04ffff06ff0980ffff04ff15ffff04ffff10ff2dffff010180ff808080808080ff0180ffff01ff02ffff01ff04ff0bffff02ff8203e6ffff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff018080ff0180ff018080ff0180ffff18ffff09ff0dff1b80ffff09ff0dff3780ffff09ff0dff6f80ffff09ff0dff8200df8080ff02ff820256ffff04ff02ffff04ff05ffff04ff09ffff01ff808080808080ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff018080ff0180ffff01ff02ffff01ff02ffff03ffff09ffff05ff0580ff0b80ffff01ff02ffff01ff02ff820256ffff04ff02ffff04ffff06ff0580ffff04ff0bffff04ffff10ff17ffff010180ff808080808080ff0180ffff01ff02ffff01ff04ffff02ff820286ffff04ff02ffff04ffff04ff17ff0b80ff80808080ffff02ff820256ffff04ff02ffff04ffff06ff0580ffff04ffff05ff0580ffff04ffff0101ff80808080808080ff018080ff0180ff018080ff0180ff02ff8202d6ffff04ff02ffff04ff03ffff04ffff02ff82024effff04ff02ffff04ffff04ff11ffff04ff25ffff04ff4dffff04ff82009dffff04ff82013dff808080808080ff80808080ff8080808080ffff02ff8203d6ffff04ff02ffff04ff03ffff04ffff02ff82024effff04ff02ffff04ffff02ff820396ffff04ff02ffff04ff0bff80808080ff80808080ff8080808080ff02ff8202b6ffff04ff02ffff04ff03ffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82023680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff04ffff02ff82021effff04ff02ffff04ffff04ffff0102ffff04ffff04ffff0101ffff04ffff0102ffff04ffff04ffff0101ff82033680ffff04ffff04ffff0104ffff04ffff04ffff0101ff0280ffff01ff01808080ff8080808080ffff01ffff04ffff0180ff0180808080ffff04ff0bffff01ff808080808080ff808080808080ff8080808080ffffffff17ff0bffff0181fc80ff18ff0bffff010f80ffff02ff8203b6ffff04ff02ffff04ff03ffff04ffff02ff820376ffff04ff02ff0b8080ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff02ff820296ffff04ff02ff418080ffff01ff02ffff01ff04ffff0105ffff04ff0bffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff19ffff09ffff05ff1580ffff010480ffff18ffff09ffff05ff1580ffff010380ffff09ffff05ffff06ff158080ffff0102808080ffff01ff02ffff0115ff0180ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0102ffff04ff0bffff018080808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff18ffff02ff820296ffff04ff02ff418080ffff19ffff15ffff0103ffff05ff158080ffff18ffff09ffff05ff1580ffff010380ffff15ffff0102ffff05ffff06ff15808080808080ffff01ff02ffff01ff04ffff0103ffff04ffff0101ffff04ffff0103ffff04ffff02ff820276ffff04ff02ff158080ffff018080808080ff0180ffff01ff02ffff0115ff018080ff0180ff018080ff0180ffff7fff02ffff03ffff20ffff09ff05ffff01018080ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff09ff820bffffff11ff8200bfffff01048080ffff01ff02ffff018200bfff0180ffff01ff02ffff01ff02ffff03ffff09ff8200bfffff010e80ffff01ff02ffff01ff12ffff09ff82017fffff010580ffff010580ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080ff0180ff018080ff0180ffff05ffff06ffff02ff8203f6ffff04ff02ffff04ff80ffff04ff80ffff04ff05ff8080808080808080ff02ffff03ffff20ff1780ffff01ff02ffff01ff04ff0bffff04ffff0180ffff01808080ff0180ffff01ff02ffff01ff02ffff03ffff09ff47ff0580ffff01ff02ffff01ff02ff82010effff04ff02ffff04ffff06ff0180ffff04ffff02ff8203f6ffff04ff02ffff04ff05ffff04ffff10ffff0101ff0b80ffff04ff37ff808080808080ff8080808080ff0180ffff01ff02ffff01ff02ff82028effff04ff02ffff04ffff06ff0180ffff04ffff02ff8203f6ffff04ff02ffff04ff47ffff04ffff0101ffff04ff37ff808080808080ff8080808080ff018080ff0180ff018080ff0180ffffffffff04ff13ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ffff04ff15ffff04ffff04ffff04ff13ff4d80ff2b80ff808080ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82038effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffffff02ffff03ffff20ff0580ffff01ff02ffff01ff0180ff0180ffff01ff02ffff01ff02ffff03ffff20ff0d80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff20ff1d80ffff01ff02ffff01ff02ffff03ffff15ff09ff1580ffff01ff02ffff0105ff0180ffff01ff02ffff01ff04ff15ffff04ff09ffff01808080ff018080ff0180ff0180ffff01ff02ffff01ff02ff82034effff04ff02ffff04ffff02ffff03ffff15ff09ff1580ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff09ffff04ff15ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff09ffff04ff2dffff04ff15ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff09ffff04ff15ffff0180808080ff018080ff0180ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff15ff09ff2d80ffff01ff02ffff01ff04ff15ffff04ff09ffff04ff2dffff0180808080ff0180ffff01ff02ffff01ff02ffff03ffff15ff15ff2d80ffff01ff02ffff01ff04ff15ffff04ff2dffff04ff09ffff0180808080ff0180ffff01ff02ffff01ff04ff2dffff04ff15ffff04ff09ffff0180808080ff018080ff0180ff018080ff0180ff018080ff0180ffff04ffff02ff82024effff04ff02ffff04ff3dff80808080ff8080808080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ffff20ff0580ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff20ff0b80ffff01ff02ffff0105ff0180ffff01ff02ffff01ff02ffff03ffff15ffff05ff0580ffff05ff0b8080ffff01ff02ffff01ff04ffff05ff0580ffff02ff82034effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff01ff04ffff05ff0b80ffff02ff82034effff04ff02ffff04ff05ffff04ffff06ff0b80ff808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ffff20ff0580ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff04ffff0104ffff04ffff04ffff0101ffff05ff058080ffff04ffff02ff8202ceffff04ff02ffff04ffff06ff0580ff80808080ffff0180808080ff018080ff0180ff04ffff0102ffff04ffff04ffff0101ff0580ffff04ffff02ff8202ceffff04ff02ffff04ff07ff80808080ff80808080ffffffff09ffff02ff8202aeffff04ff02ffff04ff05ffff04ff0bff8080808080ffff0181ff80ff09ffff02ff8202aeffff04ff02ffff04ff05ffff04ff0bff8080808080ffff010180ffff02ffff03ffff07ff0580ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff02ff8203aeffff04ff02ffff04ffff06ff0180ffff04ffff02ff8202aeffff04ff02ffff04ffff05ff0580ffff04ffff05ff0b80ff8080808080ff8080808080ff0180ffff01ff02ffff01ff0101ff018080ff0180ff0180ffff01ff02ffff01ff02ffff03ffff07ff0b80ffff01ff02ffff01ff0181ffff0180ffff01ff02ffff01ff02ffff03ffff15ff05ff0b80ffff01ff02ffff01ff0101ff0180ffff01ff02ffff01ff11ffff0180ffff15ff0bff058080ff018080ff0180ff018080ff0180ff018080ff0180ff02ffff03ff0bffff01ff02ffff010bff0180ffff01ff02ffff01ff02ff8202aeffff04ff02ffff04ffff06ff0980ffff04ffff06ff1580ff8080808080ff018080ff0180ffff05ff02ffff03ff0bffff01ff02ffff01ff02ff8202eeffff04ff02ffff04ffff06ff0180ffff04ffff02ff05ffff04ffff05ff0b80ffff01808080ff8080808080ff0180ffff01ff02ffff0117ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff04ff0bffff02ff82036effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff80808080808080ff0180ffff01ff02ffff01ff02ff82036effff04ff02ffff04ff09ffff04ffff06ff1580ffff04ff2dff808080808080ff018080ff0180ff02ffff03ffff09ff09ff1380ffff01ff02ffff01ff02ffff03ffff06ff0580ffff01ff02ffff01ff02ff8203eeffff04ff02ffff04ffff06ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff0180ffff01ff02ffff01ff11ffff12ffff0102ffff15ffff05ff0580ffff05ff0b808080ffff010180ff018080ff0180ffffffffff02ffff03ff0bffff01ff02ffff01ff04ffff02ff05ffff04ffff05ff0b80ffff01808080ffff02ff82021effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ff80808080808080ff0180ffff01ff02ffff0117ff018080ff0180ff02ff82029effff04ff02ffff04ff80ffff04ff05ffff04ff0bff808080808080ffff02ffff03ff17ffff01ff02ffff01ff04ffff02ff0bffff04ffff05ff1780ffff04ff05ffff0180808080ffff02ff82029effff04ff02ffff04ffff10ffff0101ff0580ffff04ff0bffff04ffff06ff1780ff80808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82025effff04ff02ffff04ff05ffff04ff13ffff04ff1bff808080808080ffffff02ffff03ffff20ff1780ffff01ff02ffff010bff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ff0bffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ffff05ff1780ffff04ffff06ff1780ff808080808080ff0180ffff01ff02ffff01ff02ff82025effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ff808080808080ff018080ff0180ff018080ff0180ff02ffff03ff05ffff01ff02ffff01ff04ffff05ff0580ffff02ff82035effff04ff02ffff04ffff06ff0580ffff04ff0bff808080808080ff0180ffff01ff02ffff010bff018080ff0180ffff02ff8203deffff04ff02ffff04ff80ffff04ff05ff8080808080ff02ffff03ff0bffff01ff02ffff01ff02ff8203deffff04ff02ffff04ffff04ffff05ff0b80ff0580ffff04ffff06ff0b80ff8080808080ff0180ffff01ff02ffff0105ff018080ff0180ffffffff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff01ff80808080808080ff02ffff03ffff20ff0b80ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff17ff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff20ff1780ffff01ff02ffff01ff02ff82035effff04ff02ffff04ffff02ff8202deffff04ff02ffff04ff2fff80808080ffff04ff0bff8080808080ff0180ffff01ff02ffff01ff02ffff03ffff02ff05ffff04ffff05ff0b80ffff04ffff05ff1780ffff0180808080ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ffff06ff0b80ffff04ff17ffff04ffff04ffff05ff0b80ff2f80ff80808080808080ff0180ffff01ff02ffff01ff02ff82033effff04ff02ffff04ff05ffff04ff0bffff04ffff06ff1780ffff04ffff04ffff05ff1780ff2f80ff80808080808080ff018080ff0180ff018080ff0180ff018080ff0180ffff02ffff03ff0bffff01ff02ffff01ff02ffff03ffff06ff0b80ffff01ff02ffff01ff02ff8203beffff04ff02ffff04ffff06ff0180ffff04ffff02ff82037effff04ff02ffff04ff0bff80808080ff8080808080ff0180ffff01ff02ffff010bff018080ff0180ff0180ffff01ff02ffff01ff0180ff018080ff0180ff02ff82027effff04ff02ffff04ff03ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff13ff8080808080ffff04ffff02ff8202beffff04ff02ffff04ff09ffff04ff2bff8080808080ff808080808080ffffff02ff82023effff04ff02ffff04ff11ffff04ff0bffff04ff17ff808080808080ff02ff8202feffff04ff02ffff04ff05ffff01ff80ff8080808080ffff02ffff03ff05ffff01ff02ffff01ff02ff8202feffff04ff02ffff04ffff06ff0580ffff04ff17ffff04ffff04ffff05ff0580ff0b80ff808080808080ff0180ffff01ff02ffff01ff06ff0380ff018080ff0180ff02ffff03ffff22ff05ff0b80ffff01ff02ffff01ff04ff13ffff02ff8203feffff04ff02ffff04ffff11ff05ffff010180ffff04ff1bff808080808080ff0180ffff01ff02ffff01ff0180ff018080ff0180ff018080 \ No newline at end of file diff --git a/clsp/calpoker_include_calpoker_template_hash.hex b/clsp/calpoker_include_calpoker_template_hash.hex index 13f669e2..4be8a525 100644 --- a/clsp/calpoker_include_calpoker_template_hash.hex +++ b/clsp/calpoker_include_calpoker_template_hash.hex @@ -1 +1 @@ -a09d859630738b733dc33bdfb243fdcc6bc69356e53ec29fd6704eb94e0eedb86c \ No newline at end of file +a08a51b40fc76cb43b94c5cb1bea47088727f4954ea9360f9afb9e78e9265fc957 \ No newline at end of file From 597ba9d0d99ec8a8dc68f1cf4b1a8b79debb67e0 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 21:52:59 -0800 Subject: [PATCH 43/50] Removing nodeptr from potentially stored values --- src/referee.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/referee.rs b/src/referee.rs index c3fd6d86..77773dc4 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -298,7 +298,7 @@ fn curry_referee_puzzle( /// is next to it. /// pub struct ValidatorMoveArgs { - pub state: NodePtr, + pub state: Program, pub mover_puzzle: Program, pub solution: NodePtr, pub evidence: NodePtr, @@ -306,8 +306,9 @@ pub struct ValidatorMoveArgs { impl ValidatorMoveArgs { pub fn to_nodeptr(&self, allocator: &mut AllocEncoder, me: NodePtr) -> Result { + let state_node = self.state.to_nodeptr(allocator)?; let args: &[NodePtr] = &[ - self.state, + state_node, me, self.mover_puzzle.to_clvm(allocator).into_gen()?, self.solution, @@ -1467,7 +1468,7 @@ impl RefereeMaker { referee_hash: new_puzzle_hash.clone(), move_args: ValidatorMoveArgs { evidence, - state: self.get_game_state().to_nodeptr(allocator)?, + state: self.get_game_state().clone(), mover_puzzle: self.fixed.my_identity.puzzle.to_program(), solution: self .fixed From a98dcf3f1fa577b4eb14c328fdb230fc59e9b9a3 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 22:05:53 -0800 Subject: [PATCH 44/50] Convert more clvm data to durable storage --- src/referee.rs | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/referee.rs b/src/referee.rs index 77773dc4..caa0e765 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -300,22 +300,20 @@ fn curry_referee_puzzle( pub struct ValidatorMoveArgs { pub state: Program, pub mover_puzzle: Program, - pub solution: NodePtr, - pub evidence: NodePtr, + pub solution: Program, + pub evidence: Program, } impl ValidatorMoveArgs { pub fn to_nodeptr(&self, allocator: &mut AllocEncoder, me: NodePtr) -> Result { - let state_node = self.state.to_nodeptr(allocator)?; - let args: &[NodePtr] = &[ - state_node, - me, - self.mover_puzzle.to_clvm(allocator).into_gen()?, - self.solution, - self.evidence, - ]; - let argvec: Vec = args.iter().map(|v| Node(*v)).collect(); - argvec.to_clvm(allocator).into_gen() + let me_program = Program::from_nodeptr(allocator, me)?; + [ + &self.state, + &me_program, + &self.mover_puzzle, + &self.solution, + &self.evidence, + ].to_clvm(allocator).into_gen() } } @@ -1452,6 +1450,17 @@ impl RefereeMaker { &puzzle_args, )?; + let solution = self + .fixed + .my_identity + .standard_solution( + allocator, + &[( + self.fixed.my_identity.puzzle_hash.clone(), + Amount::default(), + )], + )?; + let solution_program = Program::from_nodeptr(allocator, solution)?; let validator_move_args = InternalValidatorArgs { move_made: puzzle_args.game_move.basic.move_made.clone(), new_validation_info_hash: puzzle_args.game_move.validation_info_hash.clone(), @@ -1467,20 +1476,11 @@ impl RefereeMaker { max_move_size: puzzle_args.game_move.basic.max_move_size, referee_hash: new_puzzle_hash.clone(), move_args: ValidatorMoveArgs { - evidence, + evidence: Program::from_nodeptr(allocator, evidence)?, state: self.get_game_state().clone(), mover_puzzle: self.fixed.my_identity.puzzle.to_program(), - solution: self - .fixed - .my_identity - .standard_solution( - allocator, - &[( - self.fixed.my_identity.puzzle_hash.clone(), - Amount::default(), - )], - ) - .expect("should create"), + solution: solution_program, + }, }; let (_state, validation_program) = self.get_validation_program_for_their_move()?; From 95955b5d562559d3106ce70d715c86cb1e664da7 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 22:19:30 -0800 Subject: [PATCH 45/50] Convert more storage --- src/channel_handler/game.rs | 13 +++++++------ src/channel_handler/types.rs | 23 ++++++++++------------- src/referee.rs | 7 ++----- src/tests/channel_handler.rs | 3 ++- src/tests/referee.rs | 3 ++- src/tests/simenv.rs | 9 +++++---- 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/channel_handler/game.rs b/src/channel_handler/game.rs index c51180a5..54c63639 100644 --- a/src/channel_handler/game.rs +++ b/src/channel_handler/game.rs @@ -1,5 +1,5 @@ use clvm_traits::{ClvmEncoder, ToClvm}; -use clvmr::{run_program, NodePtr}; +use clvmr::run_program; use clvm_tools_rs::classic::clvm::sexp::proper_list; @@ -9,7 +9,7 @@ use crate::channel_handler::GameStartInfo; use crate::common::standard_coin::read_hex_puzzle; use crate::common::types::{ atom_from_clvm, chia_dialect, u64_from_atom, usize_from_atom, AllocEncoder, Amount, Error, - GameID, Hash, IntoErr, Timeout, + GameID, Hash, IntoErr, Program, Timeout, }; pub struct Game { @@ -21,7 +21,7 @@ pub struct Game { pub initial_max_move_size: usize, pub initial_validation_program: ValidationProgram, pub initial_validation_program_hash: Hash, - pub initial_state: NodePtr, + pub initial_state: Program, pub initial_mover_share_proportion: usize, } @@ -82,7 +82,8 @@ impl Game { "not an atom for initial_validation_hash".to_string(), )); }; - let initial_state = template_list[7]; + let initial_state_node = template_list[7]; + let initial_state = Program::from_nodeptr(allocator, initial_state_node)?; let initial_mover_share_proportion = atom_from_clvm(allocator, template_list[8]) .and_then(usize_from_atom) .expect("should be an atom"); @@ -123,7 +124,7 @@ impl Game { my_contribution_this_game: our_contribution.clone(), their_contribution_this_game: their_contribution.clone(), initial_validation_program: self.initial_validation_program.clone(), - initial_state: self.initial_state, + initial_state: self.initial_state.clone(), initial_move: vec![], initial_max_move_size: self.initial_max_move_size, initial_mover_share: mover_share, @@ -136,7 +137,7 @@ impl Game { my_contribution_this_game: their_contribution.clone(), their_contribution_this_game: our_contribution.clone(), initial_validation_program: self.initial_validation_program.clone(), - initial_state: self.initial_state, + initial_state: self.initial_state.clone(), initial_move: vec![], initial_max_move_size: self.initial_max_move_size, initial_mover_share: waiter_share, diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 841ac922..8cae0a00 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -75,7 +75,7 @@ pub struct PotatoSignatures { } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct GenericGameStartInfo { +pub struct GenericGameStartInfo { pub game_id: GameID, pub amount: Amount, pub game_handler: GameHandler, @@ -85,14 +85,14 @@ pub struct GenericGameStartInfo, pub initial_max_move_size: usize, pub initial_mover_share: Amount, } -pub type GameStartInfo = GenericGameStartInfo; -pub type FlatGameStartInfo = GenericGameStartInfo; +pub type GameStartInfo = GenericGameStartInfo; +pub type FlatGameStartInfo = GenericGameStartInfo; pub struct PrintableGameStartInfo<'a> { pub allocator: &'a mut Allocator, @@ -131,8 +131,8 @@ impl std::fmt::Debug for PrintableGameStartInfo<'_> { )?; writeln!( formatter, - "- initial_state: {}", - disassemble(self.allocator, self.info.initial_state, None) + "- initial_state: {:?}", + self.info.initial_state )?; writeln!(formatter, "- initial_move: {:?}", self.info.initial_move)?; writeln!( @@ -150,7 +150,7 @@ impl std::fmt::Debug for PrintableGameStartInfo<'_> { } } -impl GenericGameStartInfo { +impl GenericGameStartInfo { pub fn is_my_turn(&self) -> bool { matches!(self.game_handler, GameHandler::MyTurnHandler(_)) } @@ -167,8 +167,6 @@ impl GenericGameStartInfo { .into_gen()?; let initial_validation_program = ValidationProgram::new(allocator, initial_validation_program_nodeptr); - let initial_state_nodeptr = - node_from_bytes(allocator.allocator(), &serializable.initial_state.0).into_gen()?; Ok(GenericGameStartInfo { game_id: serializable.game_id.clone(), amount: serializable.amount.clone(), @@ -177,7 +175,7 @@ impl GenericGameStartInfo { my_contribution_this_game: serializable.my_contribution_this_game.clone(), their_contribution_this_game: serializable.their_contribution_this_game.clone(), initial_validation_program, - initial_state: initial_state_nodeptr, + initial_state: serializable.initial_state.clone(), initial_move: serializable.initial_move.clone(), initial_max_move_size: serializable.initial_max_move_size, initial_mover_share: serializable.initial_mover_share.clone(), @@ -190,7 +188,6 @@ impl GenericGameStartInfo { ) -> Result { let flat_validation_program = Program::from_nodeptr(allocator, self.initial_validation_program.to_nodeptr())?; - let flat_state = Program::from_nodeptr(allocator, self.initial_state)?; Ok(GenericGameStartInfo { game_id: self.game_id.clone(), @@ -200,7 +197,7 @@ impl GenericGameStartInfo { my_contribution_this_game: self.my_contribution_this_game.clone(), their_contribution_this_game: self.their_contribution_this_game.clone(), initial_validation_program: flat_validation_program, - initial_state: flat_state, + initial_state: self.initial_state.clone(), initial_move: self.initial_move.clone(), initial_max_move_size: self.initial_max_move_size, initial_mover_share: self.initial_mover_share.clone(), @@ -238,7 +235,7 @@ impl GenericGameStartInfo { let returned_their_contribution = Amount::from_clvm(allocator, lst[5])?; let validation_program = ValidationProgram::new(allocator, lst[6]); - let initial_state = lst[7]; + let initial_state = Program::from_nodeptr(allocator, lst[7])?; let initial_move = if let Some(a) = atom_from_clvm(allocator, lst[8]) { a.to_vec() } else { diff --git a/src/referee.rs b/src/referee.rs index caa0e765..c2f17ea3 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -657,8 +657,6 @@ impl RefereeMaker { move_made: game_start_info.initial_move.clone(), max_move_size: game_start_info.initial_max_move_size, }; - let initial_state_program = - Program::from_nodeptr(allocator, game_start_info.initial_state)?; let my_turn = game_start_info.game_handler.is_my_turn(); debug!("referee maker: my_turn {my_turn}"); @@ -699,7 +697,7 @@ impl RefereeMaker { ); } let state = Rc::new(RefereeMakerGameState::Initial { - initial_state: Rc::new(initial_state_program), + initial_state: Rc::new(game_start_info.initial_state.clone()), initial_validation_program: game_start_info.initial_validation_program.clone(), initial_puzzle_args: ref_puzzle_args.clone(), game_handler: game_start_info.game_handler.clone(), @@ -1281,7 +1279,6 @@ impl RefereeMaker { let args = self.spend_this_coin(); let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; - let state_node = self.get_game_state().to_nodeptr(allocator)?; let nil = allocator.allocator().null(); let prog = ValidationProgram::new(allocator, nil); debug!( @@ -1292,7 +1289,7 @@ impl RefereeMaker { game_handler: self.get_game_handler(), game_id: GameID::default(), amount: self.get_amount(), - initial_state: state_node, + initial_state: self.get_game_state().clone(), initial_max_move_size: args.game_move.basic.max_move_size, initial_move: args.game_move.basic.move_made.clone(), initial_mover_share: args.game_move.basic.mover_share.clone(), diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index b2b73966..d3be4f0b 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -131,7 +131,8 @@ fn test_smoke_can_start_game() { // Fake let game_handler = env.allocator.allocator().null(); let initial_validation_puzzle = game_handler; - let initial_state = env.allocator.allocator().null(); + let initial_state_node = env.allocator.allocator().null(); + let initial_state = Program::from_nodeptr(&mut env.allocator, initial_state_node).expect("should convert"); let initial_validation_program = ValidationProgram::new(env.allocator, initial_validation_puzzle); diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 8c3039c5..850759fe 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -189,7 +189,8 @@ fn test_referee_smoke() { let timeout = Timeout::new(1000); let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); - let init_state = ((), ()).to_clvm(&mut allocator).expect("should assemble"); + let init_state_node = ((), ()).to_clvm(&mut allocator).expect("should assemble"); + let init_state = Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index bb3445c4..bfff21b4 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -20,7 +20,7 @@ use crate::common::standard_coin::{ }; use crate::common::types::{ chia_dialect, AllocEncoder, Amount, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, - IntoErr, Node, PrivateKey, PuzzleHash, Sha256tree, Spend, Timeout, + IntoErr, Node, PrivateKey, Program, PuzzleHash, Sha256tree, Spend, Timeout, }; use crate::shutdown::get_conditions_with_channel_handler; use crate::simulator::Simulator; @@ -581,7 +581,8 @@ fn test_referee_can_slash_on_chain() { let timeout = Timeout::new(10); let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); - let init_state = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); + let init_state_node = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); + let init_state = Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); @@ -690,8 +691,8 @@ fn test_referee_can_move_on_chain() { let max_move_size = 100; let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); - let init_state = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); - + let init_state_node = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); + let init_state = Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); let my_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); From 4bf3bf2f71f2016237d954387d58a6821c8c09a1 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 22:19:44 -0800 Subject: [PATCH 46/50] fmt --- src/channel_handler/types.rs | 6 +----- src/referee.rs | 22 ++++++++++------------ src/tests/channel_handler.rs | 3 ++- src/tests/referee.rs | 3 ++- src/tests/simenv.rs | 6 ++++-- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 8cae0a00..7565833e 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -129,11 +129,7 @@ impl std::fmt::Debug for PrintableGameStartInfo<'_> { None ) )?; - writeln!( - formatter, - "- initial_state: {:?}", - self.info.initial_state - )?; + writeln!(formatter, "- initial_state: {:?}", self.info.initial_state)?; writeln!(formatter, "- initial_move: {:?}", self.info.initial_move)?; writeln!( formatter, diff --git a/src/referee.rs b/src/referee.rs index c2f17ea3..f3aaedbe 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -313,7 +313,9 @@ impl ValidatorMoveArgs { &self.mover_puzzle, &self.solution, &self.evidence, - ].to_clvm(allocator).into_gen() + ] + .to_clvm(allocator) + .into_gen() } } @@ -1447,16 +1449,13 @@ impl RefereeMaker { &puzzle_args, )?; - let solution = self - .fixed - .my_identity - .standard_solution( - allocator, - &[( - self.fixed.my_identity.puzzle_hash.clone(), - Amount::default(), - )], - )?; + let solution = self.fixed.my_identity.standard_solution( + allocator, + &[( + self.fixed.my_identity.puzzle_hash.clone(), + Amount::default(), + )], + )?; let solution_program = Program::from_nodeptr(allocator, solution)?; let validator_move_args = InternalValidatorArgs { move_made: puzzle_args.game_move.basic.move_made.clone(), @@ -1477,7 +1476,6 @@ impl RefereeMaker { state: self.get_game_state().clone(), mover_puzzle: self.fixed.my_identity.puzzle.to_program(), solution: solution_program, - }, }; let (_state, validation_program) = self.get_validation_program_for_their_move()?; diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index d3be4f0b..2269e67c 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -132,7 +132,8 @@ fn test_smoke_can_start_game() { let game_handler = env.allocator.allocator().null(); let initial_validation_puzzle = game_handler; let initial_state_node = env.allocator.allocator().null(); - let initial_state = Program::from_nodeptr(&mut env.allocator, initial_state_node).expect("should convert"); + let initial_state = + Program::from_nodeptr(&mut env.allocator, initial_state_node).expect("should convert"); let initial_validation_program = ValidationProgram::new(env.allocator, initial_validation_puzzle); diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 850759fe..f317472b 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -190,7 +190,8 @@ fn test_referee_smoke() { let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); let init_state_node = ((), ()).to_clvm(&mut allocator).expect("should assemble"); - let init_state = Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); + let init_state = + Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index bfff21b4..f7f25263 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -582,7 +582,8 @@ fn test_referee_can_slash_on_chain() { let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); let init_state_node = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); - let init_state = Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); + let init_state = + Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); @@ -692,7 +693,8 @@ fn test_referee_can_move_on_chain() { let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); let init_state_node = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); - let init_state = Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); + let init_state = + Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); let my_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); From 475b272e888490002850c59f8a28d413659911f7 Mon Sep 17 00:00:00 2001 From: arty Date: Sun, 29 Dec 2024 23:03:11 -0800 Subject: [PATCH 47/50] Squeeze out more NodePtr storage --- src/channel_handler/game.rs | 3 +- src/channel_handler/game_handler.rs | 3 +- src/channel_handler/types.rs | 144 +++++----------------------- src/potato_handler.rs | 31 ++---- src/referee.rs | 60 +++++------- src/tests/channel_handler.rs | 14 +-- src/tests/game.rs | 18 +--- src/tests/referee.rs | 14 +-- src/tests/simenv.rs | 7 +- 9 files changed, 81 insertions(+), 213 deletions(-) diff --git a/src/channel_handler/game.rs b/src/channel_handler/game.rs index 54c63639..e6b8ee10 100644 --- a/src/channel_handler/game.rs +++ b/src/channel_handler/game.rs @@ -73,7 +73,8 @@ impl Game { let initial_max_move_size = atom_from_clvm(allocator, template_list[4]) .and_then(usize_from_atom) .expect("should be an atom"); - let initial_validation_program = ValidationProgram::new(allocator, template_list[5]); + let validation_prog = Program::from_nodeptr(allocator, template_list[5])?; + let initial_validation_program = ValidationProgram::new(allocator, validation_prog); let initial_validation_program_hash = if let Some(a) = atom_from_clvm(allocator, template_list[6]) { Hash::from_slice(a) diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index 238ba69b..e4b31340 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -301,7 +301,8 @@ impl GameHandler { return Err(Error::StrErr("bad move".to_string())); }; - let validation_program = ValidationProgram::new(allocator, pl[1]); + let validation_prog = Program::from_nodeptr(allocator, pl[1])?; + let validation_program = ValidationProgram::new(allocator, validation_prog); let state = Rc::new(Program::from_nodeptr(allocator, pl[3])?); Ok(MyTurnResult { waiting_driver: GameHandler::their_driver_from_nodeptr(allocator, pl[6])?, diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 7565833e..69da90dc 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -6,8 +6,6 @@ use clvm_tools_rs::classic::clvm_tools::binutils::disassemble; use clvm_traits::{clvm_curried_args, ClvmEncoder, ToClvm, ToClvmError}; use clvm_utils::CurriedProgram; use clvmr::allocator::NodePtr; -use clvmr::serde::node_from_bytes; -use clvmr::Allocator; use log::debug; @@ -75,7 +73,7 @@ pub struct PotatoSignatures { } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct GenericGameStartInfo { +pub struct GameStartInfo { pub game_id: GameID, pub amount: Amount, pub game_handler: GameHandler, @@ -84,122 +82,18 @@ pub struct GenericGameStartInfo { pub my_contribution_this_game: Amount, pub their_contribution_this_game: Amount, - pub initial_validation_program: VP, + pub initial_validation_program: ValidationProgram, pub initial_state: Program, pub initial_move: Vec, pub initial_max_move_size: usize, pub initial_mover_share: Amount, } -pub type GameStartInfo = GenericGameStartInfo; -pub type FlatGameStartInfo = GenericGameStartInfo; - -pub struct PrintableGameStartInfo<'a> { - pub allocator: &'a mut Allocator, - pub info: &'a GameStartInfo, -} - -impl std::fmt::Debug for PrintableGameStartInfo<'_> { - fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - writeln!(formatter, "- game_id: {:?}", self.info.game_id)?; - writeln!(formatter, "- amount: {:?}", self.info.amount)?; - writeln!( - formatter, - "- game_handler: {} {:?}", - self.info.game_handler.is_my_turn(), - self.info.game_handler, - )?; - writeln!(formatter, "- timeout: {:?}", self.info.timeout)?; - writeln!( - formatter, - "- my_contribution_this_game: {:?}", - self.info.my_contribution_this_game - )?; - writeln!( - formatter, - "- their_contribution_this_game: {:?}", - self.info.their_contribution_this_game - )?; - writeln!( - formatter, - "- initial_validation_program: {}", - disassemble( - self.allocator, - self.info.initial_validation_program.to_nodeptr(), - None - ) - )?; - writeln!(formatter, "- initial_state: {:?}", self.info.initial_state)?; - writeln!(formatter, "- initial_move: {:?}", self.info.initial_move)?; - writeln!( - formatter, - "- initial_max_move_size: {:?}", - self.info.initial_max_move_size - )?; - writeln!( - formatter, - "- initial_mover_share: {:?}", - self.info.initial_mover_share - )?; - - Ok(()) - } -} - -impl GenericGameStartInfo { +impl GameStartInfo { pub fn is_my_turn(&self) -> bool { matches!(self.game_handler, GameHandler::MyTurnHandler(_)) } - pub fn from_serializable( - allocator: &mut AllocEncoder, - serializable: &FlatGameStartInfo, - ) -> Result { - let game_handler = serializable.game_handler.clone(); - let initial_validation_program_nodeptr = node_from_bytes( - allocator.allocator(), - &serializable.initial_validation_program.0, - ) - .into_gen()?; - let initial_validation_program = - ValidationProgram::new(allocator, initial_validation_program_nodeptr); - Ok(GenericGameStartInfo { - game_id: serializable.game_id.clone(), - amount: serializable.amount.clone(), - game_handler, - timeout: serializable.timeout.clone(), - my_contribution_this_game: serializable.my_contribution_this_game.clone(), - their_contribution_this_game: serializable.their_contribution_this_game.clone(), - initial_validation_program, - initial_state: serializable.initial_state.clone(), - initial_move: serializable.initial_move.clone(), - initial_max_move_size: serializable.initial_max_move_size, - initial_mover_share: serializable.initial_mover_share.clone(), - }) - } - - pub fn to_serializable( - &self, - allocator: &mut AllocEncoder, - ) -> Result { - let flat_validation_program = - Program::from_nodeptr(allocator, self.initial_validation_program.to_nodeptr())?; - - Ok(GenericGameStartInfo { - game_id: self.game_id.clone(), - amount: self.amount.clone(), - game_handler: self.game_handler.clone(), - timeout: self.timeout.clone(), - my_contribution_this_game: self.my_contribution_this_game.clone(), - their_contribution_this_game: self.their_contribution_this_game.clone(), - initial_validation_program: flat_validation_program, - initial_state: self.initial_state.clone(), - initial_move: self.initial_move.clone(), - initial_max_move_size: self.initial_max_move_size, - initial_mover_share: self.initial_mover_share.clone(), - }) - } - pub fn from_clvm( allocator: &mut AllocEncoder, my_turn: bool, @@ -230,7 +124,8 @@ impl GenericGameStartInfo { let returned_my_contribution = Amount::from_clvm(allocator, lst[4])?; let returned_their_contribution = Amount::from_clvm(allocator, lst[5])?; - let validation_program = ValidationProgram::new(allocator, lst[6]); + let validation_prog = Program::from_nodeptr(allocator, lst[6])?; + let validation_program = ValidationProgram::new(allocator, validation_prog); let initial_state = Program::from_nodeptr(allocator, lst[7])?; let initial_move = if let Some(a) = atom_from_clvm(allocator, lst[8]) { a.to_vec() @@ -483,25 +378,27 @@ impl ToClvm for Evidence { /// other kinds of things that are related. /// /// This can give a validation program hash or a validation info hash, given state. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] pub struct ValidationProgram { - validation_program: NodePtr, + validation_program: Program, validation_program_hash: Hash, } impl ValidationProgram { - pub fn new(allocator: &mut AllocEncoder, validation_program: NodePtr) -> Self { + pub fn new(allocator: &mut AllocEncoder, validation_program: Program) -> Self { + let validation_program_hash = validation_program.sha256tree(allocator).hash().clone(); ValidationProgram { validation_program, - validation_program_hash: Node(validation_program) - .sha256tree(allocator) - .hash() - .clone(), + validation_program_hash, } } - pub fn to_nodeptr(&self) -> NodePtr { - self.validation_program + pub fn to_program(&self) -> &Program { + &self.validation_program + } + + pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { + self.validation_program.to_nodeptr(allocator) } pub fn hash(&self) -> &Hash { @@ -509,6 +406,15 @@ impl ValidationProgram { } } +impl ToClvm for ValidationProgram { + fn to_clvm( + &self, + encoder: &mut impl ClvmEncoder, + ) -> Result { + self.validation_program.to_clvm(encoder) + } +} + /// The pair of state and validation program is the source of the validation hash #[derive(Clone, Debug)] pub enum ValidationInfo { diff --git a/src/potato_handler.rs b/src/potato_handler.rs index 0d5e6798..e93aeae0 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -15,8 +15,8 @@ use serde::{Deserialize, Serialize}; use crate::channel_handler::types::{ ChannelCoinSpendInfo, ChannelHandlerEnv, ChannelHandlerInitiationData, - ChannelHandlerPrivateKeys, CoinSpentInformation, FlatGameStartInfo, GameStartInfo, MoveResult, - OnChainGameState, PotatoSignatures, PrintableGameStartInfo, ReadableMove, + ChannelHandlerPrivateKeys, CoinSpentInformation, GameStartInfo, MoveResult, OnChainGameState, + PotatoSignatures, ReadableMove, }; use crate::channel_handler::ChannelHandler; use crate::common::standard_coin::{ @@ -361,7 +361,7 @@ pub enum PeerMessage { Accept(GameID, Amount, PotatoSignatures), Shutdown(Aggsig, Program), RequestPotato(()), - StartGames(PotatoSignatures, Vec), + StartGames(PotatoSignatures, Vec), } #[derive(Debug, Clone)] @@ -973,16 +973,10 @@ impl PotatoHandler { let ch = self.channel_handler_mut()?; let (env, _) = penv.env(); for game in desc.their_games.iter() { - dehydrated_games.push(game.to_serializable(env.allocator)?); + dehydrated_games.push(game.clone()); } for game in desc.my_games.iter() { - debug!( - "using game {:?}", - PrintableGameStartInfo { - allocator: env.allocator.allocator(), - info: game - } - ); + debug!("using game {:?}", game); } ch.send_potato_start_game(env, &desc.my_games)? }; @@ -1235,7 +1229,7 @@ impl PotatoHandler { &mut self, penv: &mut dyn PeerEnv<'a, G, R>, sigs: &PotatoSignatures, - games: &[FlatGameStartInfo], + games: &[GameStartInfo], ) -> Result<(), Error> where G: ToLocalUI + BootstrapTowardWallet + WalletSpendInterface + PacketSender + 'a, @@ -1251,17 +1245,8 @@ impl PotatoHandler { let (env, _system_interface) = penv.env(); let mut rehydrated_games = Vec::new(); for game in games.iter() { - let new_rehydrated_game = GameStartInfo::from_serializable(env.allocator, game)?; - let re_dehydrated = new_rehydrated_game.to_serializable(env.allocator)?; - assert_eq!(&re_dehydrated, game); - debug!( - "their game {:?}", - PrintableGameStartInfo { - allocator: env.allocator.allocator(), - info: &new_rehydrated_game - } - ); - rehydrated_games.push(new_rehydrated_game); + debug!("their game {:?}", game); + rehydrated_games.push(game.clone()); } ch.received_potato_start_game(env, sigs, &rehydrated_games)? }; diff --git a/src/referee.rs b/src/referee.rs index f3aaedbe..9b4be98e 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -17,8 +17,7 @@ use crate::channel_handler::game_handler::{ TheirTurnResult, }; use crate::channel_handler::types::{ - Evidence, GameStartInfo, PrintableGameStartInfo, ReadableMove, ValidationInfo, - ValidationProgram, + Evidence, GameStartInfo, ReadableMove, ValidationInfo, ValidationProgram, }; use crate::common::constants::CREATE_COIN; use crate::common::standard_coin::{ @@ -647,13 +646,7 @@ impl RefereeMaker { their_puzzle_hash: &PuzzleHash, nonce: usize, ) -> Result<(Self, PuzzleHash), Error> { - debug!( - "referee maker: game start {:?}", - PrintableGameStartInfo { - allocator: allocator.allocator(), - info: game_start_info - } - ); + debug!("referee maker: game start {:?}", game_start_info); let initial_move = GameMoveStateInfo { mover_share: game_start_info.initial_mover_share.clone(), move_made: game_start_info.initial_move.clone(), @@ -837,14 +830,14 @@ impl RefereeMaker { self.run_debug = ena; } - pub fn get_validation_program_clvm(&self) -> Result { + pub fn get_validation_program(&self) -> Result<&Program, Error> { match self.state.borrow() { RefereeMakerGameState::Initial { initial_validation_program, .. - } => Ok(initial_validation_program.to_nodeptr()), + } => Ok(initial_validation_program.to_program()), RefereeMakerGameState::AfterOurTurn { my_turn_result, .. } => { - Ok(my_turn_result.validation_program.to_nodeptr()) + Ok(my_turn_result.validation_program.to_program()) } RefereeMakerGameState::AfterTheirTurn { .. } => Err(Error::StrErr( "we already accepted their turn so it can't be validated".to_string(), @@ -1281,25 +1274,21 @@ impl RefereeMaker { let args = self.spend_this_coin(); let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; - let nil = allocator.allocator().null(); - let prog = ValidationProgram::new(allocator, nil); + let prog = ValidationProgram::new(allocator, Program::from_bytes(&[0x80])); debug!( "referee maker: get transaction for move {:?}", - PrintableGameStartInfo { - allocator: allocator.allocator(), - info: &GameStartInfo { - game_handler: self.get_game_handler(), - game_id: GameID::default(), - amount: self.get_amount(), - initial_state: self.get_game_state().clone(), - initial_max_move_size: args.game_move.basic.max_move_size, - initial_move: args.game_move.basic.move_made.clone(), - initial_mover_share: args.game_move.basic.mover_share.clone(), - my_contribution_this_game: Amount::default(), - their_contribution_this_game: Amount::default(), - initial_validation_program: prog, - timeout: self.fixed.timeout.clone(), - } + GameStartInfo { + game_handler: self.get_game_handler(), + game_id: GameID::default(), + amount: self.get_amount(), + initial_state: self.get_game_state().clone(), + initial_max_move_size: args.game_move.basic.max_move_size, + initial_move: args.game_move.basic.move_made.clone(), + initial_mover_share: args.game_move.basic.mover_share.clone(), + my_contribution_this_game: Amount::default(), + their_contribution_this_game: Amount::default(), + initial_validation_program: prog, + timeout: self.fixed.timeout.clone(), } ); @@ -1479,10 +1468,8 @@ impl RefereeMaker { }, }; let (_state, validation_program) = self.get_validation_program_for_their_move()?; - let validation_program_nodeptr = validation_program.to_nodeptr(); - let validation_program_hexer = - Program::from_nodeptr(allocator, validation_program_nodeptr)?; let validation_program_mod_hash = validation_program.hash(); + let validation_program_nodeptr = validation_program.to_nodeptr(allocator)?; let validator_full_args_node = validator_move_args.to_nodeptr( allocator, validation_program_nodeptr, @@ -1490,7 +1477,7 @@ impl RefereeMaker { )?; let validator_full_args = Program::from_nodeptr(allocator, validator_full_args_node)?; - debug!("validator program {:?}", validation_program_hexer); + debug!("validator program {:?}", validation_program); debug!("validator args {:?}", validator_full_args); // Error means validation should not work. @@ -1498,7 +1485,7 @@ impl RefereeMaker { let result = run_program( allocator.allocator(), &chia_dialect(), - validation_program.to_nodeptr(), + validation_program_nodeptr, validator_full_args_node, 0, ) @@ -1643,10 +1630,11 @@ impl RefereeMaker { } let state_nodeptr = state.to_nodeptr(allocator)?; + let validation_program_node = validation_program.to_nodeptr(allocator)?; let slashing_coin_solution = self.slashing_coin_solution( allocator, state_nodeptr, - validation_program.to_nodeptr(), + validation_program_node, slash_solution, evidence, )?; @@ -1710,7 +1698,7 @@ impl RefereeMaker { ( &state, ( - Node(validation_program.to_nodeptr()), + &validation_program, // No evidence here. (new_puzzle_hash.clone(), ((), (0, ()))), ), diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index 2269e67c..f9358552 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -129,18 +129,14 @@ fn test_smoke_can_start_game() { let their_share = Amount::new(100); // Fake - let game_handler = env.allocator.allocator().null(); - let initial_validation_puzzle = game_handler; - let initial_state_node = env.allocator.allocator().null(); - let initial_state = - Program::from_nodeptr(&mut env.allocator, initial_state_node).expect("should convert"); + let game_handler = Program::from_bytes(&[0x80]); + let initial_validation_puzzle = &game_handler; + let initial_state = Program::from_bytes(&[0x80]); let initial_validation_program = - ValidationProgram::new(env.allocator, initial_validation_puzzle); + ValidationProgram::new(env.allocator, initial_validation_puzzle.clone()); let timeout = Timeout::new(1337); - let game_handler = GameHandler::TheirTurnHandler(Rc::new( - Program::from_nodeptr(env.allocator, game_handler).expect("should cvt"), - )); + let game_handler = GameHandler::TheirTurnHandler(Rc::new(game_handler)); let _game_start_potato_sigs = game.player(1).ch.send_potato_start_game( &mut env, &[GameStartInfo { diff --git a/src/tests/game.rs b/src/tests/game.rs index a630c6dc..0ca73a74 100644 --- a/src/tests/game.rs +++ b/src/tests/game.rs @@ -27,7 +27,7 @@ use crate::channel_handler::game::Game; #[cfg(feature = "sim-tests")] use crate::channel_handler::runner::ChannelHandlerGame; #[cfg(feature = "sim-tests")] -use crate::channel_handler::types::{ChannelHandlerEnv, PrintableGameStartInfo}; +use crate::channel_handler::types::ChannelHandlerEnv; #[cfg(feature = "sim-tests")] use crate::common::standard_coin::{ private_to_public_key, puzzle_hash_for_synthetic_public_key, ChiaIdentity, @@ -192,20 +192,8 @@ pub fn new_channel_handler_game( &timeout, ); - debug!( - "our_game_start {:?}", - PrintableGameStartInfo { - allocator: env.allocator.allocator(), - info: &our_game_start - } - ); - debug!( - "their_game_start {:?}", - PrintableGameStartInfo { - allocator: env.allocator.allocator(), - info: &their_game_start - } - ); + debug!("our_game_start {:?}", our_game_start); + debug!("their_game_start {:?}", their_game_start); let sigs1 = party.player(0).ch.send_empty_potato(env)?; let spend1 = party.player(1).ch.received_empty_potato(env, &sigs1)?; diff --git a/src/tests/referee.rs b/src/tests/referee.rs index f317472b..19c82046 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -4,8 +4,6 @@ use rand::prelude::*; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; -use clvmr::NodePtr; - use log::debug; use crate::channel_handler::game_handler::{GameHandler, TheirTurnResult}; @@ -18,9 +16,9 @@ use crate::common::types::{ use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker}; pub struct DebugGamePrograms { - pub my_validation_program: NodePtr, + pub my_validation_program: Program, #[allow(dead_code)] - pub their_validation_program: NodePtr, + pub their_validation_program: Program, pub my_turn_handler: GameHandler, pub their_turn_handler: GameHandler, } @@ -65,24 +63,28 @@ pub fn make_debug_game_handler( .expect("should curry"); let my_turn_handler = GameHandler::my_driver_from_nodeptr(allocator, my_driver_node).expect("should cvt"); - let my_validation_program = CurriedProgram { + let my_validation_program_node = CurriedProgram { program: my_turn_handler.clone(), args: clvm_curried_args!(1337), } .to_clvm(allocator) .expect("should curry"); + let my_validation_program = + Program::from_nodeptr(allocator, my_validation_program_node).expect("should convert"); let their_turn_node = make_curried_game_handler(false) .to_clvm(allocator) .expect("should curry"); let their_turn_handler = GameHandler::their_driver_from_nodeptr(allocator, their_turn_node).expect("should cvt"); - let their_validation_program = CurriedProgram { + let their_validation_program_node = CurriedProgram { program: their_turn_handler.clone(), args: clvm_curried_args!(1337), } .to_clvm(allocator) .expect("should curry"); + let their_validation_program = + Program::from_nodeptr(allocator, their_validation_program_node).expect("should convert"); DebugGamePrograms { my_validation_program, diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index f7f25263..913300e3 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -20,7 +20,7 @@ use crate::common::standard_coin::{ }; use crate::common::types::{ chia_dialect, AllocEncoder, Amount, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, - IntoErr, Node, PrivateKey, Program, PuzzleHash, Sha256tree, Spend, Timeout, + IntoErr, PrivateKey, Program, PuzzleHash, Sha256tree, Spend, Timeout, }; use crate::shutdown::get_conditions_with_channel_handler; use crate::simulator::Simulator; @@ -712,8 +712,9 @@ fn test_referee_can_move_on_chain() { initial_mover_share: Amount::default(), }; - let _their_validation_program_hash = - Node(debug_game.their_validation_program).sha256tree(&mut allocator); + let _their_validation_program_hash = debug_game + .their_validation_program + .sha256tree(&mut allocator); let mut reftest = RefereeTest::new( &mut allocator, From 92595f5d938c81fdeb3e4588401e2398359256b9 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 30 Dec 2024 00:21:56 -0800 Subject: [PATCH 48/50] Convert containers of big puzzle and program objects to Rc --- src/channel_handler/game.rs | 8 ++-- src/channel_handler/game_handler.rs | 2 +- src/channel_handler/mod.rs | 19 ++++---- src/channel_handler/runner.rs | 42 +++++++++-------- src/channel_handler/types.rs | 46 +++++++++--------- src/common/standard_coin.rs | 4 +- src/common/types.rs | 35 ++++++++++++-- src/games/mod.rs | 4 +- src/peer_container.rs | 30 ++++++------ src/potato_handler.rs | 15 +++--- src/referee.rs | 70 ++++++++++++++-------------- src/simulator.rs | 2 +- src/tests/channel_handler.rs | 34 +++++++------- src/tests/game_handler.rs | 4 +- src/tests/peer/potato_handler.rs | 16 +++---- src/tests/peer/potato_handler_sim.rs | 20 ++++---- src/tests/referee.rs | 25 ++++++---- src/tests/simenv.rs | 14 +++--- 18 files changed, 218 insertions(+), 172 deletions(-) diff --git a/src/channel_handler/game.rs b/src/channel_handler/game.rs index e6b8ee10..bf60e836 100644 --- a/src/channel_handler/game.rs +++ b/src/channel_handler/game.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use clvm_traits::{ClvmEncoder, ToClvm}; use clvmr::run_program; @@ -21,7 +23,7 @@ pub struct Game { pub initial_max_move_size: usize, pub initial_validation_program: ValidationProgram, pub initial_validation_program_hash: Hash, - pub initial_state: Program, + pub initial_state: Rc, pub initial_mover_share_proportion: usize, } @@ -73,7 +75,7 @@ impl Game { let initial_max_move_size = atom_from_clvm(allocator, template_list[4]) .and_then(usize_from_atom) .expect("should be an atom"); - let validation_prog = Program::from_nodeptr(allocator, template_list[5])?; + let validation_prog = Rc::new(Program::from_nodeptr(allocator, template_list[5])?); let initial_validation_program = ValidationProgram::new(allocator, validation_prog); let initial_validation_program_hash = if let Some(a) = atom_from_clvm(allocator, template_list[6]) { @@ -84,7 +86,7 @@ impl Game { )); }; let initial_state_node = template_list[7]; - let initial_state = Program::from_nodeptr(allocator, initial_state_node)?; + let initial_state = Rc::new(Program::from_nodeptr(allocator, initial_state_node)?); let initial_mover_share_proportion = atom_from_clvm(allocator, template_list[8]) .and_then(usize_from_atom) .expect("should be an atom"); diff --git a/src/channel_handler/game_handler.rs b/src/channel_handler/game_handler.rs index e4b31340..56ce8c68 100644 --- a/src/channel_handler/game_handler.rs +++ b/src/channel_handler/game_handler.rs @@ -301,7 +301,7 @@ impl GameHandler { return Err(Error::StrErr("bad move".to_string())); }; - let validation_prog = Program::from_nodeptr(allocator, pl[1])?; + let validation_prog = Rc::new(Program::from_nodeptr(allocator, pl[1])?); let validation_program = ValidationProgram::new(allocator, validation_prog); let state = Rc::new(Program::from_nodeptr(allocator, pl[3])?); Ok(MyTurnResult { diff --git a/src/channel_handler/mod.rs b/src/channel_handler/mod.rs index 74c59793..c6029c9b 100644 --- a/src/channel_handler/mod.rs +++ b/src/channel_handler/mod.rs @@ -386,11 +386,11 @@ impl ChannelHandler { myself.create_conditions_and_signature_of_channel_coin(env, &myself.unroll.coin)?; myself.state_channel.spend = Spend { - puzzle: puzzle_for_synthetic_public_key( + puzzle: Rc::new(puzzle_for_synthetic_public_key( env.allocator, &env.standard_puzzle, &aggregate_public_key, - )?, + )?), solution: channel_coin_spend.solution.clone(), signature: channel_coin_spend.signature.clone(), }; @@ -420,11 +420,11 @@ impl ChannelHandler { channel_coin_spend.signature.clone() + their_initial_channel_half_signature.clone(); debug!("combined signature {combined_signature:?}"); - let state_channel_puzzle = puzzle_for_synthetic_public_key( + let state_channel_puzzle = Rc::new(puzzle_for_synthetic_public_key( env.allocator, &env.standard_puzzle, &aggregate_public_key, - )?; + )?); debug!( "puzzle hash for state channel coin (ch) {:?}", state_channel_puzzle.sha256tree(env.allocator) @@ -1112,7 +1112,7 @@ impl ChannelHandler { Ok(Spend { solution: channel_coin_spend.solution.clone(), signature: channel_coin_spend.signature, - puzzle: puzzle_for_pk(env.allocator, &aggregate_public_key)?, + puzzle: Rc::new(puzzle_for_pk(env.allocator, &aggregate_public_key)?), }) } @@ -1205,7 +1205,7 @@ impl ChannelHandler { } Ok(ChannelCoinSpentResult { transaction: Spend { - puzzle: Puzzle::from_nodeptr(env.allocator, curried_unroll_puzzle)?, + puzzle: Rc::new(Puzzle::from_nodeptr(env.allocator, curried_unroll_puzzle)?), solution: Rc::new(solution_program), signature, }, @@ -1294,7 +1294,10 @@ impl ChannelHandler { Ok(ChannelCoinSpentResult { transaction: Spend { - puzzle: Puzzle::from_nodeptr(env.allocator, curried_unroll_puzzle)?, + puzzle: Rc::new(Puzzle::from_nodeptr( + env.allocator, + curried_unroll_puzzle, + )?), solution: Rc::new(Program::from_nodeptr( env.allocator, unroll_puzzle_solution, @@ -1895,7 +1898,7 @@ impl ChannelHandler { )?; let my_referee_public_key = private_to_public_key(&self.private_keys.my_referee_private_key); - let puzzle = puzzle_for_pk(env.allocator, &my_referee_public_key)?; + let puzzle = Rc::new(puzzle_for_pk(env.allocator, &my_referee_public_key)?); for (i, coin) in exploded_coins.iter().enumerate() { let parent_id = coin.coin_string.to_coin_id(); diff --git a/src/channel_handler/runner.rs b/src/channel_handler/runner.rs index c1f3e413..17b13526 100644 --- a/src/channel_handler/runner.rs +++ b/src/channel_handler/runner.rs @@ -1,5 +1,6 @@ use log::debug; use rand::Rng; +use std::rc::Rc; use crate::channel_handler::{ ChannelCoinSpendInfo, ChannelHandler, ChannelHandlerEnv, ChannelHandlerInitiationData, @@ -16,7 +17,7 @@ use crate::common::types::{ pub struct ChannelHandlerParty { pub ch: ChannelHandler, pub init_data: ChannelHandlerInitiationResult, - pub referee: Puzzle, + pub referee: Rc, pub ref_puzzle_hash: PuzzleHash, pub contribution: Amount, } @@ -25,7 +26,7 @@ impl ChannelHandlerParty { pub fn new( env: &mut ChannelHandlerEnv, private_keys: ChannelHandlerPrivateKeys, - referee: Puzzle, + referee: Rc, ref_puzzle_hash: PuzzleHash, data: &ChannelHandlerInitiationData, ) -> Result { @@ -56,13 +57,14 @@ impl ChannelHandlerGame { ) -> Result { let private_keys: [ChannelHandlerPrivateKeys; 2] = env.rng.gen(); - let make_ref_info = - |env: &mut ChannelHandlerEnv, id: usize| -> Result<(Puzzle, PuzzleHash), Error> { - let ref_key = private_to_public_key(&private_keys[id].my_referee_private_key); - let referee = puzzle_for_pk(env.allocator, &ref_key)?; - let ref_puzzle_hash = referee.sha256tree(env.allocator); - Ok((referee, ref_puzzle_hash)) - }; + let make_ref_info = |env: &mut ChannelHandlerEnv, + id: usize| + -> Result<(Rc, PuzzleHash), Error> { + let ref_key = private_to_public_key(&private_keys[id].my_referee_private_key); + let referee = puzzle_for_pk(env.allocator, &ref_key)?; + let ref_puzzle_hash = referee.sha256tree(env.allocator); + Ok((Rc::new(referee), ref_puzzle_hash)) + }; let ref1 = make_ref_info(env, 0)?; let ref2 = make_ref_info(env, 1)?; @@ -153,19 +155,19 @@ impl ChannelHandlerGame { pub fn channel_handler_env<'a, R: Rng>( allocator: &'a mut AllocEncoder, rng: &'a mut R, -) -> ChannelHandlerEnv<'a, R> { - let referee_coin_puzzle = - read_hex_puzzle(allocator, "clsp/onchain/referee.hex").expect("should be readable"); +) -> Result, Error> { + let referee_coin_puzzle = Rc::new(read_hex_puzzle(allocator, "clsp/onchain/referee.hex")?); let referee_coin_puzzle_hash: PuzzleHash = referee_coin_puzzle.sha256tree(allocator); - let unroll_puzzle = read_hex_puzzle( + let unroll_puzzle = Rc::new(read_hex_puzzle( allocator, "clsp/unroll/unroll_puzzle_state_channel_unrolling.hex", - ) - .expect("should read"); - let unroll_metapuzzle = - read_hex_puzzle(allocator, "clsp/unroll/unroll_meta_puzzle.hex").expect("should read"); - let standard_puzzle = get_standard_coin_puzzle(allocator).expect("should load"); - ChannelHandlerEnv { + )?); + let unroll_metapuzzle = Rc::new(read_hex_puzzle( + allocator, + "clsp/unroll/unroll_meta_puzzle.hex", + )?); + let standard_puzzle = Rc::new(get_standard_coin_puzzle(allocator)?); + Ok(ChannelHandlerEnv { allocator, rng, referee_coin_puzzle, @@ -174,5 +176,5 @@ pub fn channel_handler_env<'a, R: Rng>( unroll_puzzle, standard_puzzle, agg_sig_me_additional_data: Hash::from_bytes(AGG_SIG_ME_ADDITIONAL_DATA), - } + }) } diff --git a/src/channel_handler/types.rs b/src/channel_handler/types.rs index 69da90dc..2f2ee7de 100644 --- a/src/channel_handler/types.rs +++ b/src/channel_handler/types.rs @@ -23,7 +23,7 @@ use crate::common::standard_coin::{ use crate::common::types::{ atom_from_clvm, usize_from_atom, Aggsig, AllocEncoder, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinID, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, Node, PrivateKey, - Program, PublicKey, Puzzle, PuzzleHash, Sha256Input, Sha256tree, Spend, Timeout, + Program, PublicKey, Puzzle, PuzzleHash, RcNode, Sha256Input, Sha256tree, Spend, Timeout, }; use crate::referee::{ GameMoveDetails, GameMoveWireData, RefereeMaker, RefereeOnChainTransaction, @@ -83,7 +83,7 @@ pub struct GameStartInfo { pub their_contribution_this_game: Amount, pub initial_validation_program: ValidationProgram, - pub initial_state: Program, + pub initial_state: Rc, pub initial_move: Vec, pub initial_max_move_size: usize, pub initial_mover_share: Amount, @@ -124,9 +124,9 @@ impl GameStartInfo { let returned_my_contribution = Amount::from_clvm(allocator, lst[4])?; let returned_their_contribution = Amount::from_clvm(allocator, lst[5])?; - let validation_prog = Program::from_nodeptr(allocator, lst[6])?; + let validation_prog = Rc::new(Program::from_nodeptr(allocator, lst[6])?); let validation_program = ValidationProgram::new(allocator, validation_prog); - let initial_state = Program::from_nodeptr(allocator, lst[7])?; + let initial_state = Rc::new(Program::from_nodeptr(allocator, lst[7])?); let initial_move = if let Some(a) = atom_from_clvm(allocator, lst[8]) { a.to_vec() } else { @@ -157,18 +157,18 @@ impl GameStartInfo { } #[derive(Clone, Debug)] -pub struct ReadableMove(Program); +pub struct ReadableMove(Rc); impl ReadableMove { pub fn from_nodeptr(allocator: &mut AllocEncoder, n: NodePtr) -> Result { - Ok(ReadableMove(Program::from_nodeptr(allocator, n)?)) + Ok(ReadableMove(Rc::new(Program::from_nodeptr(allocator, n)?))) } pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { self.0.to_nodeptr(allocator) } - pub fn from_program(p: Program) -> Self { + pub fn from_program(p: Rc) -> Self { ReadableMove(p) } @@ -249,13 +249,13 @@ pub fn read_unroll_puzzle(allocator: &mut AllocEncoder) -> Result pub struct ChannelHandlerEnv<'a, R: Rng> { pub allocator: &'a mut AllocEncoder, pub rng: &'a mut R, - pub unroll_metapuzzle: Puzzle, - pub unroll_puzzle: Puzzle, + pub unroll_metapuzzle: Rc, + pub unroll_puzzle: Rc, - pub referee_coin_puzzle: Puzzle, + pub referee_coin_puzzle: Rc, pub referee_coin_puzzle_hash: PuzzleHash, - pub standard_puzzle: Puzzle, + pub standard_puzzle: Rc, pub agg_sig_me_additional_data: Hash, } @@ -264,10 +264,10 @@ impl<'a, R: Rng> ChannelHandlerEnv<'a, R> { pub fn new( allocator: &'a mut AllocEncoder, rng: &'a mut R, - unroll_metapuzzle: Puzzle, - unroll_puzzle: Puzzle, - referee_coin_puzzle: Puzzle, - standard_puzzle: Puzzle, + unroll_metapuzzle: Rc, + unroll_puzzle: Rc, + referee_coin_puzzle: Rc, + standard_puzzle: Rc, agg_sig_me_additional_data: Hash, ) -> ChannelHandlerEnv<'a, R> { let referee_coin_puzzle_hash = referee_coin_puzzle.sha256tree(allocator); @@ -334,7 +334,7 @@ pub struct ChannelCoinSpendInfo { #[derive(Clone)] pub struct HandshakeResult { - pub channel_puzzle_reveal: Puzzle, + pub channel_puzzle_reveal: Rc, pub amount: Amount, pub spend: ChannelCoinSpendInfo, } @@ -380,12 +380,12 @@ impl ToClvm for Evidence { /// This can give a validation program hash or a validation info hash, given state. #[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] pub struct ValidationProgram { - validation_program: Program, + validation_program: Rc, validation_program_hash: Hash, } impl ValidationProgram { - pub fn new(allocator: &mut AllocEncoder, validation_program: Program) -> Self { + pub fn new(allocator: &mut AllocEncoder, validation_program: Rc) -> Self { let validation_program_hash = validation_program.sha256tree(allocator).hash().clone(); ValidationProgram { validation_program, @@ -393,8 +393,8 @@ impl ValidationProgram { } } - pub fn to_program(&self) -> &Program { - &self.validation_program + pub fn to_program(&self) -> Rc { + self.validation_program.clone() } pub fn to_nodeptr(&self, allocator: &mut AllocEncoder) -> Result { @@ -690,7 +690,7 @@ impl UnrollCoin { ) -> Result { let conditions_hash = self.get_conditions_hash_for_unroll_puzzle()?; let shared_puzzle = CurriedProgram { - program: env.unroll_metapuzzle.clone(), + program: RcNode::new(env.unroll_metapuzzle.clone()), args: clvm_curried_args!(aggregate_public_key.clone()), } .to_clvm(env.allocator) @@ -698,7 +698,7 @@ impl UnrollCoin { let shared_puzzle_hash = Node(shared_puzzle).sha256tree(env.allocator); CurriedProgram { - program: env.unroll_puzzle.clone(), + program: RcNode::new(env.unroll_puzzle.clone()), args: clvm_curried_args!( shared_puzzle_hash, self.get_old_state_number()? - 1, @@ -715,7 +715,7 @@ impl UnrollCoin { aggregate_public_key: &PublicKey, ) -> Result { let unroll_inner_puzzle = CurriedProgram { - program: env.unroll_metapuzzle.clone(), + program: RcNode::new(env.unroll_metapuzzle.clone()), args: clvm_curried_args!(aggregate_public_key.clone()), } .to_clvm(env.allocator) diff --git a/src/common/standard_coin.rs b/src/common/standard_coin.rs index 93a04874..d766a6a6 100644 --- a/src/common/standard_coin.rs +++ b/src/common/standard_coin.rs @@ -549,7 +549,7 @@ pub struct ChiaIdentity { pub synthetic_public_key: PublicKey, pub public_key: PublicKey, pub synthetic_private_key: PrivateKey, - pub puzzle: Puzzle, + pub puzzle: Rc, pub puzzle_hash: PuzzleHash, } @@ -563,7 +563,7 @@ impl ChiaIdentity { calculate_synthetic_secret_key(&private_key, &default_hidden_puzzle_hash)?; let public_key = private_to_public_key(&private_key); let synthetic_public_key = private_to_public_key(&synthetic_private_key); - let puzzle = puzzle_for_pk(allocator, &public_key)?; + let puzzle = Rc::new(puzzle_for_pk(allocator, &public_key)?); let puzzle_hash = puzzle_hash_for_pk(allocator, &public_key)?; assert_eq!(puzzle.sha256tree(allocator), puzzle_hash); Ok(ChiaIdentity { diff --git a/src/common/types.rs b/src/common/types.rs index 58a4900a..d033d6d1 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -1,3 +1,4 @@ +use std::borrow::Borrow; use std::io; use std::ops::{Add, AddAssign, Sub, SubAssign}; use std::rc::Rc; @@ -733,7 +734,7 @@ impl ToClvm for Program { } #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Puzzle(Program); +pub struct Puzzle(Rc); impl ToClvm for Puzzle { fn to_clvm( @@ -745,11 +746,11 @@ impl ToClvm for Puzzle { } impl Puzzle { - pub fn to_program(&self) -> Program { + pub fn to_program(&self) -> Rc { self.0.clone() } pub fn from_bytes(by: &[u8]) -> Puzzle { - Puzzle(Program::from_bytes(by)) + Puzzle(Rc::new(Program::from_bytes(by))) } pub fn from_nodeptr(allocator: &mut AllocEncoder, node: NodePtr) -> Result { let bytes = node_to_bytes(allocator.allocator(), node).into_gen()?; @@ -1023,7 +1024,7 @@ impl CoinCondition { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Spend { - pub puzzle: Puzzle, + pub puzzle: Rc, pub solution: Rc, pub signature: Aggsig, } @@ -1037,7 +1038,7 @@ pub struct CoinSpend { impl Default for Spend { fn default() -> Self { Spend { - puzzle: Puzzle::from_bytes(&[0x80]), + puzzle: Rc::new(Puzzle::from_bytes(&[0x80])), solution: Rc::new(Program::from_bytes(&[0x80])), signature: Aggsig::default(), } @@ -1121,3 +1122,27 @@ fn test_local_divmod() { (3.to_bigint().unwrap(), 1.to_bigint().unwrap()) ); } + +pub struct RcNode(Rc); + +impl> ToClvm for RcNode { + fn to_clvm( + &self, + encoder: &mut impl ClvmEncoder, + ) -> Result { + let borrowed: &X = self.0.borrow(); + borrowed.to_clvm(encoder) + } +} + +impl RcNode { + pub fn new(node: Rc) -> Self { + RcNode(node.clone()) + } +} + +impl From<&Rc> for RcNode { + fn from(item: &Rc) -> RcNode { + RcNode(item.clone()) + } +} diff --git a/src/games/mod.rs b/src/games/mod.rs index 12357251..75fcafc1 100644 --- a/src/games/mod.rs +++ b/src/games/mod.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + pub mod calpoker; use crate::common::standard_coin::read_hex_puzzle; @@ -5,7 +7,7 @@ use crate::common::types::{AllocEncoder, Program}; use crate::potato_handler::GameType; use std::collections::BTreeMap; -pub fn poker_collection(allocator: &mut AllocEncoder) -> BTreeMap { +pub fn poker_collection(allocator: &mut AllocEncoder) -> BTreeMap> { let mut game_type_map = BTreeMap::new(); let calpoker_factory = read_hex_puzzle(allocator, "clsp/calpoker_include_calpoker_factory.hex") .expect("should load"); diff --git a/src/peer_container.rs b/src/peer_container.rs index 397fb297..ff962dfe 100644 --- a/src/peer_container.rs +++ b/src/peer_container.rs @@ -337,7 +337,7 @@ pub struct SynchronousGameCradle { } pub struct SynchronousGameCradleConfig<'a> { - pub game_types: BTreeMap, + pub game_types: BTreeMap>, pub have_potato: bool, pub identity: &'a ChiaIdentity, pub my_contribution: Amount, @@ -545,7 +545,7 @@ impl SynchronousGameCradle { .to_clvm(allocator) .into_gen()?; - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let spend = standard_solution_partial( env.allocator, &self.state.identity.synthetic_private_key, @@ -591,7 +591,7 @@ impl SynchronousGameCradle { self.state.unfunded_offer = None; - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let empty_conditions = ().to_clvm(env.allocator).into_gen()?; let quoted_empty_conditions = empty_conditions.to_quoted_program(env.allocator)?; let solution = solution_for_conditions(env.allocator, empty_conditions)?; @@ -708,7 +708,7 @@ impl GameCradle for SynchronousGameCradle { allocator: &mut AllocEncoder, rng: &mut R, ) -> Result { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -723,7 +723,7 @@ impl GameCradle for SynchronousGameCradle { coin_string: &[CoinString], target: &PuzzleHash, ) -> Result { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -743,7 +743,7 @@ impl GameCradle for SynchronousGameCradle { return Ok(()); } - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -765,7 +765,7 @@ impl GameCradle for SynchronousGameCradle { i_initiated: bool, game: &GameStart, ) -> Result, Error> { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -782,8 +782,8 @@ impl GameCradle for SynchronousGameCradle { readable: Vec, new_entropy: Hash, ) -> Result<(), Error> { - let mut env = channel_handler_env(allocator, rng); - let rehydrated_move = Program::from_bytes(&readable); + let mut env = channel_handler_env(allocator, rng)?; + let rehydrated_move = Rc::new(Program::from_bytes(&readable)); let readable = ReadableMove::from_program(rehydrated_move); let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, @@ -800,7 +800,7 @@ impl GameCradle for SynchronousGameCradle { rng: &mut R, id: &GameID, ) -> Result<(), Error> { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -816,7 +816,7 @@ impl GameCradle for SynchronousGameCradle { conditions: Rc, ) -> Result<(), Error> { // The conditions relate to spending the remaining money in the channel coin. - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -835,7 +835,7 @@ impl GameCradle for SynchronousGameCradle { ) -> Result<(), Error> { self.state.current_height = height as u64; let filtered_report = self.filter_coin_report(self.state.current_height, report); - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -908,7 +908,7 @@ impl GameCradle for SynchronousGameCradle { // If there's a message to deliver, deliver it and signal to continue. if let Some(msg) = self.state.inbound_messages.pop_front() { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -951,7 +951,7 @@ impl GameCradle for SynchronousGameCradle { _local_ui: &mut dyn ToLocalUI, got_error: bool, ) -> Result<(), Error> { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, @@ -966,7 +966,7 @@ impl GameCradle for SynchronousGameCradle { coin_id: &CoinString, puzzle_and_solution: Option<(&Program, &Program)>, ) -> Result<(), Error> { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: SynchronousGamePeerEnv = SynchronousGamePeerEnv { env: &mut env, system_interface: &mut self.state, diff --git a/src/potato_handler.rs b/src/potato_handler.rs index e93aeae0..aac6c338 100644 --- a/src/potato_handler.rs +++ b/src/potato_handler.rs @@ -449,7 +449,7 @@ impl std::fmt::Debug for GameAction { pub struct PotatoHandlerInit { pub have_potato: bool, pub private_keys: ChannelHandlerPrivateKeys, - pub game_types: BTreeMap, + pub game_types: BTreeMap>, pub my_contribution: Amount, pub their_contribution: Amount, pub channel_timeout: Timeout, @@ -503,7 +503,7 @@ pub struct PotatoHandler { channel_initiation_transaction: Option, channel_finished_transaction: Option, - game_types: BTreeMap, + game_types: BTreeMap>, private_keys: ChannelHandlerPrivateKeys, @@ -721,11 +721,11 @@ impl PotatoHandler { if let HandshakeState::Finished(hs) = &mut self.handshake_state { let (env, _) = penv.env(); debug!("hs spend is {:?}", hs.spend); - let channel_coin_puzzle = puzzle_for_synthetic_public_key( + let channel_coin_puzzle = Rc::new(puzzle_for_synthetic_public_key( env.allocator, &env.standard_puzzle, &channel_public_key, - )?; + )?); hs.spend.spends = vec![CoinSpend { coin: channel_coin, bundle: Spend { @@ -841,11 +841,11 @@ impl PotatoHandler { let full_spend = ch.received_potato_clean_shutdown(env, &sig, clvm_conditions)?; let channel_puzzle_public_key = ch.get_aggregate_channel_public_key(); - let puzzle = puzzle_for_synthetic_public_key( + let puzzle = Rc::new(puzzle_for_synthetic_public_key( env.allocator, &env.standard_puzzle, &channel_puzzle_public_key, - )?; + )?); let spend = Spend { solution: full_spend.solution.clone(), puzzle, @@ -1768,7 +1768,8 @@ impl PotatoHandler { let curried_unroll_puzzle = finished_unroll_coin .coin .make_curried_unroll_puzzle(env, &player_ch.get_aggregate_unroll_public_key())?; - let curried_unroll_program = Puzzle::from_nodeptr(env.allocator, curried_unroll_puzzle)?; + let curried_unroll_program = + Rc::new(Puzzle::from_nodeptr(env.allocator, curried_unroll_puzzle)?); let unroll_solution = finished_unroll_coin .coin .make_unroll_puzzle_solution(env, &player_ch.get_aggregate_unroll_public_key())?; diff --git a/src/referee.rs b/src/referee.rs index 9b4be98e..ca873cd1 100644 --- a/src/referee.rs +++ b/src/referee.rs @@ -27,7 +27,7 @@ use crate::common::standard_coin::{ use crate::common::types::{ chia_dialect, u64_from_atom, usize_from_atom, Aggsig, AllocEncoder, Amount, BrokenOutCoinSpendInfo, CoinCondition, CoinSpend, CoinString, Error, GameID, Hash, IntoErr, - Node, Program, Puzzle, PuzzleHash, Sha256tree, Spend, Timeout, + Node, Program, Puzzle, PuzzleHash, RcNode, Sha256tree, Spend, Timeout, }; pub const REM_CONDITION_FIELDS: usize = 4; @@ -297,10 +297,10 @@ fn curry_referee_puzzle( /// is next to it. /// pub struct ValidatorMoveArgs { - pub state: Program, - pub mover_puzzle: Program, - pub solution: Program, - pub evidence: Program, + pub state: Rc, + pub mover_puzzle: Rc, + pub solution: Rc, + pub evidence: Rc, } impl ValidatorMoveArgs { @@ -479,7 +479,7 @@ pub struct IdentityCoinAndSolution { /// The referee knows the mover puzzle hash, so we've already decided what /// puzzle this is. It is usually the standard coin puzzle from the user's /// ChiaIdentity. - mover_coin_puzzle: Puzzle, + mover_coin_puzzle: Rc, /// A solution for the above puzzle that the onchain referee applies to /// extract the puzzle output conditions. The spend results in a re-formed /// referee on chain. @@ -570,7 +570,7 @@ impl ToClvm for OnChainRefereeSolution { ( refmove.details.basic.max_move_size, ( - refmove.mover_coin.mover_coin_puzzle.clone(), + RcNode::new(refmove.mover_coin.mover_coin_puzzle.clone()), (refmove_coin_solution_ref, ()), ), ), @@ -587,7 +587,7 @@ impl ToClvm for OnChainRefereeSolution { ( refslash.previous_validation_info.hash(), ( - refslash.mover_coin.mover_coin_puzzle.borrow(), + RcNode::new(refslash.mover_coin.mover_coin_puzzle.clone()), (refslash_solution_ref, (refslash.slash_evidence.clone(), ())), ), ), @@ -599,7 +599,7 @@ impl ToClvm for OnChainRefereeSolution { } struct RMFixed { - pub referee_coin_puzzle: Puzzle, + pub referee_coin_puzzle: Rc, pub referee_coin_puzzle_hash: PuzzleHash, pub my_identity: ChiaIdentity, @@ -639,7 +639,7 @@ pub struct RefereeMaker { impl RefereeMaker { pub fn new( allocator: &mut AllocEncoder, - referee_coin_puzzle: Puzzle, + referee_coin_puzzle: Rc, referee_coin_puzzle_hash: PuzzleHash, game_start_info: &GameStartInfo, my_identity: ChiaIdentity, @@ -692,7 +692,7 @@ impl RefereeMaker { ); } let state = Rc::new(RefereeMakerGameState::Initial { - initial_state: Rc::new(game_start_info.initial_state.clone()), + initial_state: game_start_info.initial_state.clone(), initial_validation_program: game_start_info.initial_validation_program.clone(), initial_puzzle_args: ref_puzzle_args.clone(), game_handler: game_start_info.game_handler.clone(), @@ -793,14 +793,16 @@ impl RefereeMaker { } } - pub fn get_game_state(&self) -> &Program { + pub fn get_game_state(&self) -> Rc { match self.state.borrow() { - RefereeMakerGameState::Initial { initial_state, .. } => initial_state, - RefereeMakerGameState::AfterOurTurn { my_turn_result, .. } => &my_turn_result.state, + RefereeMakerGameState::Initial { initial_state, .. } => initial_state.clone(), + RefereeMakerGameState::AfterOurTurn { my_turn_result, .. } => { + my_turn_result.state.clone() + } RefereeMakerGameState::AfterTheirTurn { most_recent_our_state_result, .. - } => most_recent_our_state_result, + } => most_recent_our_state_result.clone(), } } @@ -830,12 +832,12 @@ impl RefereeMaker { self.run_debug = ena; } - pub fn get_validation_program(&self) -> Result<&Program, Error> { + pub fn get_validation_program(&self) -> Result, Error> { match self.state.borrow() { RefereeMakerGameState::Initial { initial_validation_program, .. - } => Ok(initial_validation_program.to_program()), + } => Ok(initial_validation_program.to_program().clone()), RefereeMakerGameState::AfterOurTurn { my_turn_result, .. } => { Ok(my_turn_result.validation_program.to_program()) } @@ -1151,7 +1153,7 @@ impl RefereeMaker { allocator: &mut AllocEncoder, coin_string: &CoinString, always_produce_transaction: bool, - puzzle: &Puzzle, + puzzle: Rc, targs: &RefereePuzzleArgs, args: &OnChainRefereeSolution, ) -> Result, Error> { @@ -1219,18 +1221,18 @@ impl RefereeMaker { ); let targs = self.spend_this_coin(); - let puzzle = curry_referee_puzzle( + let puzzle = Rc::new(curry_referee_puzzle( allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, &targs, - )?; + )?); self.get_transaction( allocator, coin_string, false, - &puzzle, + puzzle, &targs, &OnChainRefereeSolution::Timeout, ) @@ -1272,9 +1274,9 @@ impl RefereeMaker { // We can only do a move to replicate our turn. assert!(self.processing_my_turn()); let args = self.spend_this_coin(); - let spend_puzzle = self.on_chain_referee_puzzle(allocator)?; + let spend_puzzle = Rc::new(self.on_chain_referee_puzzle(allocator)?); - let prog = ValidationProgram::new(allocator, Program::from_bytes(&[0x80])); + let prog = ValidationProgram::new(allocator, Rc::new(Program::from_bytes(&[0x80]))); debug!( "referee maker: get transaction for move {:?}", GameStartInfo { @@ -1412,7 +1414,7 @@ impl RefereeMaker { allocator, coin_string, true, - &spend_puzzle, + spend_puzzle, &target_args, &args_list, )? { @@ -1445,7 +1447,7 @@ impl RefereeMaker { Amount::default(), )], )?; - let solution_program = Program::from_nodeptr(allocator, solution)?; + let solution_program = Rc::new(Program::from_nodeptr(allocator, solution)?); let validator_move_args = InternalValidatorArgs { move_made: puzzle_args.game_move.basic.move_made.clone(), new_validation_info_hash: puzzle_args.game_move.validation_info_hash.clone(), @@ -1461,8 +1463,8 @@ impl RefereeMaker { max_move_size: puzzle_args.game_move.basic.max_move_size, referee_hash: new_puzzle_hash.clone(), move_args: ValidatorMoveArgs { - evidence: Program::from_nodeptr(allocator, evidence)?, - state: self.get_game_state().clone(), + evidence: Rc::new(Program::from_nodeptr(allocator, evidence)?), + state: self.get_game_state(), mover_puzzle: self.fixed.my_identity.puzzle.to_program(), solution: solution_program, }, @@ -1608,7 +1610,7 @@ impl RefereeMaker { &self, allocator: &mut AllocEncoder, coin_string: &CoinString, - new_puzzle: &Puzzle, + new_puzzle: Rc, new_puzzle_hash: &PuzzleHash, slash_solution: NodePtr, evidence: Evidence, @@ -1714,12 +1716,12 @@ impl RefereeMaker { ) -> Result, Error> { let evidence = allocator.allocator().null(); let puzzle_args = self.spend_this_coin(); - let new_puzzle = curry_referee_puzzle( + let new_puzzle = Rc::new(curry_referee_puzzle( allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, &puzzle_args, - )?; + )?); let new_puzzle_hash = curry_referee_puzzle_hash( allocator, @@ -1749,7 +1751,7 @@ impl RefereeMaker { self.make_slash_for_their_turn( allocator, coin_string, - &new_puzzle, + new_puzzle, &new_puzzle_hash, full_slash_solution, nil_evidence, @@ -1863,12 +1865,12 @@ impl RefereeMaker { let args = self.spend_this_coin(); - let new_puzzle = curry_referee_puzzle( + let new_puzzle = Rc::new(curry_referee_puzzle( allocator, &self.fixed.referee_coin_puzzle, &self.fixed.referee_coin_puzzle_hash, &args, - )?; + )?); let new_puzzle_hash = curry_referee_puzzle_hash(allocator, &self.fixed.referee_coin_puzzle_hash, &args)?; debug!("THEIR TURN MOVE OFF CHAIN SUCCEEDED {new_puzzle_hash:?}\n"); @@ -1898,7 +1900,7 @@ impl RefereeMaker { self.make_slash_for_their_turn( allocator, coin_string, - &new_puzzle, + new_puzzle, &new_puzzle_hash, full_slash_solution, evidence, diff --git a/src/simulator.rs b/src/simulator.rs index 7ef1e44d..1dd2bddd 100644 --- a/src/simulator.rs +++ b/src/simulator.rs @@ -394,7 +394,7 @@ impl Simulator { py: Python<'_>, allocator: &mut AllocEncoder, parent_coin: &CoinString, - puzzle_reveal: Puzzle, + puzzle_reveal: Rc, solution: NodePtr, ) -> PyResult { let coin = self.make_coin(parent_coin)?; diff --git a/src/tests/channel_handler.rs b/src/tests/channel_handler.rs index f9358552..e70fd62b 100644 --- a/src/tests/channel_handler.rs +++ b/src/tests/channel_handler.rs @@ -24,12 +24,12 @@ use crate::tests::game::DEFAULT_UNROLL_TIME_LOCK; fn test_smoke_can_initiate_channel_handler() { let mut allocator = AllocEncoder::new(); let mut rng = ChaCha8Rng::from_seed([0; 32]); - let unroll_metapuzzle = read_unroll_metapuzzle(&mut allocator).unwrap(); - let unroll_puzzle = read_unroll_puzzle(&mut allocator).unwrap(); + let unroll_metapuzzle = Rc::new(read_unroll_metapuzzle(&mut allocator).unwrap()); + let unroll_puzzle = Rc::new(read_unroll_puzzle(&mut allocator).unwrap()); // XXX let nil = allocator.allocator().null(); - let ref_puz = Puzzle::from_nodeptr(&mut allocator, nil).expect("should work"); - let standard_puzzle = get_standard_coin_puzzle(&mut allocator).expect("should load"); + let ref_puz = Rc::new(Puzzle::from_nodeptr(&mut allocator, nil).expect("should work")); + let standard_puzzle = Rc::new(get_standard_coin_puzzle(&mut allocator).expect("should load")); let mut env = ChannelHandlerEnv { allocator: &mut allocator, rng: &mut rng, @@ -87,12 +87,12 @@ fn test_smoke_can_initiate_channel_handler() { fn test_smoke_can_start_game() { let mut allocator = AllocEncoder::new(); let mut rng = ChaCha8Rng::from_seed([0; 32]); - let unroll_metapuzzle = read_unroll_metapuzzle(&mut allocator).unwrap(); - let unroll_puzzle = read_unroll_puzzle(&mut allocator).unwrap(); + let unroll_metapuzzle = Rc::new(read_unroll_metapuzzle(&mut allocator).unwrap()); + let unroll_puzzle = Rc::new(read_unroll_puzzle(&mut allocator).unwrap()); // XXX let nil = allocator.allocator().null(); - let ref_coin_puz = Puzzle::from_nodeptr(&mut allocator, nil).expect("should work"); - let standard_puzzle = get_standard_coin_puzzle(&mut allocator).expect("should load"); + let ref_coin_puz = Rc::new(Puzzle::from_nodeptr(&mut allocator, nil).expect("should work")); + let standard_puzzle = Rc::new(get_standard_coin_puzzle(&mut allocator).expect("should load")); let mut env = ChannelHandlerEnv { allocator: &mut allocator, rng: &mut rng, @@ -129,14 +129,14 @@ fn test_smoke_can_start_game() { let their_share = Amount::new(100); // Fake - let game_handler = Program::from_bytes(&[0x80]); - let initial_validation_puzzle = &game_handler; - let initial_state = Program::from_bytes(&[0x80]); + let game_handler = Rc::new(Program::from_bytes(&[0x80])); + let initial_validation_puzzle = game_handler.clone(); + let initial_state = Rc::new(Program::from_bytes(&[0x80])); let initial_validation_program = - ValidationProgram::new(env.allocator, initial_validation_puzzle.clone()); + ValidationProgram::new(env.allocator, initial_validation_puzzle); let timeout = Timeout::new(1337); - let game_handler = GameHandler::TheirTurnHandler(Rc::new(game_handler)); + let game_handler = GameHandler::TheirTurnHandler(game_handler.clone()); let _game_start_potato_sigs = game.player(1).ch.send_potato_start_game( &mut env, &[GameStartInfo { @@ -177,12 +177,12 @@ fn test_unroll_can_verify_own_signature() { let ref_puzzle_hash_1 = puzzle_hash_for_pk(&mut allocator, &public_key_1).expect("should work"); let ref_puzzle_hash_2 = puzzle_hash_for_pk(&mut allocator, &public_key_2).expect("should work"); - let unroll_metapuzzle = read_unroll_metapuzzle(&mut allocator).unwrap(); - let unroll_puzzle = read_unroll_puzzle(&mut allocator).unwrap(); + let unroll_metapuzzle = Rc::new(read_unroll_metapuzzle(&mut allocator).unwrap()); + let unroll_puzzle = Rc::new(read_unroll_puzzle(&mut allocator).unwrap()); let nil = allocator.allocator().null(); - let ref_coin_puz = Puzzle::from_nodeptr(&mut allocator, nil).expect("should work"); + let ref_coin_puz = Rc::new(Puzzle::from_nodeptr(&mut allocator, nil).expect("should work")); let ref_coin_ph = ref_coin_puz.sha256tree(&mut allocator); - let standard_puzzle = get_standard_coin_puzzle(&mut allocator).expect("should load"); + let standard_puzzle = Rc::new(get_standard_coin_puzzle(&mut allocator).expect("should load")); let mut env = ChannelHandlerEnv { allocator: &mut allocator, rng: &mut rng, diff --git a/src/tests/game_handler.rs b/src/tests/game_handler.rs index fc685459..90cb2edb 100644 --- a/src/tests/game_handler.rs +++ b/src/tests/game_handler.rs @@ -108,7 +108,9 @@ fn test_game_handler_my_turn() { .call_my_turn_driver( &mut allocator, &MyTurnInputs { - readable_new_move: ReadableMove::from_program(Program::from_bytes(&[0x80])), + readable_new_move: ReadableMove::from_program(Rc::new(Program::from_bytes(&[ + 0x80, + ]))), amount: Amount::default(), last_move: &[], last_mover_share: Amount::default(), diff --git a/src/tests/peer/potato_handler.rs b/src/tests/peer/potato_handler.rs index 918b1369..a406d526 100644 --- a/src/tests/peer/potato_handler.rs +++ b/src/tests/peer/potato_handler.rs @@ -305,7 +305,7 @@ where loop { let mut msgs = 0; for (who, peer) in peers.iter_mut().enumerate() { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; msgs += run_move(&mut env, amount.clone(), pipes, peer, who)? as usize; } if msgs == 0 { @@ -346,14 +346,14 @@ where let who = i % 2; { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; run_move(&mut env, Amount::new(200), pipes, &mut peers[who], who).expect("should send"); } i += 1; { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let mut penv: TestPeerEnv = TestPeerEnv { env: &mut env, system_interface: &mut pipes[who], @@ -372,7 +372,7 @@ where } if (10..12).contains(&i) { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; // Ensure that we notify about the channel coin (fake here, but the notification // is required). let channel_coin = get_channel_coin_for_peer(&peers[who])?; @@ -442,7 +442,7 @@ fn test_peer_smoke() { let mut peers = [p1, p2]; { - let mut env = channel_handler_env(&mut allocator, &mut rng); + let mut env = channel_handler_env(&mut allocator, &mut rng).expect("should work"); let mut penv = TestPeerEnv { env: &mut env, system_interface: &mut pipe_sender[0], @@ -471,7 +471,7 @@ fn test_peer_smoke() { // Start a game let game_ids = { - let mut env = channel_handler_env(&mut allocator, &mut rng); + let mut env = channel_handler_env(&mut allocator, &mut rng).expect("should work"); let mut penv = TestPeerEnv { env: &mut env, system_interface: &mut pipe_sender[1], @@ -533,7 +533,7 @@ fn test_peer_smoke() { { let entropy = rng.gen(); - let mut env = channel_handler_env(&mut allocator, &mut rng); + let mut env = channel_handler_env(&mut allocator, &mut rng).expect("should work"); let move_readable = ReadableMove::from_nodeptr(env.allocator, *what).expect("should work"); let mut penv = TestPeerEnv { @@ -561,7 +561,7 @@ fn test_peer_smoke() { let have_potato = if peers[0].has_potato() { 0 } else { 1 }; { - let mut env = channel_handler_env(&mut allocator, &mut rng); + let mut env = channel_handler_env(&mut allocator, &mut rng).expect("should work"); let mut penv = TestPeerEnv { env: &mut env, system_interface: &mut pipe_sender[have_potato], diff --git a/src/tests/peer/potato_handler_sim.rs b/src/tests/peer/potato_handler_sim.rs index 7e458f2d..9eb96acc 100644 --- a/src/tests/peer/potato_handler_sim.rs +++ b/src/tests/peer/potato_handler_sim.rs @@ -92,7 +92,7 @@ pub fn update_and_report_coins<'a, R: Rng>( // Report timed out coins for who in 0..=1 { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng).expect("should work"); let mut penv: SimulatedPeerSystem<'_, '_, R> = SimulatedPeerSystem::new(&mut env, &mut pipes[who]); @@ -350,7 +350,7 @@ fn check_watch_report<'a, 'b: 'a, R: Rng>( pipes: &'b mut [SimulatedPeer; 2], simulator: &'b mut Simulator, ) { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng).expect("should work"); let mut _simenv0 = SimulatedPeerSystem::new(&mut env, &mut pipes[0]); simulator.farm_block(&identities[0].puzzle_hash); @@ -390,14 +390,14 @@ pub fn handshake<'a, R: Rng + 'a>( debug!("handshake iterate {who}"); { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng).expect("should work"); run_move(&mut env, Amount::new(200), pipes, &mut peers[who], who).expect("should send"); } if let Some(ph) = pipes[who].channel_puzzle_hash.clone() { debug!("puzzle hash"); pipes[who].channel_puzzle_hash = None; - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng).expect("should work"); let mut penv = SimulatedPeerSystem::new(&mut env, &mut pipes[who]); penv.test_handle_received_channel_puzzle_hash( &identities[who], @@ -414,12 +414,12 @@ pub fn handshake<'a, R: Rng + 'a>( ); { - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng).expect("should work"); let mut penv = SimulatedPeerSystem::new(&mut env, &mut pipes[who]); peers[who].channel_transaction_completion(&mut penv, &u)?; } - let env = channel_handler_env(allocator, rng); + let env = channel_handler_env(allocator, rng).expect("should work"); let mut spends = u.clone(); // Create no coins. The target is already created in the partially funded // transaction. @@ -561,7 +561,7 @@ fn run_calpoker_test_with_action_list(allocator: &mut AllocEncoder, moves: &[Gam simulator.farm_block(&identities[0].puzzle_hash); { - let mut env = channel_handler_env(allocator, &mut rng); + let mut env = channel_handler_env(allocator, &mut rng).expect("should work"); let mut penv = SimulatedPeerSystem::new(&mut env, &mut peers[1]); handlers[1] .start(&mut penv, parent_coin_1.clone()) @@ -592,12 +592,12 @@ fn run_calpoker_test_with_action_list(allocator: &mut AllocEncoder, moves: &[Gam // Start game let game_ids = { - let mut env = channel_handler_env(allocator, &mut rng); + let mut env = channel_handler_env(allocator, &mut rng).expect("should work"); do_first_game_start(&mut env, &mut peers[1], &mut handlers[1]) }; { - let mut env = channel_handler_env(allocator, &mut rng); + let mut env = channel_handler_env(allocator, &mut rng).expect("should work"); do_second_game_start(&mut env, &mut peers[0], &mut handlers[0]); } @@ -622,7 +622,7 @@ fn run_calpoker_test_with_action_list(allocator: &mut AllocEncoder, moves: &[Gam { let entropy = rng.gen(); - let mut env = channel_handler_env(allocator, &mut rng); + let mut env = channel_handler_env(allocator, &mut rng).expect("should work"); let move_readable = ReadableMove::from_nodeptr(env.allocator, *what).expect("should work"); let mut penv = SimulatedPeerSystem::new(&mut env, &mut peers[who ^ 1]); diff --git a/src/tests/referee.rs b/src/tests/referee.rs index 19c82046..32b66a41 100644 --- a/src/tests/referee.rs +++ b/src/tests/referee.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use clvm_traits::{clvm_curried_args, ClvmEncoder, ToClvm}; use clvm_utils::CurriedProgram; use rand::prelude::*; @@ -16,9 +18,9 @@ use crate::common::types::{ use crate::referee::{GameMoveDetails, GameMoveStateInfo, RefereeMaker}; pub struct DebugGamePrograms { - pub my_validation_program: Program, + pub my_validation_program: Rc, #[allow(dead_code)] - pub their_validation_program: Program, + pub their_validation_program: Rc, pub my_turn_handler: GameHandler, pub their_turn_handler: GameHandler, } @@ -69,8 +71,9 @@ pub fn make_debug_game_handler( } .to_clvm(allocator) .expect("should curry"); - let my_validation_program = - Program::from_nodeptr(allocator, my_validation_program_node).expect("should convert"); + let my_validation_program = Rc::new( + Program::from_nodeptr(allocator, my_validation_program_node).expect("should convert"), + ); let their_turn_node = make_curried_game_handler(false) .to_clvm(allocator) @@ -83,8 +86,9 @@ pub fn make_debug_game_handler( } .to_clvm(allocator) .expect("should curry"); - let their_validation_program = - Program::from_nodeptr(allocator, their_validation_program_node).expect("should convert"); + let their_validation_program = Rc::new( + Program::from_nodeptr(allocator, their_validation_program_node).expect("should convert"), + ); DebugGamePrograms { my_validation_program, @@ -106,7 +110,7 @@ pub struct RefereeTest { pub their_referee: RefereeMaker, #[allow(dead_code)] - pub referee_coin_puzzle: Puzzle, + pub referee_coin_puzzle: Rc, #[allow(dead_code)] pub referee_coin_puzzle_hash: PuzzleHash, } @@ -123,8 +127,9 @@ impl RefereeTest { game_start: &GameStartInfo, ) -> RefereeTest { // Load up the real referee coin. - let referee_coin_puzzle = - read_hex_puzzle(allocator, "clsp/onchain/referee.hex").expect("should be readable"); + let referee_coin_puzzle = Rc::new( + read_hex_puzzle(allocator, "clsp/onchain/referee.hex").expect("should be readable"), + ); let referee_coin_puzzle_hash: PuzzleHash = referee_coin_puzzle.sha256tree(allocator); let (my_referee, first_puzzle_hash) = RefereeMaker::new( allocator, @@ -193,7 +198,7 @@ fn test_referee_smoke() { let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); let init_state_node = ((), ()).to_clvm(&mut allocator).expect("should assemble"); let init_state = - Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); + Rc::new(Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert")); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); diff --git a/src/tests/simenv.rs b/src/tests/simenv.rs index 913300e3..a922c57f 100644 --- a/src/tests/simenv.rs +++ b/src/tests/simenv.rs @@ -1,6 +1,8 @@ +use std::borrow::Borrow; +use std::rc::Rc; + use rand::{Rng, SeedableRng}; use rand_chacha::ChaCha8Rng; -use std::borrow::Borrow; use clvm_traits::ToClvm; use clvmr::{run_program, NodePtr}; @@ -57,7 +59,7 @@ impl<'a, R: Rng> SimulatorEnvironment<'a, R> { ChiaIdentity::new(allocator, their_private_key).expect("should generate"), ]; - let mut env = channel_handler_env(allocator, rng); + let mut env = channel_handler_env(allocator, rng)?; let simulator = Simulator::default(); let (parties, coin) = new_channel_handler_game( &simulator, @@ -434,11 +436,11 @@ impl<'a, R: Rng> SimulatorEnvironment<'a, R> { .player(*player) .ch .get_aggregate_channel_public_key(); - let puzzle = puzzle_for_synthetic_public_key( + let puzzle = Rc::new(puzzle_for_synthetic_public_key( self.env.allocator, &self.env.standard_puzzle, &channel_puzzle_public_key, - )?; + )?); let included = self .simulator .push_tx( @@ -583,7 +585,7 @@ fn test_referee_can_slash_on_chain() { let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); let init_state_node = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); let init_state = - Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); + Rc::new(Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert")); let initial_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); @@ -694,7 +696,7 @@ fn test_referee_can_move_on_chain() { let debug_game = make_debug_game_handler(&mut allocator, &my_identity, &amount, &timeout); let init_state_node = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble"); let init_state = - Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert"); + Rc::new(Program::from_nodeptr(&mut allocator, init_state_node).expect("should convert")); let my_validation_program = ValidationProgram::new(&mut allocator, debug_game.my_validation_program); From 8220d9c592ceb15ad1102df01237d138f26f9e61 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 30 Dec 2024 00:48:17 -0800 Subject: [PATCH 49/50] Fix wasm --- wasm/src/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wasm/src/mod.rs b/wasm/src/mod.rs index f5ca3fad..5f173206 100644 --- a/wasm/src/mod.rs +++ b/wasm/src/mod.rs @@ -154,12 +154,12 @@ struct JsGameCradleConfig { reward_puzzle_hash: String, } -fn convert_game_types(collection: &BTreeMap) -> Result, JsValue> { +fn convert_game_types(collection: &BTreeMap) -> Result>, JsValue> { let mut result = BTreeMap::new(); for (name, hex) in collection.iter() { let name_data = GameType(name.bytes().collect()); let byte_data = hex::decode(&hex).into_js()?; - result.insert(name_data, Program::from_bytes(&byte_data)); + result.insert(name_data, Rc::new(Program::from_bytes(&byte_data))); } Ok(result) } From f1ce8e6be32373f5d9972843387d1e4c05a2c506 Mon Sep 17 00:00:00 2001 From: arty Date: Mon, 30 Dec 2024 15:15:23 -0800 Subject: [PATCH 50/50] Fix wasm --- wasm/src/mod.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wasm/src/mod.rs b/wasm/src/mod.rs index e9d3cbd8..834a282e 100644 --- a/wasm/src/mod.rs +++ b/wasm/src/mod.rs @@ -17,10 +17,16 @@ use wasm_bindgen::prelude::*; use chia_gaming::channel_handler::types::ReadableMove; use chia_gaming::common::standard_coin::{wasm_deposit_file, ChiaIdentity}; +use chia_gaming::common::types; +use chia_gaming::common::types::{ + AllocEncoder, Amount, CoinSpend, CoinString, GameID, Hash, IntoErr, PrivateKey, Program, + PuzzleHash, Sha256Input, Spend, SpendBundle, Timeout, +}; +use chia_gaming::log::wasm_init; use chia_gaming::peer_container::{ GameCradle, IdleResult, SynchronousGameCradle, SynchronousGameCradleConfig, WatchReport, }; -use chia_gaming::potato_handler::{GameStart, GameType, ToLocalUI}; +use chia_gaming::potato_handler::types::{GameStart, GameType, ToLocalUI}; use chia_gaming::shutdown::BasicShutdownConditions; use crate::map_m::map_m; @@ -184,7 +190,6 @@ fn get_game_config<'b>( my_contribution: jsconfig.my_contribution.amt.clone(), their_contribution: jsconfig.their_contribution.amt.clone(), reward_puzzle_hash: PuzzleHash::from_hash(Hash::from_slice(&reward_puzzle_hash_bytes)), - unroll_timeout: Timeout::new(jsconfig.unroll_timeout as u64), }) }