-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.html
1 lines (1 loc) · 104 KB
/
index.html
1
<html><head><meta content="text/html; charset=UTF-8" http-equiv="content-type"><style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=0h_paUF1zYrDw0BiVvmPIPyDN7cgeRfA_woaXUgMUYU');ol.lst-kix_jv6tbfowz1em-2.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-2 0}ol.lst-kix_yhcsgv2hnk5w-1.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-1 0}ol.lst-kix_ge8owqwuqa6k-5.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-5 0}.lst-kix_fbh8c7lw08re-0>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-0}.lst-kix_3lz9mskx7fae-3>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-3}ol.lst-kix_fbh8c7lw08re-0.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-0 0}.lst-kix_yhcsgv2hnk5w-4>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-4}ol.lst-kix_enxdgss4fnib-8.start{counter-reset:lst-ctn-kix_enxdgss4fnib-8 0}.lst-kix_iw2kebf4mmbf-8>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-8}.lst-kix_yxd24y93fq5q-1>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-1}.lst-kix_bnzmaog1cg3g-0>li:before{content:"(" counter(lst-ctn-kix_bnzmaog1cg3g-0,decimal) ") "}ol.lst-kix_ai7azp5lx6os-1.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-1 0}.lst-kix_jv6tbfowz1em-6>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-6}.lst-kix_fstuy5hiz2mw-7>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-7}ol.lst-kix_yxd24y93fq5q-7.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-7 0}.lst-kix_enxdgss4fnib-8>li:before{content:"" counter(lst-ctn-kix_enxdgss4fnib-8,lower-roman) ". "}ol.lst-kix_yhcsgv2hnk5w-6{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-7{list-style-type:none}.lst-kix_enxdgss4fnib-7>li:before{content:"" counter(lst-ctn-kix_enxdgss4fnib-7,lower-latin) ". "}ol.lst-kix_yhcsgv2hnk5w-4{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-5{list-style-type:none}.lst-kix_yxd24y93fq5q-5>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-5}ol.lst-kix_jv6tbfowz1em-7.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-7 0}ol.lst-kix_yhcsgv2hnk5w-8{list-style-type:none}.lst-kix_enxdgss4fnib-4>li:before{content:"" counter(lst-ctn-kix_enxdgss4fnib-4,lower-latin) ") "}ol.lst-kix_3lz9mskx7fae-3.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-3 0}.lst-kix_enxdgss4fnib-3>li:before{content:"" counter(lst-ctn-kix_enxdgss4fnib-3,decimal) ") "}.lst-kix_enxdgss4fnib-5>li:before{content:"" counter(lst-ctn-kix_enxdgss4fnib-5,lower-roman) ") "}.lst-kix_enxdgss4fnib-2>li:before{content:"(" counter(lst-ctn-kix_enxdgss4fnib-2,lower-roman) ") "}.lst-kix_enxdgss4fnib-6>li:before{content:"" counter(lst-ctn-kix_enxdgss4fnib-6,decimal) ". "}.lst-kix_ge8owqwuqa6k-4>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-4}.lst-kix_enxdgss4fnib-0>li:before{content:"(" counter(lst-ctn-kix_enxdgss4fnib-0,decimal) ") "}.lst-kix_ai7azp5lx6os-4>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-4}.lst-kix_enxdgss4fnib-1>li:before{content:"(" counter(lst-ctn-kix_enxdgss4fnib-1,lower-latin) ") "}ol.lst-kix_enxdgss4fnib-1.start{counter-reset:lst-ctn-kix_enxdgss4fnib-1 0}.lst-kix_iw2kebf4mmbf-4>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-4}.lst-kix_fstuy5hiz2mw-3>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-3}ol.lst-kix_yxd24y93fq5q-2.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-2 0}ol.lst-kix_yhcsgv2hnk5w-2{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-3{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-0{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-1{list-style-type:none}.lst-kix_bnzmaog1cg3g-2>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-2}ol.lst-kix_ge8owqwuqa6k-0.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-0 0}.lst-kix_enxdgss4fnib-1>li{counter-increment:lst-ctn-kix_enxdgss4fnib-1}ol.lst-kix_iw2kebf4mmbf-6{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-5{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-8{list-style-type:none}.lst-kix_ai7azp5lx6os-1>li:before{content:"(" counter(lst-ctn-kix_ai7azp5lx6os-1,lower-latin) ") "}.lst-kix_ai7azp5lx6os-3>li:before{content:"" counter(lst-ctn-kix_ai7azp5lx6os-3,decimal) ") "}ol.lst-kix_iw2kebf4mmbf-7{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-2{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-1{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-4{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-3{list-style-type:none}.lst-kix_ge8owqwuqa6k-8>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-8}ol.lst-kix_iw2kebf4mmbf-0{list-style-type:none}ol.lst-kix_ai7azp5lx6os-8{list-style-type:none}.lst-kix_enxdgss4fnib-2>li{counter-increment:lst-ctn-kix_enxdgss4fnib-2}ol.lst-kix_ai7azp5lx6os-6{list-style-type:none}ol.lst-kix_ai7azp5lx6os-7{list-style-type:none}.lst-kix_iw2kebf4mmbf-1>li:before{content:"(" counter(lst-ctn-kix_iw2kebf4mmbf-1,lower-latin) ") "}.lst-kix_yxd24y93fq5q-0>li:before{content:"(" counter(lst-ctn-kix_yxd24y93fq5q-0,decimal) ") "}.lst-kix_yhcsgv2hnk5w-8>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-8}.lst-kix_bnzmaog1cg3g-6>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-6}ol.lst-kix_iw2kebf4mmbf-5.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-5 0}ol.lst-kix_3lz9mskx7fae-0.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-0 0}ol.lst-kix_enxdgss4fnib-6.start{counter-reset:lst-ctn-kix_enxdgss4fnib-6 0}.lst-kix_fupc8seahqzd-5>li:before{content:"+ "}ol.lst-kix_fbh8c7lw08re-7.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-7 0}.lst-kix_fupc8seahqzd-7>li:before{content:"+ "}.lst-kix_ai7azp5lx6os-5>li:before{content:"" counter(lst-ctn-kix_ai7azp5lx6os-5,lower-roman) ") "}.lst-kix_ai7azp5lx6os-7>li:before{content:"" counter(lst-ctn-kix_ai7azp5lx6os-7,lower-latin) ". "}.lst-kix_jv6tbfowz1em-3>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-3}.lst-kix_iw2kebf4mmbf-0>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-0}.lst-kix_yhcsgv2hnk5w-0>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-0}ol.lst-kix_fbh8c7lw08re-5.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-5 0}ol.lst-kix_yxd24y93fq5q-4.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-4 0}.lst-kix_jv6tbfowz1em-0>li:before{content:"(" counter(lst-ctn-kix_jv6tbfowz1em-0,decimal) ") "}.lst-kix_yhcsgv2hnk5w-1>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-1}.lst-kix_jv6tbfowz1em-2>li:before{content:"(" counter(lst-ctn-kix_jv6tbfowz1em-2,lower-roman) ") "}.lst-kix_jv6tbfowz1em-4>li:before{content:"" counter(lst-ctn-kix_jv6tbfowz1em-4,lower-latin) ") "}.lst-kix_ai7azp5lx6os-0>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-0}ol.lst-kix_enxdgss4fnib-3.start{counter-reset:lst-ctn-kix_enxdgss4fnib-3 0}ol.lst-kix_iw2kebf4mmbf-3.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-3 0}.lst-kix_iw2kebf4mmbf-5>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-5}.lst-kix_ge8owqwuqa6k-3>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-3}.lst-kix_fbh8c7lw08re-7>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-7}.lst-kix_bnzmaog1cg3g-2>li:before{content:"(" counter(lst-ctn-kix_bnzmaog1cg3g-2,lower-roman) ") "}.lst-kix_enxdgss4fnib-8>li{counter-increment:lst-ctn-kix_enxdgss4fnib-8}.lst-kix_bnzmaog1cg3g-4>li:before{content:"" counter(lst-ctn-kix_bnzmaog1cg3g-4,lower-latin) ") "}.lst-kix_yhcsgv2hnk5w-8>li:before{content:"" counter(lst-ctn-kix_yhcsgv2hnk5w-8,lower-roman) ". "}.lst-kix_jv6tbfowz1em-6>li:before{content:"" counter(lst-ctn-kix_jv6tbfowz1em-6,decimal) ". "}.lst-kix_jv6tbfowz1em-8>li:before{content:"" counter(lst-ctn-kix_jv6tbfowz1em-8,lower-roman) ". "}ol.lst-kix_yxd24y93fq5q-5.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-5 0}.lst-kix_bnzmaog1cg3g-8>li:before{content:"" counter(lst-ctn-kix_bnzmaog1cg3g-8,lower-roman) ". "}.lst-kix_yhcsgv2hnk5w-4>li:before{content:"" counter(lst-ctn-kix_yhcsgv2hnk5w-4,lower-latin) ") "}.lst-kix_yhcsgv2hnk5w-7>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-7}.lst-kix_bnzmaog1cg3g-6>li:before{content:"" counter(lst-ctn-kix_bnzmaog1cg3g-6,decimal) ". "}.lst-kix_yhcsgv2hnk5w-2>li:before{content:"(" counter(lst-ctn-kix_yhcsgv2hnk5w-2,lower-roman) ") "}.lst-kix_yhcsgv2hnk5w-6>li:before{content:"" counter(lst-ctn-kix_yhcsgv2hnk5w-6,decimal) ". "}.lst-kix_fbh8c7lw08re-8>li:before{content:"" counter(lst-ctn-kix_fbh8c7lw08re-8,lower-roman) ". "}.lst-kix_3lz9mskx7fae-8>li:before{content:"" counter(lst-ctn-kix_3lz9mskx7fae-8,lower-roman) ". "}ol.lst-kix_fbh8c7lw08re-3.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-3 0}.lst-kix_fbh8c7lw08re-5>li:before{content:"" counter(lst-ctn-kix_fbh8c7lw08re-5,lower-roman) ") "}.lst-kix_yhcsgv2hnk5w-1>li:before{content:"(" counter(lst-ctn-kix_yhcsgv2hnk5w-1,lower-latin) ") "}.lst-kix_yxd24y93fq5q-2>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-2}.lst-kix_fbh8c7lw08re-4>li:before{content:"" counter(lst-ctn-kix_fbh8c7lw08re-4,lower-latin) ") "}ol.lst-kix_ge8owqwuqa6k-2.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-2 0}.lst-kix_fbh8c7lw08re-1>li:before{content:"(" counter(lst-ctn-kix_fbh8c7lw08re-1,lower-latin) ") "}ol.lst-kix_yhcsgv2hnk5w-4.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-4 0}.lst-kix_fbh8c7lw08re-0>li:before{content:"(" counter(lst-ctn-kix_fbh8c7lw08re-0,decimal) ") "}.lst-kix_3lz9mskx7fae-5>li:before{content:"" counter(lst-ctn-kix_3lz9mskx7fae-5,lower-roman) ") "}.lst-kix_3lz9mskx7fae-4>li:before{content:"" counter(lst-ctn-kix_3lz9mskx7fae-4,lower-latin) ") "}.lst-kix_ai7azp5lx6os-3>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-3}ol.lst-kix_jv6tbfowz1em-1{list-style-type:none}ol.lst-kix_jv6tbfowz1em-0{list-style-type:none}ol.lst-kix_ge8owqwuqa6k-8.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-8 0}ol.lst-kix_jv6tbfowz1em-7{list-style-type:none}ol.lst-kix_jv6tbfowz1em-6{list-style-type:none}ol.lst-kix_jv6tbfowz1em-8{list-style-type:none}ol.lst-kix_jv6tbfowz1em-3{list-style-type:none}ol.lst-kix_jv6tbfowz1em-2{list-style-type:none}ol.lst-kix_jv6tbfowz1em-5{list-style-type:none}ol.lst-kix_jv6tbfowz1em-4{list-style-type:none}ol.lst-kix_jv6tbfowz1em-5.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-5 0}ol.lst-kix_enxdgss4fnib-0.start{counter-reset:lst-ctn-kix_enxdgss4fnib-0 0}ol.lst-kix_ge8owqwuqa6k-7.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-7 0}.lst-kix_ge8owqwuqa6k-5>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-5}ol.lst-kix_yhcsgv2hnk5w-3.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-3 0}ol.lst-kix_iw2kebf4mmbf-6.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-6 0}.lst-kix_yxd24y93fq5q-4>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-4}.lst-kix_fupc8seahqzd-0>li:before{content:"+ "}ol.lst-kix_ai7azp5lx6os-0{list-style-type:none}ol.lst-kix_ai7azp5lx6os-1{list-style-type:none}.lst-kix_fupc8seahqzd-1>li:before{content:"+ "}.lst-kix_iw2kebf4mmbf-5>li:before{content:"" counter(lst-ctn-kix_iw2kebf4mmbf-5,lower-roman) ") "}.lst-kix_yxd24y93fq5q-1>li:before{content:"(" counter(lst-ctn-kix_yxd24y93fq5q-1,lower-latin) ") "}.lst-kix_yxd24y93fq5q-5>li:before{content:"" counter(lst-ctn-kix_yxd24y93fq5q-5,lower-roman) ") "}ol.lst-kix_ai7azp5lx6os-4{list-style-type:none}ol.lst-kix_ai7azp5lx6os-5{list-style-type:none}ol.lst-kix_ai7azp5lx6os-2{list-style-type:none}ol.lst-kix_ai7azp5lx6os-3{list-style-type:none}.lst-kix_iw2kebf4mmbf-6>li:before{content:"" counter(lst-ctn-kix_iw2kebf4mmbf-6,decimal) ". "}.lst-kix_ai7azp5lx6os-1>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-1}.lst-kix_yxd24y93fq5q-4>li:before{content:"" counter(lst-ctn-kix_yxd24y93fq5q-4,lower-latin) ") "}.lst-kix_3lz9mskx7fae-2>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-2}.lst-kix_iw2kebf4mmbf-7>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-7}.lst-kix_3lz9mskx7fae-1>li:before{content:"(" counter(lst-ctn-kix_3lz9mskx7fae-1,lower-latin) ") "}.lst-kix_3lz9mskx7fae-0>li:before{content:"(" counter(lst-ctn-kix_3lz9mskx7fae-0,decimal) ") "}ol.lst-kix_jv6tbfowz1em-0.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-0 0}.lst-kix_fstuy5hiz2mw-6>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-6}ol.lst-kix_iw2kebf4mmbf-7.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-7 0}.lst-kix_yxd24y93fq5q-8>li:before{content:"" counter(lst-ctn-kix_yxd24y93fq5q-8,lower-roman) ". "}ol.lst-kix_fbh8c7lw08re-2.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-2 0}ol.lst-kix_yxd24y93fq5q-6{list-style-type:none}ol.lst-kix_yxd24y93fq5q-7{list-style-type:none}.lst-kix_ai7azp5lx6os-8>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-8}ol.lst-kix_yxd24y93fq5q-4{list-style-type:none}ol.lst-kix_yxd24y93fq5q-5{list-style-type:none}.lst-kix_iw2kebf4mmbf-2>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-2}.lst-kix_fstuy5hiz2mw-2>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-2,lower-roman) ". "}.lst-kix_fstuy5hiz2mw-6>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-6,decimal) ". "}ol.lst-kix_yxd24y93fq5q-8{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-8.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-8 0}ol.lst-kix_bnzmaog1cg3g-8{list-style-type:none}.lst-kix_ai7azp5lx6os-2>li:before{content:"(" counter(lst-ctn-kix_ai7azp5lx6os-2,lower-roman) ") "}ol.lst-kix_bnzmaog1cg3g-1{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-0{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-3{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-2{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-5{list-style-type:none}ol.lst-kix_enxdgss4fnib-2{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-4{list-style-type:none}ol.lst-kix_enxdgss4fnib-3{list-style-type:none}ol.lst-kix_iw2kebf4mmbf-8.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-8 0}ol.lst-kix_bnzmaog1cg3g-7{list-style-type:none}ol.lst-kix_enxdgss4fnib-0{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-6{list-style-type:none}ol.lst-kix_enxdgss4fnib-1{list-style-type:none}.lst-kix_iw2kebf4mmbf-2>li:before{content:"(" counter(lst-ctn-kix_iw2kebf4mmbf-2,lower-roman) ") "}ol.lst-kix_jv6tbfowz1em-6.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-6 0}.lst-kix_ge8owqwuqa6k-7>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-7}.lst-kix_1ovjyp4w4i8m-0>li:before{content:"+ "}ol.lst-kix_yxd24y93fq5q-2{list-style-type:none}ol.lst-kix_yxd24y93fq5q-3{list-style-type:none}ol.lst-kix_yxd24y93fq5q-0{list-style-type:none}ol.lst-kix_yxd24y93fq5q-1{list-style-type:none}.lst-kix_1ovjyp4w4i8m-4>li:before{content:"+ "}.lst-kix_3lz9mskx7fae-7>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-7}ol.lst-kix_ge8owqwuqa6k-1.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-1 0}.lst-kix_fupc8seahqzd-4>li:before{content:"+ "}ol.lst-kix_enxdgss4fnib-6{list-style-type:none}ol.lst-kix_enxdgss4fnib-7{list-style-type:none}ol.lst-kix_yxd24y93fq5q-0.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-0 0}ol.lst-kix_enxdgss4fnib-4{list-style-type:none}ol.lst-kix_enxdgss4fnib-5{list-style-type:none}ol.lst-kix_enxdgss4fnib-8{list-style-type:none}.lst-kix_fupc8seahqzd-8>li:before{content:"+ "}.lst-kix_1ovjyp4w4i8m-8>li:before{content:"+ "}ol.lst-kix_yhcsgv2hnk5w-5.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-5 0}.lst-kix_ai7azp5lx6os-6>li:before{content:"" counter(lst-ctn-kix_ai7azp5lx6os-6,decimal) ". "}.lst-kix_3lz9mskx7fae-0>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-0}ol.lst-kix_yhcsgv2hnk5w-6.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-6 0}.lst-kix_fstuy5hiz2mw-8>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-8}.lst-kix_jv6tbfowz1em-1>li:before{content:"(" counter(lst-ctn-kix_jv6tbfowz1em-1,lower-latin) ") "}ol.lst-kix_jv6tbfowz1em-4.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-4 0}.lst-kix_jv6tbfowz1em-5>li:before{content:"" counter(lst-ctn-kix_jv6tbfowz1em-5,lower-roman) ") "}ol.lst-kix_ge8owqwuqa6k-4.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-4 0}.lst-kix_bnzmaog1cg3g-4>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-4}.lst-kix_fstuy5hiz2mw-1>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-1}.lst-kix_enxdgss4fnib-5>li{counter-increment:lst-ctn-kix_enxdgss4fnib-5}ol.lst-kix_yhcsgv2hnk5w-7.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-7 0}.lst-kix_ge8owqwuqa6k-0>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-0}.lst-kix_bnzmaog1cg3g-3>li:before{content:"" counter(lst-ctn-kix_bnzmaog1cg3g-3,decimal) ") "}.lst-kix_fbh8c7lw08re-4>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-4}.lst-kix_jv6tbfowz1em-1>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-1}ol.lst-kix_jv6tbfowz1em-3.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-3 0}ol.lst-kix_ge8owqwuqa6k-3.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-3 0}.lst-kix_yhcsgv2hnk5w-5>li:before{content:"" counter(lst-ctn-kix_yhcsgv2hnk5w-5,lower-roman) ") "}.lst-kix_bnzmaog1cg3g-7>li:before{content:"" counter(lst-ctn-kix_bnzmaog1cg3g-7,lower-latin) ". "}.lst-kix_71k9jgjb7dl8-3>li:before{content:"+ "}.lst-kix_jv6tbfowz1em-8>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-8}.lst-kix_ai7azp5lx6os-2>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-2}ol.lst-kix_iw2kebf4mmbf-4.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-4 0}.lst-kix_fstuy5hiz2mw-5>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-5}.lst-kix_71k9jgjb7dl8-1>li:before{content:"+ "}.lst-kix_71k9jgjb7dl8-5>li:before{content:"+ "}.lst-kix_71k9jgjb7dl8-0>li:before{content:"+ "}.lst-kix_71k9jgjb7dl8-4>li:before{content:"+ "}ol.lst-kix_3lz9mskx7fae-4.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-4 0}.lst-kix_71k9jgjb7dl8-2>li:before{content:"+ "}.lst-kix_71k9jgjb7dl8-8>li:before{content:"+ "}.lst-kix_71k9jgjb7dl8-7>li:before{content:"+ "}ol.lst-kix_fbh8c7lw08re-6.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-6 0}.lst-kix_71k9jgjb7dl8-6>li:before{content:"+ "}ol.lst-kix_3lz9mskx7fae-4{list-style-type:none}ol.lst-kix_3lz9mskx7fae-3{list-style-type:none}ol.lst-kix_jv6tbfowz1em-8.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-8 0}ol.lst-kix_3lz9mskx7fae-2{list-style-type:none}.lst-kix_bnzmaog1cg3g-0>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-0}ol.lst-kix_3lz9mskx7fae-1{list-style-type:none}ol.lst-kix_3lz9mskx7fae-8{list-style-type:none}ol.lst-kix_3lz9mskx7fae-7{list-style-type:none}.lst-kix_iw2kebf4mmbf-6>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-6}ol.lst-kix_3lz9mskx7fae-6{list-style-type:none}ol.lst-kix_3lz9mskx7fae-5{list-style-type:none}.lst-kix_3lz9mskx7fae-1>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-1}ol.lst-kix_bnzmaog1cg3g-5.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-5 0}ol.lst-kix_3lz9mskx7fae-0{list-style-type:none}.lst-kix_wrb45agb25k0-5>li:before{content:"- "}.lst-kix_wrb45agb25k0-6>li:before{content:"- "}.lst-kix_ge8owqwuqa6k-2>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-2}.lst-kix_wrb45agb25k0-7>li:before{content:"- "}.lst-kix_yhcsgv2hnk5w-6>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-6}ol.lst-kix_enxdgss4fnib-2.start{counter-reset:lst-ctn-kix_enxdgss4fnib-2 0}.lst-kix_enxdgss4fnib-7>li{counter-increment:lst-ctn-kix_enxdgss4fnib-7}.lst-kix_wrb45agb25k0-8>li:before{content:"- "}.lst-kix_wrb45agb25k0-4>li:before{content:"- "}ol.lst-kix_yxd24y93fq5q-1.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-1 0}ol.lst-kix_fbh8c7lw08re-1.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-1 0}ol.lst-kix_yxd24y93fq5q-8.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-8 0}ul.lst-kix_wrb45agb25k0-5{list-style-type:none}.lst-kix_wrb45agb25k0-3>li:before{content:"- "}ul.lst-kix_wrb45agb25k0-6{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-0.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-0 0}ul.lst-kix_wrb45agb25k0-7{list-style-type:none}ul.lst-kix_wrb45agb25k0-8{list-style-type:none}.lst-kix_ge8owqwuqa6k-1>li:before{content:"(" counter(lst-ctn-kix_ge8owqwuqa6k-1,lower-latin) ") "}.lst-kix_wrb45agb25k0-1>li:before{content:"- "}.lst-kix_wrb45agb25k0-2>li:before{content:"- "}.lst-kix_ge8owqwuqa6k-0>li:before{content:"(" counter(lst-ctn-kix_ge8owqwuqa6k-0,decimal) ") "}.lst-kix_ge8owqwuqa6k-2>li:before{content:"(" counter(lst-ctn-kix_ge8owqwuqa6k-2,lower-roman) ") "}ol.lst-kix_jv6tbfowz1em-1.start{counter-reset:lst-ctn-kix_jv6tbfowz1em-1 0}.lst-kix_wrb45agb25k0-0>li:before{content:"- "}.lst-kix_ge8owqwuqa6k-5>li:before{content:"" counter(lst-ctn-kix_ge8owqwuqa6k-5,lower-roman) ") "}.lst-kix_ge8owqwuqa6k-4>li:before{content:"" counter(lst-ctn-kix_ge8owqwuqa6k-4,lower-latin) ") "}.lst-kix_ge8owqwuqa6k-6>li:before{content:"" counter(lst-ctn-kix_ge8owqwuqa6k-6,decimal) ". "}ol.lst-kix_ge8owqwuqa6k-6.start{counter-reset:lst-ctn-kix_ge8owqwuqa6k-6 0}.lst-kix_ge8owqwuqa6k-3>li:before{content:"" counter(lst-ctn-kix_ge8owqwuqa6k-3,decimal) ") "}.lst-kix_ge8owqwuqa6k-7>li:before{content:"" counter(lst-ctn-kix_ge8owqwuqa6k-7,lower-latin) ". "}.lst-kix_yhcsgv2hnk5w-2>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-2}ul.lst-kix_wrb45agb25k0-1{list-style-type:none}ul.lst-kix_wrb45agb25k0-2{list-style-type:none}ul.lst-kix_wrb45agb25k0-3{list-style-type:none}ul.lst-kix_wrb45agb25k0-4{list-style-type:none}.lst-kix_fbh8c7lw08re-2>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-2}ul.lst-kix_wrb45agb25k0-0{list-style-type:none}.lst-kix_3lz9mskx7fae-5>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-5}.lst-kix_enxdgss4fnib-3>li{counter-increment:lst-ctn-kix_enxdgss4fnib-3}ol.lst-kix_enxdgss4fnib-7.start{counter-reset:lst-ctn-kix_enxdgss4fnib-7 0}.lst-kix_enxdgss4fnib-0>li{counter-increment:lst-ctn-kix_enxdgss4fnib-0}.lst-kix_ge8owqwuqa6k-8>li:before{content:"" counter(lst-ctn-kix_ge8owqwuqa6k-8,lower-roman) ". "}ol.lst-kix_ai7azp5lx6os-2.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-2 0}.lst-kix_fstuy5hiz2mw-1>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-1,lower-latin) ". "}.lst-kix_fstuy5hiz2mw-5>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-5,lower-roman) ". "}.lst-kix_yxd24y93fq5q-7>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-7}ol.lst-kix_yxd24y93fq5q-6.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-6 0}.lst-kix_fstuy5hiz2mw-7>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-7,lower-latin) ". "}.lst-kix_bnzmaog1cg3g-7>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-7}ol.lst-kix_yxd24y93fq5q-3.start{counter-reset:lst-ctn-kix_yxd24y93fq5q-3 0}.lst-kix_1ovjyp4w4i8m-3>li:before{content:"+ "}ol.lst-kix_fstuy5hiz2mw-8.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-8 0}.lst-kix_1ovjyp4w4i8m-1>li:before{content:"+ "}.lst-kix_1ovjyp4w4i8m-5>li:before{content:"+ "}ol.lst-kix_yhcsgv2hnk5w-2.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-2 0}ol.lst-kix_fbh8c7lw08re-4.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-4 0}.lst-kix_1ovjyp4w4i8m-7>li:before{content:"+ "}ol.lst-kix_iw2kebf4mmbf-2.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-2 0}.lst-kix_fbh8c7lw08re-6>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-6}.lst-kix_ai7azp5lx6os-5>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-5}ul.lst-kix_fupc8seahqzd-6{list-style-type:none}ul.lst-kix_fupc8seahqzd-5{list-style-type:none}ul.lst-kix_fupc8seahqzd-8{list-style-type:none}ul.lst-kix_fupc8seahqzd-7{list-style-type:none}ol.lst-kix_ai7azp5lx6os-0.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-0 0}ul.lst-kix_fupc8seahqzd-2{list-style-type:none}ul.lst-kix_fupc8seahqzd-1{list-style-type:none}ul.lst-kix_fupc8seahqzd-4{list-style-type:none}.lst-kix_ai7azp5lx6os-6>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-6}ul.lst-kix_fupc8seahqzd-3{list-style-type:none}ul.lst-kix_fupc8seahqzd-0{list-style-type:none}.lst-kix_yxd24y93fq5q-6>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-6}.lst-kix_yxd24y93fq5q-0>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-0}ol.lst-kix_ge8owqwuqa6k-5{list-style-type:none}ol.lst-kix_ge8owqwuqa6k-6{list-style-type:none}ol.lst-kix_enxdgss4fnib-4.start{counter-reset:lst-ctn-kix_enxdgss4fnib-4 0}ol.lst-kix_ge8owqwuqa6k-7{list-style-type:none}ol.lst-kix_ge8owqwuqa6k-8{list-style-type:none}.lst-kix_jv6tbfowz1em-4>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-4}ol.lst-kix_ge8owqwuqa6k-1{list-style-type:none}ol.lst-kix_ge8owqwuqa6k-2{list-style-type:none}ol.lst-kix_ge8owqwuqa6k-3{list-style-type:none}ol.lst-kix_ge8owqwuqa6k-4{list-style-type:none}ol.lst-kix_yhcsgv2hnk5w-0.start{counter-reset:lst-ctn-kix_yhcsgv2hnk5w-0 0}.lst-kix_fstuy5hiz2mw-3>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-3,decimal) ". "}ol.lst-kix_ge8owqwuqa6k-0{list-style-type:none}ol.lst-kix_enxdgss4fnib-5.start{counter-reset:lst-ctn-kix_enxdgss4fnib-5 0}.lst-kix_fbh8c7lw08re-7>li:before{content:"" counter(lst-ctn-kix_fbh8c7lw08re-7,lower-latin) ". "}ol.lst-kix_fbh8c7lw08re-2{list-style-type:none}ol.lst-kix_bnzmaog1cg3g-2.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-2 0}ol.lst-kix_fbh8c7lw08re-1{list-style-type:none}.lst-kix_yhcsgv2hnk5w-0>li:before{content:"(" counter(lst-ctn-kix_yhcsgv2hnk5w-0,decimal) ") "}ol.lst-kix_fbh8c7lw08re-4{list-style-type:none}.lst-kix_fbh8c7lw08re-6>li:before{content:"" counter(lst-ctn-kix_fbh8c7lw08re-6,decimal) ". "}ol.lst-kix_fbh8c7lw08re-3{list-style-type:none}ol.lst-kix_fbh8c7lw08re-6{list-style-type:none}ol.lst-kix_fbh8c7lw08re-5{list-style-type:none}ol.lst-kix_fbh8c7lw08re-8{list-style-type:none}ol.lst-kix_fbh8c7lw08re-7{list-style-type:none}.lst-kix_3lz9mskx7fae-3>li:before{content:"" counter(lst-ctn-kix_3lz9mskx7fae-3,decimal) ") "}.lst-kix_fbh8c7lw08re-2>li:before{content:"(" counter(lst-ctn-kix_fbh8c7lw08re-2,lower-roman) ") "}.lst-kix_fbh8c7lw08re-3>li:before{content:"" counter(lst-ctn-kix_fbh8c7lw08re-3,decimal) ") "}ol.lst-kix_fstuy5hiz2mw-6.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-6 0}ol.lst-kix_iw2kebf4mmbf-1.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-1 0}.lst-kix_bnzmaog1cg3g-1>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-1}.lst-kix_3lz9mskx7fae-7>li:before{content:"" counter(lst-ctn-kix_3lz9mskx7fae-7,lower-latin) ". "}.lst-kix_fstuy5hiz2mw-4>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-4}.lst-kix_fbh8c7lw08re-1>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-1}.lst-kix_ge8owqwuqa6k-1>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-1}.lst-kix_3lz9mskx7fae-6>li:before{content:"" counter(lst-ctn-kix_3lz9mskx7fae-6,decimal) ". "}ol.lst-kix_3lz9mskx7fae-1.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-1 0}.lst-kix_bnzmaog1cg3g-3>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-3}ol.lst-kix_fstuy5hiz2mw-4{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-5{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-2{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-3{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-8{list-style-type:none}.lst-kix_3lz9mskx7fae-4>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-4}ol.lst-kix_fstuy5hiz2mw-6{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-7{list-style-type:none}ol.lst-kix_3lz9mskx7fae-7.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-7 0}ol.lst-kix_fstuy5hiz2mw-0{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-1{list-style-type:none}.lst-kix_yhcsgv2hnk5w-3>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-3}ol.lst-kix_fbh8c7lw08re-0{list-style-type:none}.lst-kix_jv6tbfowz1em-5>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-5}ol.lst-kix_fbh8c7lw08re-8.start{counter-reset:lst-ctn-kix_fbh8c7lw08re-8 0}ol.lst-kix_ai7azp5lx6os-4.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-4 0}ol.lst-kix_fstuy5hiz2mw-0.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-0 0}.lst-kix_fbh8c7lw08re-8>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-8}ol.lst-kix_bnzmaog1cg3g-8.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-8 0}.lst-kix_fupc8seahqzd-3>li:before{content:"+ "}.lst-kix_fupc8seahqzd-2>li:before{content:"+ "}.lst-kix_yxd24y93fq5q-3>li:before{content:"" counter(lst-ctn-kix_yxd24y93fq5q-3,decimal) ") "}.lst-kix_yhcsgv2hnk5w-5>li{counter-increment:lst-ctn-kix_yhcsgv2hnk5w-5}.lst-kix_iw2kebf4mmbf-7>li:before{content:"" counter(lst-ctn-kix_iw2kebf4mmbf-7,lower-latin) ". "}.lst-kix_yxd24y93fq5q-2>li:before{content:"(" counter(lst-ctn-kix_yxd24y93fq5q-2,lower-roman) ") "}.lst-kix_yxd24y93fq5q-6>li:before{content:"" counter(lst-ctn-kix_yxd24y93fq5q-6,decimal) ". "}ol.lst-kix_ai7azp5lx6os-3.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-3 0}.lst-kix_iw2kebf4mmbf-3>li:before{content:"" counter(lst-ctn-kix_iw2kebf4mmbf-3,decimal) ") "}ol.lst-kix_bnzmaog1cg3g-1.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-1 0}.lst-kix_ai7azp5lx6os-7>li{counter-increment:lst-ctn-kix_ai7azp5lx6os-7}.lst-kix_3lz9mskx7fae-2>li:before{content:"(" counter(lst-ctn-kix_3lz9mskx7fae-2,lower-roman) ") "}ol.lst-kix_fstuy5hiz2mw-1.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-1 0}.lst-kix_enxdgss4fnib-6>li{counter-increment:lst-ctn-kix_enxdgss4fnib-6}ol.lst-kix_iw2kebf4mmbf-0.start{counter-reset:lst-ctn-kix_iw2kebf4mmbf-0 0}.lst-kix_iw2kebf4mmbf-4>li:before{content:"" counter(lst-ctn-kix_iw2kebf4mmbf-4,lower-latin) ") "}.lst-kix_fstuy5hiz2mw-0>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-0}.lst-kix_bnzmaog1cg3g-8>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-8}.lst-kix_bnzmaog1cg3g-5>li{counter-increment:lst-ctn-kix_bnzmaog1cg3g-5}ol.lst-kix_3lz9mskx7fae-2.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-2 0}ol.lst-kix_bnzmaog1cg3g-7.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-7 0}.lst-kix_3lz9mskx7fae-8>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-8}.lst-kix_yxd24y93fq5q-7>li:before{content:"" counter(lst-ctn-kix_yxd24y93fq5q-7,lower-latin) ". "}ol.lst-kix_fstuy5hiz2mw-7.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-7 0}.lst-kix_iw2kebf4mmbf-8>li:before{content:"" counter(lst-ctn-kix_iw2kebf4mmbf-8,lower-roman) ". "}.lst-kix_fstuy5hiz2mw-4>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-4,lower-latin) ". "}.lst-kix_jv6tbfowz1em-2>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-2}.lst-kix_ai7azp5lx6os-0>li:before{content:"(" counter(lst-ctn-kix_ai7azp5lx6os-0,decimal) ") "}ol.lst-kix_fstuy5hiz2mw-2.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-2 0}.lst-kix_fstuy5hiz2mw-0>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-0,decimal) ". "}.lst-kix_fstuy5hiz2mw-8>li:before{content:"" counter(lst-ctn-kix_fstuy5hiz2mw-8,lower-roman) ". "}ol.lst-kix_3lz9mskx7fae-8.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-8 0}.lst-kix_fbh8c7lw08re-5>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-5}ol.lst-kix_ai7azp5lx6os-5.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-5 0}ol.lst-kix_fstuy5hiz2mw-5.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-5 0}ol.lst-kix_bnzmaog1cg3g-6.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-6 0}.lst-kix_iw2kebf4mmbf-1>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-1}.lst-kix_yxd24y93fq5q-8>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-8}.lst-kix_iw2kebf4mmbf-0>li:before{content:"(" counter(lst-ctn-kix_iw2kebf4mmbf-0,decimal) ") "}ol.lst-kix_bnzmaog1cg3g-3.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-3 0}ol.lst-kix_ai7azp5lx6os-8.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-8 0}.lst-kix_fupc8seahqzd-6>li:before{content:"+ "}.lst-kix_1ovjyp4w4i8m-2>li:before{content:"+ "}.lst-kix_jv6tbfowz1em-0>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-0}.lst-kix_ai7azp5lx6os-4>li:before{content:"" counter(lst-ctn-kix_ai7azp5lx6os-4,lower-latin) ") "}.lst-kix_ai7azp5lx6os-8>li:before{content:"" counter(lst-ctn-kix_ai7azp5lx6os-8,lower-roman) ". "}.lst-kix_iw2kebf4mmbf-3>li{counter-increment:lst-ctn-kix_iw2kebf4mmbf-3}.lst-kix_1ovjyp4w4i8m-6>li:before{content:"+ "}ol.lst-kix_bnzmaog1cg3g-4.start{counter-reset:lst-ctn-kix_bnzmaog1cg3g-4 0}ol.lst-kix_3lz9mskx7fae-6.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-6 0}.lst-kix_fbh8c7lw08re-3>li{counter-increment:lst-ctn-kix_fbh8c7lw08re-3}.lst-kix_enxdgss4fnib-4>li{counter-increment:lst-ctn-kix_enxdgss4fnib-4}.lst-kix_3lz9mskx7fae-6>li{counter-increment:lst-ctn-kix_3lz9mskx7fae-6}.lst-kix_fstuy5hiz2mw-2>li{counter-increment:lst-ctn-kix_fstuy5hiz2mw-2}.lst-kix_jv6tbfowz1em-3>li:before{content:"" counter(lst-ctn-kix_jv6tbfowz1em-3,decimal) ") "}ul.lst-kix_1ovjyp4w4i8m-0{list-style-type:none}ul.lst-kix_1ovjyp4w4i8m-1{list-style-type:none}ul.lst-kix_1ovjyp4w4i8m-2{list-style-type:none}ul.lst-kix_1ovjyp4w4i8m-3{list-style-type:none}ul.lst-kix_1ovjyp4w4i8m-4{list-style-type:none}ol.lst-kix_ai7azp5lx6os-7.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-7 0}ul.lst-kix_1ovjyp4w4i8m-5{list-style-type:none}ul.lst-kix_1ovjyp4w4i8m-6{list-style-type:none}ul.lst-kix_1ovjyp4w4i8m-7{list-style-type:none}ol.lst-kix_fstuy5hiz2mw-3.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-3 0}ul.lst-kix_1ovjyp4w4i8m-8{list-style-type:none}.lst-kix_yxd24y93fq5q-3>li{counter-increment:lst-ctn-kix_yxd24y93fq5q-3}.lst-kix_bnzmaog1cg3g-1>li:before{content:"(" counter(lst-ctn-kix_bnzmaog1cg3g-1,lower-latin) ") "}.lst-kix_ge8owqwuqa6k-6>li{counter-increment:lst-ctn-kix_ge8owqwuqa6k-6}.lst-kix_jv6tbfowz1em-7>li:before{content:"" counter(lst-ctn-kix_jv6tbfowz1em-7,lower-latin) ". "}.lst-kix_bnzmaog1cg3g-5>li:before{content:"" counter(lst-ctn-kix_bnzmaog1cg3g-5,lower-roman) ") "}ul.lst-kix_71k9jgjb7dl8-0{list-style-type:none}ul.lst-kix_71k9jgjb7dl8-2{list-style-type:none}ul.lst-kix_71k9jgjb7dl8-1{list-style-type:none}.lst-kix_jv6tbfowz1em-7>li{counter-increment:lst-ctn-kix_jv6tbfowz1em-7}.lst-kix_yhcsgv2hnk5w-3>li:before{content:"" counter(lst-ctn-kix_yhcsgv2hnk5w-3,decimal) ") "}.lst-kix_yhcsgv2hnk5w-7>li:before{content:"" counter(lst-ctn-kix_yhcsgv2hnk5w-7,lower-latin) ". "}ol.lst-kix_fstuy5hiz2mw-4.start{counter-reset:lst-ctn-kix_fstuy5hiz2mw-4 0}ul.lst-kix_71k9jgjb7dl8-8{list-style-type:none}ul.lst-kix_71k9jgjb7dl8-7{list-style-type:none}ol.lst-kix_3lz9mskx7fae-5.start{counter-reset:lst-ctn-kix_3lz9mskx7fae-5 0}ul.lst-kix_71k9jgjb7dl8-4{list-style-type:none}ol.lst-kix_ai7azp5lx6os-6.start{counter-reset:lst-ctn-kix_ai7azp5lx6os-6 0}ul.lst-kix_71k9jgjb7dl8-3{list-style-type:none}ul.lst-kix_71k9jgjb7dl8-6{list-style-type:none}ul.lst-kix_71k9jgjb7dl8-5{list-style-type:none}ol{margin:0;padding:0}.c22{margin-left:36pt;orphans:2;widows:2;padding-left:0pt;direction:ltr}.c1{margin-left:-36pt;orphans:2;widows:2;direction:ltr}.c8{background-color:#ffffff;font-size:10.5pt;color:#4078c0}.c7{background-color:#ffffff;font-size:10.5pt;color:#333333}.c26{background-color:#ffffff;max-width:697.9pt;padding:72pt 72pt 72pt 72pt}.c30{orphans:2;widows:2;direction:ltr}.c9{list-style-position:inside;text-indent:0pt}.c25{font-size:18pt;text-decoration:underline}.c15{color:inherit;text-decoration:inherit}.c12{font-size:10pt;font-style:italic}.c13{padding:0;margin:0}.c17{padding-bottom:12pt;line-height:0.9142857142857144}.c3{font-size:12pt;font-family:"Consolas"}.c28{background-color:#fdfeff;color:#001320}.c19{padding-bottom:12pt;line-height:0.9142875}.c24{color:#1155cc;text-decoration:underline}.c21{color:#333333}.c6{text-align:center}.c20{margin-right:-63pt}.c29{font-size:18pt}.c18{font-size:16pt}.c2{height:11pt}.c10{font-size:14pt}.c5{font-size:12pt}.c31{line-height:0.9142857142857144}.c0{font-weight:bold}.c11{font-size:13pt}.c23{font-style:italic}.c14{text-align:left}.c27{font-family:"Cambria"}.c16{background-color:#fff6d5}.c4{font-family:"Consolas"}.title{padding-top:0pt;color:#000000;font-size:21pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:13pt;padding-bottom:10pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:10pt;color:#000000;font-size:16pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:10pt;color:#000000;font-weight:bold;font-size:13pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:8pt;color:#666666;font-weight:bold;font-size:12pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:8pt;color:#666666;text-decoration:underline;font-size:11pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:8pt;color:#666666;font-size:11pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:8pt;color:#666666;font-size:11pt;padding-bottom:0pt;font-family:"Trebuchet MS";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style></head><body class="c26"><p class="c1 c6"><span class="c29">Thunder Network</span></p><p class="c1 c6"><span class="c12">Mats Jerratsch - [email protected]</span></p><p class="c1 c2"><span class="c23"></span></p><p class="c1"><span class="c12 c28">Your thunder was heard in the whirlwind, your lightning lit up the world; the earth trembled and quaked. -</span><span class="c12">Psalm 77:18</span></p><p class="c1 c2"><span class="c12"></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1"><span>A productive prototype implementation of the Lightning Network on a client-server model with simplifications to allow for a similar experience with features readily available today.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>This prototype is made up on two back-end libraries and a client front-end. I used bitcoinJ to have a proper framework for all of the bitcoin logic, and implemented my modifications of the LN, from here on called Thunder Network, as it is thought of a predecessor</span><span class="c16"> of LN</span><span>. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1"><span class="c5 c0">My current estimate for OP_CLTV and OP_CSV activation is around Q3 2016. I will shift my work towards implementing the changes proposed by Rusty Russel. [</span><span class="c24 c5 c0"><a class="c15" href="https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2FElementsProject%2Flightning&sa=D&sntz=1&usg=AFQjCNGr2voqsf2m0iCyw5WV4uir6knqeg">1</a></span><span class="c5 c0">] Changing the design of the channel is trivial, but there are many unresolved problems like routing that are open for discussion on the mailing list. </span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1"><span class="c5 c0">This will allow for full P2P networks with hubs/nodes of varying sizes and is a no-trust solution. Due to the </span><span class="c5 c0 c23">short </span><span class="c5 c0">timespan until the needed features are available, pushing ThunderNetwork into the masses is not reasonable.</span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1"><span class="c5 c0">Big nodes and a client-server alike structure can always evolve out of a P2P network due to natural economics - if necessary. The same does not hold true the other way round.</span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1"><span class="c5 c0">For now I will stick with the basic server/client architecture, such that users can also choose to just be ‘most basic customers’, it’s like full node vs. SPV. The servers on their own will form a P2P mesh, where users can chose their nodes. Client and server mostly differ in their connectivity, as servers will have a very high uptime, where clients should not bother about that.</span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1"><span class="c5 c0">GitHub Repository</span></p><p class="c1"><span class="c24 c5 c0"><a class="c15" href="https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fmatsjj%2Fthundernetwork&sa=D&sntz=1&usg=AFQjCNF3OTf9LpJx0Edu9dw4rqyWz9DjMA">https://github.com/matsjj/thundernetwork</a></span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1"><span class="c5 c0">Downloads (v0.0.2)</span></p><p class="c1"><span class="c5 c23">Due to some problems with JRE I bundled everything together into a portable .rar for Windows users. </span></p><p class="c1"><span class="c5 c0">Portable .rar (Windows) </span><span class="c5 c0 c24"><a class="c15" href="http://www.google.com/url?q=http%3A%2F%2Fthunder.network%2FThunderWallet.rar&sa=D&sntz=1&usg=AFQjCNEI0zuvdMo0XnCHIFLLFelfHnWxtg">ThunderWallet.rar</a></span><span class="c5 c0"> </span></p><p class="c1"><span class="c5 c0">Executable .jar (Other OSs) </span><span class="c24 c5 c0"><a class="c15" href="http://www.google.com/url?q=http%3A%2F%2Fthunder.network%2FThunderWallet.jar&sa=D&sntz=1&usg=AFQjCNFcZaZGTqK7anh5OZR2Wz1gGwQZrg">ThunderWallet.jar</a></span><span class="c5 c0"> (requires JRE 1.8+)</span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 479.72px; height: 288.50px;"><img alt="" src="images/image12.png" style="width: 479.72px; height: 288.50px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 479.75px; height: 287.50px;"><img alt="" src="images/image09.png" style="width: 479.75px; height: 287.50px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 478.09px; height: 286.50px;"><img alt="" src="images/image08.png" style="width: 478.09px; height: 286.50px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 478.09px; height: 286.50px;"><img alt="" src="images/image01.png" style="width: 478.09px; height: 286.50px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1 c6"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 987.61px; height: 581.50px;"><img alt="" src="images/image00.gif" style="width: 987.61px; height: 581.50px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c6"><span class="c5 c0 c27">This software is in alpha status and a work in progress. The main goal of this project is to provide libraries that can be used in other, more widely used wallets. The GUI provided is just a prototype to show the functionality.</span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1 c19"><span class="c5 c21">It is a portable version, you can run multiple instances as long as they are based in different directories.</span></p><p class="c1 c19"><span class="c21 c5 c0">Addresses are one-time-only</span><span class="c21 c5">, due to the no-trust. Read below for more information.</span></p><p class="c1 c19 c2"><span class="c21 c5"></span></p><p class="c1"><span class="c3">Changelog Wallet</span></p><p class="c1"><span class="c3"> 0.0.2</span></p><p class="c1"><span class="c3"> Added realtime updates (using websockets)</span></p><p class="c1"><span class="c3"> Added basic interface for thunder:... requests (needs further OS implementation for activation)</span></p><p class="c1"><span class="c3"> Various bugfixes</span></p><p class="c1 c2"><span class="c5 c0"></span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1"><span class="c10 c0 c4">Roadmap</span></p><p class="c1"><span class="c3"> [ 50% ] Server Functionality</span></p><p class="c1"><span class="c3"> [ 40% ] Client Functionality</span></p><p class="c1"><span class="c3"> [ 10% ] Testing</span></p><p class="c1"><span class="c3"> [ 10% ] Security Hardening</span></p><p class="c1 c2"><span class="c3"></span></p><p class="c1"><span class="c10 c0 c4">Working</span></p><p class="c1"><span class="c11 c4"> Server-Client Communications</span></p><p class="c1"><span class="c4"> Open Channel</span></p><p class="c1"><span class="c4"> Make Payment</span></p><p class="c1"><span class="c4"> Redeem Payment</span></p><p class="c1"><span class="c4"> Update Channel</span></p><p class="c1"><span class="c4"> Close Channel</span></p><p class="c1"><span class="c4"> Key Management using BIP32 and hardened HD-Keys</span></p><p class="c1"><span class="c11 c4"> Server</span></p><p class="c1"><span class="c4"> Monitoring Blockchain for Transactions</span></p><p class="c1"><span class="c4"> Claiming Outputs for revoked Transactions</span></p><p class="c1"><span class="c4"> Broadcasting Refunds and Settlements for correct Transactions</span></p><p class="c1 c2"><span class="c3"></span></p><p class="c1"><span class="c10 c0 c4">Necessary for MainNet</span></p><p class="c1"><span class="c11 c4"> Server-Client Communications</span></p><p class="c1"><span class="c4"> Restore Channel on Client</span></p><p class="c1"><span class="c4 c11"> Server</span></p><p class="c1"><span class="c4"> Increased Backup Services</span></p><p class="c1"><span class="c4"> Removal of Hot Wallet</span></p><p class="c1"><span class="c4"> Extensive Monitoring</span></p><p class="c1"><span class="c11 c4"> Client</span></p><p class="c1"><span class="c4"> Monitoring Blockchain for Transactions</span></p><p class="c1"><span class="c4"> Claiming Outputs for revoked Transactions</span></p><p class="c1"><span class="c4"> Broadcasting Refunds and Settlements for correct Transactions</span></p><p class="c1"><span class="c11 c4"> ClientGUI</span></p><p class="c1"><span class="c4"> Various Features (esp. Data Consistency)</span></p><p class="c1 c2"><span class="c3"></span></p><p class="c1"><span class="c10 c0 c4">Planned Features (depending on interest)</span></p><p class="c1"><span class="c11 c4"> Server-Client Communication</span></p><p class="c1"><span class="c4"> Payment Request Interface for seamless Integration with various other Programs</span></p><p class="c1"><span class="c4"> Automatic Payment towards specified Users for Micropayments</span></p><p class="c1 c2"><span class="c5"></span></p><p class="c1"><span class="c3">Changelog Document</span></p><p class="c1"><span class="c3"> 11.08.2015 Announcement</span></p><p class="c1"><span class="c3"> 13.08.2015 Added No-Trust Solution using only OP_CLTV</span></p><p class="c1"><span class="c3"> Added </span><span class="c3">Payments in older Channel Versions</span></p><p class="c1 c2"><span class="c12"></span></p><p class="c1"><span>Donations appreciated:</span></p><p class="c1"><span> 13KBW65G6WZxSJZYrbQQRLC6LWE6hJ8mof</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c10 c0">Motivations</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The lightning network allows new features on top of the current bitcoin network. Among those are instant transactions and a better scalability, while reducing the cost for individual transactions. As the network runs into fundamentally based capacity problems, one solution may be to offload uncritical transactions (that is, everyday transactions, especially transactions <10$) to a centralized service, while preserving many of the very important properties of using bitcoin. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The initial proposal of the lightning network required some new features, that required at least a soft fork (most importantly SIGHASH_NOINPUT in P2SH), pushing any real implementation many months or even years into the future. A recent suggestions changed the channel design such that we only need two new OP_CODES, with one in deployment already. While these changes are less controversial, it is still not possible to foresee how long it will take until these changes are fully implemented. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>I therefore changed the channel design of the initial paper such that it can be implemented with the tools currently available in bitcoin. While such a channel does no longer work in a completely trustless manner, it is a good trade-off to start implementing LN. Most importantly, it allows deployment of software using something similar to the future LN implementations for now. Changing all the infrastructure from using the blockchain to LN is the most difficult task and it will take a long time to establish a reliable network. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>With a centralised server-client model, it will be easy to swap out outdated software, as new features in bitcoin will allow for better channeldesign in TN. Any new ruleset can be enforced by the server and implementing the thunder network in a library fashion will make it easy for software developer to adapt to new changes. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>As this is a low-trust and not a no-trust solution, a decentralized network with many different payment hubs is currently not possible. One trade-off would be to have one higher-level payment hub, that act as a central hub, with other hubs as clients. This would, however, not solve any of the issues with just having one payment hub in the first place. Furthermore, all the benefits and drawbacks of having a really large network with over thousand different payment hubs have yet to be determined. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c10 c0">The Channel Design</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The design of the channel is based on the initial proposal of the Lightning Network, that needed SIGHASH_NOINPUT to work properly. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The need for SIGHASH_NOINPUT is for two reasons:</span></p><p class="c1 c2"><span></span></p><ol class="c13 lst-kix_ai7azp5lx6os-0 start" start="1"><li class="c1 c9"><span>The design of transaction ids in bitcoin does allow for mutability. As transactions can be changed with a new signature, the id does change and subsequent transactions can no longer be broadcasted, as the referenced id does not exist. </span></li><li class="c1 c9"><span>Some of the needed transactions (especially the payment settlement tx) can not be built completely during channel creation, due to the very nature of the design. As a preimage is needed to claim an output that is yet unknown, we cannot have transactions building upon this transactions (as we don’t know the txid until we know the preimage)</span></li></ol><p class="c1 c2"><span></span></p><p class="c1"><span>Thunder Network tries to mitigate these two problems, trying to preserve as much of the integrity of the LN design. </span></p><p class="c1 c2"><span></span></p><p class="c1 c20"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 931.00px; height: 884.00px;"><img alt="" src="images/image06.png" style="width: 931.00px; height: 884.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c6"><span class="c0 c27">Updated channel, with v0 revoked. The updated channel includes a payment from a client (A) to the server (B).</span></p><p class="c1 c2"><span></span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 931.00px; height: 834.67px;"><img alt="" src="images/image07.png" style="width: 931.00px; height: 834.67px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c6"><span class="c0 c27">Updated channel, with v0 revoked. The updated channel includes a payment from the server (B) to a client(C).</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>All design decisions were made to have unresolved trust issues due to the lack of SIGHASH_NOINPUT shifted towards the server. As others may have more funds and incentives to shut down such a service, attacks must not result in a loss of server funds. Also, the server has an additional incentive to stay honest, due to the possible loss of reputation that the client does not have to fear, as he is can act anonymously. A breach of contract on the server side will become public across social networks instantly, while a breach of contract from the client will likely have no consequences.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Furthermore, the channel were designed such that the serverside channel is still very close to the initial design, allowing little room for malicious activities. Only the clientside channel has been changed, such that the server cannot enforce it.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Channel Creation</span></p><p class="c1 c2"><span class="c0"></span></p><p class="c1"><span>As funds of both parties get locked up in a multisig manner, it is possible to hold funds of the other party hostage at the expense of your own funds. Therefore refund transactions are created prior of the broadcast of the channel transaction. That party that is broadcasting this very transaction can however resign and therefore change the transaction id, invalidating the refund transactions. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>In thunder network, the server will create an unsigned transaction with inputs from the server, and outputs to the channel and to his change addresses and communicates it with the client. The client can afterwards add his inputs and change outputs, sign his inputs and send it back to the server. The server can sign his inputs and does have the complete transaction. He should not broadcast it though, because the two parties still need to interchange the refund transactions. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Channel creation therefore always happens on the serverside. The server _could_ resign, but has further incentives to stay honest.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Revocable Change</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Both parties have their change encumbered in an revocable output in their respective channels. By exchanging the own private key to a multisig output, we allow the counterparty to steal our funds, as the transaction that we hold is timelocked. The timelock of this ‘revoke transaction’ is always set to the end of the channel. It serves as an descentive to broadcast old channel transactions. Also, resigning and thus invalidating the revoke transaction will only cost the malicious party money, as the change of the other party is not encumbered. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Payment Outputs</span></p><p class="c1 c2"><span class="c0"></span></p><p class="c1"><span>From here on we have to distinguish between the side the channeltransaction resides. As the client cannot be assumed to act honestly, the outputs of his channel has been changed in favor of the server. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Additionally we have to distinguish between payments to the server (Alice to Bob) or payments to the client (Bob to Carol), as the latter bear an increased risk of malicious activities.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Payments from the Client to the Server (Alice to Bob)</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>serverside:</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>…</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>clientside:</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The settlement output is not paying to a multisig between client and server, but only to the preimage and sig server. Without this change, the client could mutate the txid, invalidating the payment, as the settlement transaction on the server is not invalid. The drawback of this change is that the server _could_ claim payments even after the refund period, as it is not timelocked, while the refund transaction is timelocked until the end of the channel. However, the server can only claim the payment, if the receiver disclosed the preimage with him. With knowledge of the preimage, the client Alice has provable paid to Carol, as was his very intention when he made this payment in the first place. The refunds to the client need to be timelocked until the channel ends, as he could claim the refunds from an revoked channel after the refund period.</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Payments from the Server to the Client (Bob to Carol)</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>serverside:</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>…</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>clientside:</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Here we have the biggest change in the design. In case the client does not provide the preimage in time, we want the funds to return back to the server, the classical refund. This is important, as the server cannot claim the associated payment from the initial sender of the payment Alice after a specified refund time. Therefore it is crucial that the receiver cannot claim these funds after the refund time. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>On the contrary we want the receiver to be able to claim the funds, if he does provide the secret preimage. At best, there should be nothing the server can do, to interfere with this.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>On top of that, we also have the malleability problem, as the client can resign, rendering all possible multi-sig outputs invalid.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>These three problems cannot be sufficiently solved with the current set of features in bitcoin, so we need a design with a good trade-off. As the server is assumes to act honestly at all times, the output is freely accessible by the server. This means, the server can claim the payment at all times. As a compromise, the settlement transaction for the client is not timelocked, such that the client can try to outrace the server by broadcasting both transactions with not delay. He can even claim payments from revoked channels. If this will be misused a lot maliciously, we have to adapt and timelock the settlement transaction up to the end of the channel, making it completely revocable, as all other outputs. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The worst the server can do, is to collect the secret preimage from the client, but not update the channel transaction accordingly. He can then collect the payment from the sender and wait till the payment times out on the receiving end, thus keeping the payment. However, it is assumed, that this breach of contract will be made public very soon, and the possible loss of reputation is incentive enough to stay honest. Furthermore, larger payments can always be cut into smaller payments, making this attack less attractive. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Payments in older Channel Versions</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>There is a problem, as settlement transactions are not time-encumbered (we want that whoever deserves the output of a payment to be able to claim it instantly, with no one possibly interfering). This means if one party has a channel transaction with a payments towards it, he can claim this payment </span><span class="c23">under any circumstances</span><span>. However, if this party does broadcast a revoked channel to claim such an output, the counterparty can still steal all settled funds and all funds towards his channel.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>It is therefore important to keep track of the amounts the other party is receiving. We have to know, which is the highest amount the other party ever had as receiving payments in his channel, and we must make sure that we decline any attempts of him spending money, such that his balance would drop below this amount. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>This will be more clear using this example:</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>We start with a channel, with Alice and Bob, and both fund the mutual channel with 10 BTC. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>So at t=0 we are at</span></p><p class="c1"><span> Alice - 10 BTC</span></p><p class="c1"><span> Bob - 10 BTC</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Now imagine that for some reason, Alice received payments, such that she has 5 BTC as uncleared payments in her channel. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>t=t1</span></p><p class="c1"><span> Alice - 10 BTC ( +5 BTC uncleared )</span></p><p class="c1"><span> Bob - 5 BTC</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>She reveals the secrets and Alice and Bob settle those payments, leading to </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>t=t2</span></p><p class="c1"><span> Alice - 15 BTC</span></p><p class="c1"><span> Bob - 5 BTC</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Now if Alice were to be free to spend all her money, if we don’t enforce the above rules, she could spend all her money (leading to legitimate payment contracts in other channels that we are obliged to).</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>t=t3</span></p><p class="c1"><span> Alice - 0 BTC</span></p><p class="c1"><span> Bob - 20 BTC</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>But, as reasoned above, payments towards Alice can </span><span class="c23">always </span><span>be claimed by Alice, such that she can claim the 5 BTC from the t=t1 channel transaction and Bob losing those 5 BTC. The t=t1 transaction does spend 5 BTC directly towards Bob, and he can also claim the 10 BTC settled balance from Alice, but his net balance compared to the t=t3 is -5 BTC. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>To defend against this kind of attack, it is important to keep track of the maximum the other party has as receiving uncleared payments in his channel. In this case, the maximum Alice has as uncleared receiving payments is at t=t1, 5 BTC. This means, we have to make sure her balance does not drop below 5 BTC anymore. As agreeing on a channel with a payment is a mutual action, Bob can just refuse to accept a new channel transaction, where the balance of Alice would drop below 5 BTC. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>This rule also serves as an incentive to clear out receiving payments as soon as possible. The party who has sent a payment (Carol in this example) can only remove settle the payment after the receiving party has cleared the payment, and we don’t want the channel to clog.</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Actual Timeframes in TN</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>I made some guesses about the timeframes that are acceptable. These are likely to change in the future, as actual users can give feedback. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Total Duration of Payment: </span></p><p class="c1"><span> 7 days ( 604800 seconds )</span></p><p class="c1"><span>This is the total duration for one payment. If the client updates his channel after this time, the payment will get refunded and added to his balance again.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Time to Add Receiving Payment</span></p><p class="c1"><span> 3 days ( 259200 seconds )</span></p><p class="c1"><span> If the receiver does not update his channel to include a payment within this time after the sender issued the payment, it will get refunded.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Time to Reveal Preimage </span></p><p class="c1"><span> 3 days ( 259200 seconds )</span></p><p class="c1"><span> If the receiver does not reveal the preimage to a payment after this time, the server will </span></p><p class="c1"><span> broadcast the complete channel. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>These timeframes have the following implications:</span></p><ol class="c13 lst-kix_3lz9mskx7fae-0 start" start="1"><li class="c1 c9"><span>If you expect a payment, you should update your channel / check for payments at least every third day, as you may miss payments otherwise</span></li><li class="c1 c9"><span>If you added a receiving payment to your channel, you should reveal the secret as soon as possible, as you may miss the 3 days timeframe, and the server may broadcast the channel, resulting in a lot of fees.</span></li><li class="c1 c9"><span>The last 7 days of a channel, it will get locked internally, disabling all payments to and from the channel. By this we achieve, that at the end of the channel, all payments will be either refunded or complete. Increasing any of the above timeframes will also increase this ‘dead time’.</span></li></ol><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c10 c0">Addresses</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Solution 1: Include all necessary information of the payment into the address</span></p><p class="c1"><span>It is favorable to have addresses that are at least similar to the current system of addresses. For a payment in the TN, we need at least the following information:</span></p><p class="c1 c2"><span></span></p><ol class="c13 lst-kix_ge8owqwuqa6k-0 start" start="1"><li class="c1 c9"><span>an identifier of the receiver. This can be a given usertag, a pubkeyhash, or a random id. It is needed for the server, to know which client can produce the preimage needed to claim the payment</span></li><li class="c1 c9"><span>the hashed preimage. This needs to be supplied by the supposed receiver, and submitted by the sender. A preimage may never be used twice, as the server can steal funds of any additional payments with the same preimage, as soon as the receiver revealed it once. </span></li><li class="c1 c9"><span>the TN payment hub of the receiver. </span></li></ol><p class="c1 c2"><span></span></p><p class="c1"><span>(1) and (2) can be added together, with a prefix and checksum into an address very similar to bitcoin addresses. (3) can be implemented into a suffix, similar to email addresses. This also serves as an easy way to reach out to the other payment hub without an additional central address register. Furthermore, (3) can be omitted for payments within one payment hub.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>[email protected]</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>X - 1 byte to declare which kind of identifier we use (see (1) above)</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>A - 8 byte to clearly specify a receiver</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>H - 20 byte, the hashed preimage needed for the payment</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>C - 4 byte to serve as a checksum against typing errors</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>D.TLD - domain, under which the TN server of the receiver can be reached</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Example:</span><span> [email protected]</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>This will lead to a total address length of 33 bytes + domain. We will base58 encode the 33 bytes to have an address that is easy to copy-paste and possible to transcribe manually. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>It is therefore still possible (and advisable) to have payment requests similar to those used in bitcoin today encoded in small QR codes.</span></p><p class="c1 c2"><span></span></p><p class="c1 c17"><span class="c7">To further move to having a similar use-flow as we have in Blockchain transactions, it would be great to have reusable addresses.</span></p><p class="c1 c17"><span class="c7">To make a payment to someone over thunder, we use a hash, such that the payment can only be settled, if the receiver reveals the preimage of the hash. This ensures that the payment hub is not able to steal the funds, which is is fundamentally important to have a no-trust solution. This also means, if we send a payment to an address that has been used and settled already, the payment hub knows the preimage already, and he can claim the payment for himself, without asking the receiver for the preimage.</span></p><p class="c1 c17 c2"><span class="c8"></span></p><p class="c1 c17"><span class="c7">However, if we find a function f, pub and priv, such that</span></p><p class="c1 c17"><span class="c7">f( pub(seed), t, r) = RIPEMD160( SHA256( f( priv(seed), t, r) ) )</span></p><p class="c1 c17"><span class="c7">with </span></p><p class="c1 c17"><span class="c7">t - timestamp</span></p><p class="c1 c17"><span class="c7">r - random number (1-10000)</span></p><p class="c1 c17"><span class="c7">we can replace the hash in the address with pub(seed), and the client can interpret the address, such that he will use f(pub(seed), t, r) to calculate a hash to encumber the payment. The timestamp and the random number will serve as a nonce, and a random number between 1 and 10000 will sufficiently reduce the probability of a collision, while preserving the ability to brute force the preimage for the receiver.</span></p><p class="c1 c17"><span class="c7">The problem with this is of course finding those functions. Especially since a hash function is designed with the explicit goal to make it infeasibly difficult to find a correlation between input and output.</span></p><p class="c1 c17"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 582.00px; height: 232.00px;"><img alt="" src="images/image05.png" style="width: 582.00px; height: 232.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c17"><span class="c7">Using pub/priv key pairs instead of hash/preimage pairs would be possible, but it would not solve this issue. With BIP32 we have to decide between</span></p><p class="c1 c17"><span class="c7">(1) using normal derivation. However, exposing one private key together with the seed will expose the whole chain. ( </span><span class="c8"><a class="c15" href="https://www.google.com/url?q=https%3A%2F%2Fbitcointalk.org%2Findex.php%3Ftopic%3D679487.0&sa=D&sntz=1&usg=AFQjCNHpWFUxniGT-E-8Uh1385U2UvLkUQ">https://bitcointalk.org/index.php?topic=679487.0</a></span><span class="c7"> )</span></p><p class="c1 c17"><span class="c7">or</span></p><p class="c1 c17"><span class="c7">(2) using hardened key. This will remove the problem in (1), but it is impossible to derive any children with only the public seed, such that it is no use for our purposes.</span></p><p class="c1 c31"><span class="c7">In the end, there is always the possibility to use some intermediary. Some service that is producing hashes randomly and only reveals the secret to the receiver with some user system. However, the payment hub could engage with that service and defraud all users of their open payments. Maybe it is possible to have the preimages encumbered in such a way that a password is needed to decrypt them, but the service can still refuse to reveal the secrets (hostage) or vanish completely (for whatever reasons).</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Solution 2: Include Contact Information Necessary to Obtain Payment Instructions</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Another possibility requires the receiver to be online whenever he wants others to send him money. We can include information, such that the sender can (directly) connect to the receiver. They can then exchange all instructions necessary for the payment, like the hash, and maybe a route. Additionally, the receiver can also sign and commit a contract, attesting the sender that he made the payment if he can provide the preimage to the hash.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>There are some difficulties to overcome, especially since the receiver might</span></p><ol class="c13 lst-kix_bnzmaog1cg3g-0 start" start="1"><li class="c22"><span>not be online when others wish to make a payment.</span></li><li class="c22"><span>not want to be reached out to directly. (requires further layers for anonymity)</span></li><li class="c22"><span>is not accepting incoming connections, due to NAT or a firewall.</span></li></ol><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Ideally, we would include different instructions on the preference of the receiver, with fallback methods in case they don’t work out. Using solution 1 and just include the hash directly in the address can work for many use-cases, where we don’t even want to receive multiple payments. (Like for many eCommerce systems). </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The downside of this flexibility is that what we refer to as addresses currently, will turn out to be large blobs of data. Transcribing them manually will be very inconvenient and payments will mostly be made over URI requests lightning:... or QR codes. Both techniques will not help in cases where you want to make a payment from a device with no camera (as a PC) to a mobile device like a smart phone. In these cases, shortening services might resolve this issue.</span></p><p class="c1 c2"><span class="c10 c0"></span></p><p class="c1 c2"><span class="c10 c0"></span></p><p class="c1 c2"><span class="c10 c0"></span></p><p class="c1"><span class="c10 c0">Fees</span></p><p class="c1 c2"><span class="c0"></span></p><p class="c1"><span class="c0">Server Fees</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>A general discussion about the possibilities of fees was outlined in the initial paper of LN. We will have a more specific discussion about the fees in a proper implementation of a TL payment hub here.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>There are two different kind of fees that we have to consider</span></p><p class="c1 c2"><span></span></p><ol class="c13 lst-kix_yxd24y93fq5q-0 start" start="1"><li class="c1 c9"><span>fees, due to the maintenance of a server that is able to handle all the requests properly,</span></li><li class="c1 c9"><span>fees, due to the funds we need locked up, such that other parties can exchange value.</span></li></ol><p class="c1 c2"><span></span></p><p class="c1"><span>(1) is very straightforward. We have real-world costs running a service that need to be addressed. As costs has to be paid in fiat, this fee has to be thought of as fiat aswell. It should be a flat fee, as the monthly costs are only dependent on the amount of payments, and not on the funds exchanged. For the current exchange rate of around $300, 20 satoshis per payment can be enough to cover these costs.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>(2) is a much more abstract kind of fee. It is needed, especially in the beginning of a new TN payment hub, to build up enough funds. It has yet to be determined which fee is sufficient here, and it is mainly dependent on the movement of funds, how often money is changing hands. We can calculate the total funds necessary by</span></p><p class="c1 c2"><span></span></p><p class="c1"><span> FUNDS = MONTHLY EXCHANGED BITCOINS / TURNOVER OF EACH BITCOIN</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>It makes sense, to have a percentage fee here, as higher payments need more funds. Also it is possible to omit these fees, as soon as enough funds has been collected. It is then enough, to only have (1) fees, enabling very cheap transactions.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>For now, we will start with one percent of the payment as (2). It will make TN payments cost efficient over blockchain for payments up to $5, while having instant payments. These costs will be deducted from the amount of the receiver, such that refunds will not cost any money. In case someone attempts a DDOS attack by issuing lots of payments, we may change this policy, to charge (1) off of the sender.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>As soon as the TN payment hub does have enough funds ready, (2) will probably get lowered to 0.1 percent or lower to fund further development. A fee market can arise from there on as well, with different payment hubs. In this case, a cap will be probable as well, to stay competetive even for larger payments.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>This fee structure does allow for micropayments much more efficient than any other payment processor currently. The minimum payment amount of 1000 satoshis is currently worth $0.003 and can be collected paying 3 percent in fees.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Blockchain Fees</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>As the TN payment hub does not collect much fees and also bears the risk of losing his funds to malicious actors, paying the fees necessary to open and close a channel is not sustainable. Therefore all transaction fees are paid by the clients.</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c10 c0">Risks</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Some of the risks outlined in the initial LN paper can be mitigated using different techniques.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Hot Wallets</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>As usual webservers are not considered safe, we generally do not want the webserver to hold any private keys. More precisely, we do not want a webserver to hold information which allows for unauthorized payments. For a future implementation of TN, it will be possible to mark a channel as ‘receiving-only’. This action cannot be undone, and the flag will remain up until the end of the channel. When the flag is set, the TN payment hub will reject any payment request from this channel. While it is still possible for a hacker to create a valid payment request, sign it and send it to the payment hub, without the payment hub acknowledging and processing the payment, he is not able to receive any of the money in the channel. Furthermore, the webserver is still able to accept payments, and the final output address for the channel can be set to a safe offline wallet as well. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Data Loss</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Part of the TN protocol is a way to restore the last agreed on channel. The server will send the last version of the channel transaction that was signed by the client and also issue a new version for the client. While there is a trust problem, the client can do this for zero cost once a week or even more often to test the honesty of the server. As the server does not know if the request is a test or not, he does have incentive to act honestly. Furthermore, both parties can decrease the master key depth by one, revoking all old channels.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Malicious Server</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>In case the server is compromised, for whatever reasons, these are the risks associated with the users:</span></p><p class="c1 c2"><span></span></p><ol class="c13 lst-kix_fbh8c7lw08re-0 start" start="1"><li class="c1 c9"><span>The server can resign the opening transaction, locking in funds of both parties. He can then try to demand some of the funds of the client, the classic hostage situations. However, unless all clients give in to these demands, the server will likely still lose money overall, since for each uncooperative client, he does lose all the funds associated in that channel.</span></li><li class="c1 c9"><span>The server can block all requests to/from a client, rendering the channel useless. Both parties will not have access to their funds, until the agreed date, at which the refund transactions will become spendable. </span></li><li class="c1 c9"><span>The server can resign a channel transactions, rendering all depending multisignature-outputs invalid. This includes the unspent funds of the server. As payments in the serverside channel transactions are also encumbered in multisig-outputs, these will be locked up, resulting in a hostage situation again.</span></li><li class="c1 c9"><span>The server can wait for a broadcasted channel transaction from a client, resign, and broadcast it again, trying to reach more nodes. This attack can be difficult to perform, as the client can choose to which nodes he will broadcast his transaction. Furthermore, channel transactions will very rarely be broadcasted at all. This will result in a complete lock up of all funds belonging to the client, while the server can still access his funds. This attack can also be done other way round, such that it is important for the server to be very well connected.</span></li><li class="c1 c9"><span>The server can claim payments to a client, using the unencumbered output to his key, racing against the client. </span></li></ol><p class="c1 c2"><span></span></p><p class="c1"><span>(1) to (4) can mostly be considered as vandalism. The server is not directly benefitting, but rather hopes the client gives in in a hostage situation. Only (5) directly earns the server money. Also note, that all these attacks can not only be identified as such, but the client can cryptographically proof the breach of contract. If the server does broadcast a revoked channel transaction, the client can proof he does own both private keys of the encumbered outputs. As all messages from and to the server are signed, (2) can be proved accordingly. (1), (3) and (4) can be proved, by comparing the transaction in the blockchain with the (server signed) refund / settlement transactions. Finally, if you can find a transaction that is trying to claim outputs of a payment before the agreed refund time, you have proven that the server tried to engage in (5).</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>It serves as an additional descentive, as any malicious action from the server can be instantly proven, and other clients can close their channels accordingly.</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Outlook</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>With OP_CLTV merged already, we can further solve some of the problems inherent in TN. Furthermore, also OP_CSV will probably get merged, such that both OP codes might be useable within the next 24 months. In line with the original proposal, it is also possible to include SIGHASH_NOINPUT. Either way, with one of these two, it is possible to establish complete trustless intermediate hubs for instant payments, using either the original design or the design proposed by Rusty Russel.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">OP_CLTV</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>With OP_CLTV, it is possible to change the opening transactions, such that it will contain two outputs. Both outputs will pay to their respective owners after the agreed refund time. This means, that there will be no specific refund transactions, removing all risks associated with the channel opening. All channel transactions will need to include both inputs, with both parties signing both inputs.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Furthermore, the output for a payment towards a client in a clientside channel can have the refund time included, such that the server can no longer race against the client in claiming these outputs. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0 c10">No-Trust Solution using only OP_CLTV</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>It is furthermore possible, to create a channel design using just OP_CLTV as a new feature that is completely trustless, although it does still suffer from some of the problems in the current thunder-design. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c6"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 502.00px; height: 672.00px;"><img alt="" src="images/image11.png" style="width: 502.00px; height: 672.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>With OP_CLTV it is possible to replace the </span><span class="c23">payout-to-multisig-and-give-timelocked-partly-signed-transaction </span><span>with a simple OP-code, specifying for how long the output should not be spent. With this it is able to completely mitigate all the malleability problems we have in our current solution. Let’s take a look into some of the changes made and their implications.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0 c11">Opening Transaction</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>There are no longer refund transactions that needs to get interchanged. It is possible to directly make the refund to both parties part of the opening transaction. This completely removes any risk problems and allows for large amount of funds within the channel. As soon as the refund time has come, both parties can get their respective funds back with just their sole private key. As we cannot accomplish the exact distribution with just one output and CLTV, we use two outputs that only differ in the refund private key. By doing so, any channel transaction has to include both these outputs (and of course both has to be signed accordingly), leading to larger transactions.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0 c11">Channel Transaction</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Settled Funds</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>We use the same mechanism as in the opening transaction here, and added a multi-sig output to ensure that these funds are revocable. If both parties agree on a new version of the channel, they release their temporary signatures A2 and B2. If a party broadcasts a channel that was marked as revoked, the other party can steal those funds. Furthermore, malleability is no longer an issue, as refunds are only timelocked using CLTV, and in case of a revoke, the other party has both private keys. In any case, we are no longer depending on having a specific transaction presigned by the other party.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Sending HTLC</span></p><p class="c1 c2"><span class="c0"></span></p><p class="c1"><span>Making a payment now consists of 3 outputs. We combine the mechanism for refunds and for revocable transactions (see above) with the ability of the receiver to claim the payments in case he knows the secret R. We lowered the refund time to the general timeframe of a payment, such that it is enforceable by the sender. Again, as we don’t depend on presigned transactions, malleability is no longer an issue.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Receiving HTLC</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The outputs of a receiving HTLC are very similar to those of a sending one, but with the private keys set accordingly. Also the timeframe is down to 6 days, such that we have plenty of time to determine if a payment will get refunded or not.</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Now there are a couple of problems with this design, mainly that HTLCs are not strictly revocable. If one party broadcasts a revoked transactions with HTLCs inside, the other party can just try to race against the propagation of the claiming transactions, which will often be fruitless. This goes for receiving payments, where the party can claim the funds with the secret R and also for sending payments, where he can use the refund option (for revoked channels which are older than the refund timeout). We could set the timeout of the refund up to the total channel, but this would have many further implications.</span></p><p class="c1"><span>Having sent a payment, you can no longer enforce a refund. As payments may either refund or not, it is difficult to pass the payment on to another party. This is especially true if the sending channel ends before the receiving channel. In ThunderNetwork we like to have all payments in a defined status - either refunded or settled - at the end of the channel. Therefore we enforce a locking period at the end of each channel, where making a payment (and having others making payments toward that channel) is not possible anymore. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Additionally, this new channel design means that a channel will get closed and broadcasted completely, as soon as the refund condition for any payment in your channel is met. To counter this as a receiver of a payment, you have to reveal the secret or settle a new channel without the payment (manual refund) in time with the other party. As a sender, you have to check back the payment before the refund, to work out with the other party if the payment should refund or settle. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Those timeframes are just for illustration, it might be preferable to play along with those numbers a bit. For example, the one day difference between the sender and the receiver means that in extreme cases the sender only has one day for updating his channel. Furthermore, there isn’t really a reason the receiver has 6 days time to reveal his secret, where 6 hours would be plenty of time as well. Finally, we can also extend the period for a payment, resulting in a longer lock-up time frame at the end of the channel. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>With channels being strictly no-trust, we can move towards larger amounts of funds inside the channels, mitigating the problem with non-revocable HTLCs and the workaround. It just becomes one additional rule we have to apply among all the others that are apparent already.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Implementing these changes in the current Thunder implementations is trivial. It comes down to deleting a lot of methods currently necessary and switching to the new scripts. This goes for most channel design changes, as the design of Rusty for example.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">EDIT</span><span>: With the publication of the OP_CSV BIP I recognized that there are discussions about combining CLTV and CSV into one softfork that I wasn’t aware of. With this in mind, it is of course no longer practical to implement a solution just using half the potential, when you can just as well go the full way.</span></p><p class="c1 c2"><span></span></p><p class="c1 c6"><span class="c0 c18">Implementation Details</span></p><p class="c1 c2 c14"><span class="c18 c0"></span></p><p class="c1 c14"><span class="c10 c0">Project Structure</span></p><p class="c1 c2 c14"><span class="c10 c0"></span></p><p class="c1 c14"><span>Currently there are 3 projects inside the main folder. </span></p><ol class="c13 lst-kix_jv6tbfowz1em-0 start" start="1"><li class="c1 c9 c14"><span>The server</span></li><li class="c1 c9 c14"><span>The client, that will build into a back-end-library</span></li><li class="c1 c9 c14"><span>A Prototype of a GUI-Wallet, building on top of (2)</span></li></ol><p class="c1 c2 c14"><span class="c10 c0"></span></p><p class="c1 c14"><span class="c10 c0">Communication</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>All requests to the server are directed towards the API URL thunder.network/api. Furthermore, JSON is used for requests, with fields such that</span></p><p class="c1 c2"><span></span></p><ul class="c13 lst-kix_wrb45agb25k0-0 start"><li class="c1 c9"><span>int TYPE Type of the request</span></li><li class="c1 c9"><span>String PUBKEY Base64 representation of the parties pubkey</span></li><li class="c1 c9"><span>String DATA Object, including the data for the request</span></li><li class="c1 c9"><span>int TIMESTAMP Current timestamp, to prevent replay attacks</span></li><li class="c1 c9"><span>String SIGNATURE Base64 representation of the signature for the request</span></li></ul><p class="c1 c2"><span></span></p><p class="c1"><span>Depending on the type of request, different fields have to be present in the DATA-object. In case of any failure, TYPE will be -1 and the DATA field will contain detailed information about the error.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Currently, there are 5 major request types.</span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Establishing the Channel</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>The channel will be established in 3 phases. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 472.00px; height: 644.00px;"><img alt="" src="images/image03.png" style="width: 472.00px; height: 644.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Making a Payment</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Requesting a payment consists of 5 phases. While only 4 phases a technically necessary, the fifth request will ensure data consistency.</span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 515.00px; height: 1146.00px;"><img alt="" src="images/image04.png" style="width: 515.00px; height: 1146.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1"><span class="c0">Updating the Channel</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Updating the channel consists of 4 phases. With the update, both parties reveal secrets of payments currently included in the channel, such that those will be removed, with the balance added properly.</span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 515.00px; height: 902.00px;"><img alt="" src="images/image02.png" style="width: 515.00px; height: 902.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1"><span class="c0">Closing the Channel</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Requesting the closure of a channel only consists of one phase. </span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 509.00px; height: 340.00px;"><img alt="" src="images/image10.png" style="width: 509.00px; height: 340.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Restoring the Channel for the Client</span></p><p class="c1 c2"><span></span></p><p class="c1"><span>[TBD]</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1"><span class="c0">Routing</span></p><p class="c1 c2"><span class="c0"></span></p><p class="c1 c2"><span class="c0"></span></p><p class="c1"><span>The basic problem with routing payments is to have - at best - a solution that is preventing analysis in any form, but also scales well to billions of transactions a day. It would be best if we can issue a payment to some kind of ‘address’, but have no further information about the receiver. Additionally, the receiver should further not have any information about the issuer of the payment. These requirements should not depend on good-will, but should be a requirement of the system. That is, it should fundamentally be impossible to derive these information for anyone. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>Currently we differentiate between 'Users' and 'Hubs', such that a user will always have a connection open to a hub to receive payments.</span></p><p class="c2 c30"><span></span></p><p class="c1"><span>However, if we treat both the same - address wise - any prior nodes in the chain of a payment can't determine, whether a node has accepted the payment for himself or for another node further down the chain. Using such a technique, it is basically possible to tell in which direction how much money is flowing, but it is impossible to determine the start- and endpoint of each payment. A node can has no knowledge, whether the other party is acting on behalf of some other node or just for himself. </span></p><p class="c1 c2"><span></span></p><p class="c1"><span>We need some way to ensure the payment will reach the receiving node though, without disclosing any information about him. The routing model of the TOR project might come in handy here, as they solve exactly this problem. The trade-off for this is a massively increased latency, as payments requests will (necessarily) be larger and efficient routing will most likely be more difficult to do.</span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p><p class="c1 c2"><span></span></p></body></html>