addressable 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +4 -0
- data/README +21 -0
- data/coverage/index.html +48 -5
- data/coverage/lib-addressable-uri_rb.html +1154 -1071
- data/coverage/lib-addressable-version_rb.html +663 -0
- data/doc/classes/Addressable/URI.html +1246 -1142
- data/doc/classes/Addressable/URI/IDNA.html +34 -34
- data/doc/created.rid +1 -1
- data/doc/files/CHANGELOG.html +7 -2
- data/doc/files/LICENSE.html +1 -1
- data/doc/files/README.html +24 -1
- data/doc/files/lib/addressable/uri_rb.html +2 -1
- data/doc/files/lib/addressable/version_rb.html +1 -1
- data/doc/fr_method_index.html +53 -52
- data/lib/addressable/uri.rb +84 -1
- data/lib/addressable/version.rb +1 -1
- data/spec/addressable/uri_spec.rb +67 -0
- data/specdoc/index.html +348 -325
- metadata +2 -1
    
        data/CHANGELOG
    CHANGED
    
    
    
        data/README
    CHANGED
    
    | @@ -1,3 +1,24 @@ | |
| 1 1 | 
             
            Addressable is a replacement for the URI implementation that is part of
         | 
| 2 2 | 
             
            Ruby's standard library. It more closely conforms to the relevant RFCs and
         | 
| 3 3 | 
             
            adds support for IRIs and URI templates.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Example usage:
         | 
| 6 | 
            +
             
         | 
| 7 | 
            +
             require 'addressable/uri'
         | 
| 8 | 
            +
             
         | 
| 9 | 
            +
             uri = Addressable::URI.parse("http://example.com/path/to/resource/")
         | 
| 10 | 
            +
             uri.scheme
         | 
| 11 | 
            +
             => "http"
         | 
| 12 | 
            +
             uri.host
         | 
| 13 | 
            +
             => "example.com"
         | 
| 14 | 
            +
             uri.path
         | 
| 15 | 
            +
             => "/path/to/resource/"
         | 
| 16 | 
            +
             
         | 
| 17 | 
            +
             Addressable::URI.expand_template("http://example.com/{query}/", {
         | 
| 18 | 
            +
               "query" => "an+example+query"
         | 
| 19 | 
            +
             })
         | 
| 20 | 
            +
             => #<Addressable::URI:0x123456 URI:http://example.com/an+example+query/>
         | 
| 21 | 
            +
             
         | 
| 22 | 
            +
             uri = Addressable::URI.parse("http://www.詹姆斯.com/")
         | 
| 23 | 
            +
             uri.normalize
         | 
| 24 | 
            +
             => #<Addressable::URI:0x654321 URI:http://www.xn--8ws00zhy3a.com/>
         | 
    
        data/coverage/index.html
    CHANGED
    
    | @@ -151,7 +151,7 @@ table.report tr.dark { | |
| 151 151 | 
             
                  </head>
         | 
| 152 152 | 
             
                  <body>
         | 
| 153 153 | 
             
                    <h3>C0 code coverage information</h3>
         | 
| 154 | 
            -
                    <p>Generated on Wed Sep 05  | 
| 154 | 
            +
                    <p>Generated on Wed Sep 05 16:05:30 -0400 2007 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.8.0</a>
         | 
| 155 155 | 
             
                    </p>
         | 
| 156 156 | 
             
                    <hr />    <table class='report'>
         | 
| 157 157 | 
             
                  <thead>
         | 
| @@ -167,10 +167,10 @@ table.report tr.dark { | |
| 167 167 | 
             
                    <tr class='light'>
         | 
| 168 168 | 
             
                      <td>TOTAL</td>
         | 
| 169 169 | 
             
                      <td class='lines_total'>
         | 
| 170 | 
            -
                        <tt> | 
| 170 | 
            +
                        <tt>1207</tt>
         | 
| 171 171 | 
             
                      </td>
         | 
| 172 172 | 
             
                      <td class='lines_code'>
         | 
| 173 | 
            -
                        <tt> | 
| 173 | 
            +
                        <tt>852</tt>
         | 
| 174 174 | 
             
                      </td>
         | 
| 175 175 | 
             
                      <td>
         | 
| 176 176 | 
             
                        <table cellspacing='0' cellpadding='0' align='right'>
         | 
| @@ -210,10 +210,53 @@ table.report tr.dark { | |
| 210 210 | 
             
                        <a href='lib-addressable-uri_rb.html'>lib/addressable/uri.rb</a>
         | 
| 211 211 | 
             
                      </td>
         | 
| 212 212 | 
             
                      <td class='lines_total'>
         | 
| 213 | 
            -
                        <tt> | 
| 213 | 
            +
                        <tt>1175</tt>
         | 
| 214 214 | 
             
                      </td>
         | 
| 215 215 | 
             
                      <td class='lines_code'>
         | 
| 216 | 
            -
                        <tt> | 
| 216 | 
            +
                        <tt>844</tt>
         | 
| 217 | 
            +
                      </td>
         | 
| 218 | 
            +
                      <td>
         | 
| 219 | 
            +
                        <table cellspacing='0' cellpadding='0' align='right'>
         | 
| 220 | 
            +
                          <tr>
         | 
| 221 | 
            +
                            <td>
         | 
| 222 | 
            +
                              <tt class='coverage_total'>100.0%</tt> </td>
         | 
| 223 | 
            +
                            <td>
         | 
| 224 | 
            +
                              <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
         | 
| 225 | 
            +
                                <tr>
         | 
| 226 | 
            +
                                  <td class='covered' width='100' />
         | 
| 227 | 
            +
                                  <td class='uncovered' width='0' />
         | 
| 228 | 
            +
                                </tr>
         | 
| 229 | 
            +
                              </table>
         | 
| 230 | 
            +
                            </td>
         | 
| 231 | 
            +
                          </tr>
         | 
| 232 | 
            +
                        </table>
         | 
| 233 | 
            +
                      </td>
         | 
| 234 | 
            +
                      <td>
         | 
| 235 | 
            +
                        <table cellspacing='0' cellpadding='0' align='right'>
         | 
| 236 | 
            +
                          <tr>
         | 
| 237 | 
            +
                            <td>
         | 
| 238 | 
            +
                              <tt class='coverage_code'>100.0%</tt> </td>
         | 
| 239 | 
            +
                            <td>
         | 
| 240 | 
            +
                              <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
         | 
| 241 | 
            +
                                <tr>
         | 
| 242 | 
            +
                                  <td class='covered' width='100' />
         | 
| 243 | 
            +
                                  <td class='uncovered' width='0' />
         | 
| 244 | 
            +
                                </tr>
         | 
| 245 | 
            +
                              </table>
         | 
| 246 | 
            +
                            </td>
         | 
| 247 | 
            +
                          </tr>
         | 
| 248 | 
            +
                        </table>
         | 
| 249 | 
            +
                      </td>
         | 
| 250 | 
            +
                    </tr>
         | 
| 251 | 
            +
                    <tr class='light'>
         | 
| 252 | 
            +
                      <td>
         | 
| 253 | 
            +
                        <a href='lib-addressable-version_rb.html'>lib/addressable/version.rb</a>
         | 
| 254 | 
            +
                      </td>
         | 
| 255 | 
            +
                      <td class='lines_total'>
         | 
| 256 | 
            +
                        <tt>32</tt>
         | 
| 257 | 
            +
                      </td>
         | 
| 258 | 
            +
                      <td class='lines_code'>
         | 
| 259 | 
            +
                        <tt>8</tt>
         | 
| 217 260 | 
             
                      </td>
         | 
| 218 261 | 
             
                      <td>
         | 
| 219 262 | 
             
                        <table cellspacing='0' cellpadding='0' align='right'>
         | 
| @@ -556,7 +556,7 @@ span.run100 { | |
| 556 556 | 
             
                  </head>
         | 
| 557 557 | 
             
                  <body>
         | 
| 558 558 | 
             
                    <h3>C0 code coverage information</h3>
         | 
| 559 | 
            -
                    <p>Generated on Wed Sep 05  | 
| 559 | 
            +
                    <p>Generated on Wed Sep 05 16:05:34 -0400 2007 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.8.0</a>
         | 
| 560 560 | 
             
                    </p>
         | 
| 561 561 | 
             
                    <hr /><pre><span class='marked0'>Code reported as executed by Ruby looks like this...
         | 
| 562 562 | 
             
            </span><span class='marked1'>and this: this line is also marked as covered.
         | 
| @@ -580,10 +580,10 @@ span.run100 { | |
| 580 580 | 
             
                        <a href='lib-addressable-uri_rb.html'>lib/addressable/uri.rb</a>
         | 
| 581 581 | 
             
                      </td>
         | 
| 582 582 | 
             
                      <td class='lines_total'>
         | 
| 583 | 
            -
                        <tt> | 
| 583 | 
            +
                        <tt>1175</tt>
         | 
| 584 584 | 
             
                      </td>
         | 
| 585 585 | 
             
                      <td class='lines_code'>
         | 
| 586 | 
            -
                        <tt> | 
| 586 | 
            +
                        <tt>844</tt>
         | 
| 587 587 | 
             
                      </td>
         | 
| 588 588 | 
             
                      <td>
         | 
| 589 589 | 
             
                        <table cellspacing='0' cellpadding='0' align='right'>
         | 
| @@ -642,1075 +642,1158 @@ span.run100 { | |
| 642 642 | 
             
            </span><span class="inferred1"><a name="line21" />  21 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
| 643 643 | 
             
            </span><span class="inferred0"><a name="line22" />  22 #++
         | 
| 644 644 | 
             
            </span><span class="inferred1"><a name="line23" />  23 
         | 
| 645 | 
            -
            </span><span class="marked0"><a name="line24" />  24  | 
| 646 | 
            -
            </span><span class=" | 
| 647 | 
            -
            </span><span class=" | 
| 648 | 
            -
            </span><span class=" | 
| 649 | 
            -
            </span><span class=" | 
| 650 | 
            -
            </span><span class=" | 
| 651 | 
            -
            </span><span class="inferred0"><a name="line30" />  30 | 
| 652 | 
            -
            </span><span class=" | 
| 653 | 
            -
            </span><span class=" | 
| 654 | 
            -
            </span><span class=" | 
| 655 | 
            -
            </span><span class="inferred0"><a name="line34" />  34     
         | 
| 656 | 
            -
            </span><span class="inferred1"><a name="line35" />  35      | 
| 657 | 
            -
            </span><span class=" | 
| 658 | 
            -
            </span><span class=" | 
| 659 | 
            -
            </span><span class="inferred0"><a name="line38" />  38 | 
| 660 | 
            -
            </span><span class=" | 
| 661 | 
            -
            </span><span class=" | 
| 662 | 
            -
            </span><span class="marked1"><a name="line41" />  41 | 
| 663 | 
            -
            </span><span class=" | 
| 664 | 
            -
            </span><span class=" | 
| 665 | 
            -
            </span><span class="marked0"><a name="line44" />  44 | 
| 666 | 
            -
            </span><span class="marked1"><a name="line45" />  45        | 
| 667 | 
            -
            </span><span class="marked0"><a name="line46" />  46        | 
| 668 | 
            -
            </span><span class="marked1"><a name="line47" />  47        | 
| 669 | 
            -
            </span><span class="marked0"><a name="line48" />  48        | 
| 670 | 
            -
            </span><span class="marked1"><a name="line49" />  49        | 
| 671 | 
            -
            </span><span class="marked0"><a name="line50" />  50        | 
| 672 | 
            -
            </span><span class="marked1"><a name="line51" />  51        | 
| 673 | 
            -
            </span><span class=" | 
| 674 | 
            -
            </span><span class=" | 
| 675 | 
            -
            </span><span class=" | 
| 676 | 
            -
            </span><span class="marked1"><a name="line55" />  55 | 
| 677 | 
            -
            </span><span class="marked0"><a name="line56" />  56        | 
| 678 | 
            -
            </span><span class="inferred1"><a name="line57" />  57 | 
| 679 | 
            -
            </span><span class="inferred0"><a name="line58" />  58 | 
| 680 | 
            -
            </span><span class=" | 
| 681 | 
            -
            </span><span class=" | 
| 682 | 
            -
            </span><span class=" | 
| 683 | 
            -
            </span><span class="inferred0"><a name="line62" />  62        | 
| 684 | 
            -
            </span><span class=" | 
| 685 | 
            -
            </span><span class=" | 
| 686 | 
            -
            </span><span class="inferred1"><a name="line65" />  65        | 
| 687 | 
            -
            </span><span class="inferred0"><a name="line66" />  66       
         | 
| 688 | 
            -
            </span><span class=" | 
| 689 | 
            -
            </span><span class=" | 
| 690 | 
            -
            </span><span class=" | 
| 691 | 
            -
            </span><span class=" | 
| 692 | 
            -
            </span><span class=" | 
| 693 | 
            -
            </span><span class="marked0"><a name="line72" />  72        | 
| 694 | 
            -
            </span><span class=" | 
| 695 | 
            -
            </span><span class="marked0"><a name="line74" />  74        | 
| 696 | 
            -
            </span><span class="marked1"><a name="line75" />  75        | 
| 697 | 
            -
            </span><span class="marked0"><a name="line76" />  76        | 
| 698 | 
            -
            </span><span class="marked1"><a name="line77" />  77        | 
| 699 | 
            -
            </span><span class="marked0"><a name="line78" />  78        | 
| 700 | 
            -
            </span><span class="marked1"><a name="line79" />  79        | 
| 701 | 
            -
            </span><span class="marked0"><a name="line80" />  80        | 
| 702 | 
            -
            </span><span class="marked1"><a name="line81" />  81        | 
| 703 | 
            -
            </span><span class="marked0"><a name="line82" />  82        | 
| 704 | 
            -
            </span><span class="marked1"><a name="line83" />  83 | 
| 705 | 
            -
            </span><span class="marked0"><a name="line84" />  84 | 
| 706 | 
            -
            </span><span class="marked1"><a name="line85" />  85 | 
| 707 | 
            -
            </span><span class="marked0"><a name="line86" />  86 | 
| 708 | 
            -
            </span><span class=" | 
| 709 | 
            -
            </span><span class="marked0"><a name="line88" />  88          | 
| 710 | 
            -
            </span><span class="marked1"><a name="line89" />  89          | 
| 711 | 
            -
            </span><span class=" | 
| 712 | 
            -
            </span><span class="marked1"><a name="line91" />  91 | 
| 713 | 
            -
            </span><span class=" | 
| 714 | 
            -
            </span><span class=" | 
| 715 | 
            -
            </span><span class=" | 
| 716 | 
            -
            </span><span class="inferred1"><a name="line95" />  95        | 
| 717 | 
            -
            </span><span class=" | 
| 718 | 
            -
            </span><span class=" | 
| 719 | 
            -
            </span><span class="inferred0"><a name="line98" />  98        | 
| 720 | 
            -
            </span><span class="inferred1"><a name="line99" />  99        | 
| 721 | 
            -
            </span><span class="inferred0"><a name="line100" /> 100       #  | 
| 722 | 
            -
            </span><span class="inferred1"><a name="line101" /> 101       #  | 
| 723 | 
            -
            </span><span class="inferred0"><a name="line102" /> 102       # | 
| 724 | 
            -
            </span><span class=" | 
| 725 | 
            -
            </span><span class=" | 
| 726 | 
            -
            </span><span class=" | 
| 727 | 
            -
            </span><span class=" | 
| 728 | 
            -
            </span><span class=" | 
| 729 | 
            -
            </span><span class="marked0"><a name="line108" /> 108 | 
| 730 | 
            -
            </span><span class="marked1"><a name="line109" /> 109          | 
| 731 | 
            -
            </span><span class=" | 
| 732 | 
            -
            </span><span class=" | 
| 733 | 
            -
            </span><span class="marked0"><a name="line112" /> 112 | 
| 734 | 
            -
            </span><span class="marked1"><a name="line113" /> 113          | 
| 735 | 
            -
            </span><span class=" | 
| 736 | 
            -
            </span><span class="inferred1"><a name="line115" /> 115 | 
| 737 | 
            -
            </span><span class="inferred0"><a name="line116" /> 116 | 
| 738 | 
            -
            </span><span class=" | 
| 739 | 
            -
            </span><span class=" | 
| 740 | 
            -
            </span><span class=" | 
| 741 | 
            -
            </span><span class=" | 
| 742 | 
            -
            </span><span class="inferred1"><a name="line121" /> 121 | 
| 743 | 
            -
            </span><span class=" | 
| 744 | 
            -
            </span><span class=" | 
| 745 | 
            -
            </span><span class="marked0"><a name="line124" /> 124 | 
| 746 | 
            -
            </span><span class=" | 
| 747 | 
            -
            </span><span class="inferred0"><a name="line126" /> 126        | 
| 748 | 
            -
            </span><span class="marked1"><a name="line127" /> 127 | 
| 749 | 
            -
            </span><span class="marked0"><a name="line128" /> 128 | 
| 750 | 
            -
            </span><span class=" | 
| 751 | 
            -
            </span><span class=" | 
| 752 | 
            -
            </span><span class=" | 
| 753 | 
            -
            </span><span class=" | 
| 754 | 
            -
            </span><span class="marked1"><a name="line133" /> 133         converted_uri | 
| 755 | 
            -
            </span><span class=" | 
| 756 | 
            -
            </span><span class="marked1"><a name="line135" /> 135 | 
| 757 | 
            -
            </span><span class="marked0"><a name="line136" /> 136 | 
| 758 | 
            -
            </span><span class=" | 
| 759 | 
            -
            </span><span class="marked0"><a name="line138" /> 138 | 
| 760 | 
            -
            </span><span class="marked1"><a name="line139" /> 139 | 
| 761 | 
            -
            </span><span class=" | 
| 762 | 
            -
            </span><span class=" | 
| 763 | 
            -
            </span><span class="marked0"><a name="line142" /> 142 | 
| 764 | 
            -
            </span><span class=" | 
| 765 | 
            -
            </span><span class=" | 
| 766 | 
            -
            </span><span class=" | 
| 767 | 
            -
            </span><span class="inferred0"><a name="line146" /> 146 | 
| 768 | 
            -
            </span><span class=" | 
| 769 | 
            -
            </span><span class="inferred0"><a name="line148" /> 148 | 
| 770 | 
            -
            </span><span class="inferred1"><a name="line149" /> 149 | 
| 771 | 
            -
            </span><span class=" | 
| 772 | 
            -
            </span><span class="inferred1"><a name="line151" /> 151      | 
| 773 | 
            -
            </span><span class="inferred0"><a name="line152" /> 152      | 
| 774 | 
            -
            </span><span class="inferred1"><a name="line153" /> 153     #  | 
| 775 | 
            -
            </span><span class="inferred0"><a name="line154" /> 154     # | 
| 776 | 
            -
            </span><span class="inferred1"><a name="line155" /> 155     #  | 
| 777 | 
            -
            </span><span class="inferred0"><a name="line156" /> 156     #  | 
| 778 | 
            -
            </span><span class="inferred1"><a name="line157" /> 157     #
         | 
| 779 | 
            -
            </span><span class="inferred0"><a name="line158" /> 158     #  | 
| 780 | 
            -
            </span><span class="inferred1"><a name="line159" /> 159     # | 
| 781 | 
            -
            </span><span class="inferred0"><a name="line160" /> 160     # | 
| 782 | 
            -
            </span><span class="inferred1"><a name="line161" /> 161     # | 
| 783 | 
            -
            </span><span class="inferred0"><a name="line162" /> 162     # | 
| 784 | 
            -
            </span><span class="inferred1"><a name="line163" /> 163     # | 
| 785 | 
            -
            </span><span class="inferred0"><a name="line164" /> 164     #     | 
| 786 | 
            -
            </span><span class="inferred1"><a name="line165" /> 165     # | 
| 787 | 
            -
            </span><span class="inferred0"><a name="line166" /> 166     #    def self. | 
| 788 | 
            -
            </span><span class="inferred1"><a name="line167" /> 167     #      return value | 
| 789 | 
            -
            </span><span class="inferred0"><a name="line168" /> 168     #      return  | 
| 645 | 
            +
            </span><span class="marked0"><a name="line24" />  24 $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '/..')))
         | 
| 646 | 
            +
            </span><span class="marked1"><a name="line25" />  25 $:.uniq!
         | 
| 647 | 
            +
            </span><span class="inferred0"><a name="line26" />  26 
         | 
| 648 | 
            +
            </span><span class="marked1"><a name="line27" />  27 require 'addressable/version'
         | 
| 649 | 
            +
            </span><span class="inferred0"><a name="line28" />  28 
         | 
| 650 | 
            +
            </span><span class="marked1"><a name="line29" />  29 module Addressable
         | 
| 651 | 
            +
            </span><span class="inferred0"><a name="line30" />  30   # This is an implementation of a URI parser based on RFC 3986.
         | 
| 652 | 
            +
            </span><span class="marked1"><a name="line31" />  31   class URI
         | 
| 653 | 
            +
            </span><span class="inferred0"><a name="line32" />  32     # Raised if something other than a uri is supplied.
         | 
| 654 | 
            +
            </span><span class="marked1"><a name="line33" />  33     class InvalidURIError < StandardError
         | 
| 655 | 
            +
            </span><span class="inferred0"><a name="line34" />  34     end
         | 
| 656 | 
            +
            </span><span class="inferred1"><a name="line35" />  35     
         | 
| 657 | 
            +
            </span><span class="inferred0"><a name="line36" />  36     # Raised if an invalid method option is supplied.
         | 
| 658 | 
            +
            </span><span class="marked1"><a name="line37" />  37     class InvalidOptionError < StandardError
         | 
| 659 | 
            +
            </span><span class="inferred0"><a name="line38" />  38     end
         | 
| 660 | 
            +
            </span><span class="inferred1"><a name="line39" />  39     
         | 
| 661 | 
            +
            </span><span class="inferred0"><a name="line40" />  40     # Raised if an invalid method option is supplied.
         | 
| 662 | 
            +
            </span><span class="marked1"><a name="line41" />  41     class InvalidTemplateValue < StandardError
         | 
| 663 | 
            +
            </span><span class="inferred0"><a name="line42" />  42     end
         | 
| 664 | 
            +
            </span><span class="inferred1"><a name="line43" />  43 
         | 
| 665 | 
            +
            </span><span class="marked0"><a name="line44" />  44     module CharacterClasses
         | 
| 666 | 
            +
            </span><span class="marked1"><a name="line45" />  45       ALPHA = "a-zA-Z"
         | 
| 667 | 
            +
            </span><span class="marked0"><a name="line46" />  46       DIGIT = "0-9"
         | 
| 668 | 
            +
            </span><span class="marked1"><a name="line47" />  47       GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@"
         | 
| 669 | 
            +
            </span><span class="marked0"><a name="line48" />  48       SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\="
         | 
| 670 | 
            +
            </span><span class="marked1"><a name="line49" />  49       RESERVED = GEN_DELIMS + SUB_DELIMS
         | 
| 671 | 
            +
            </span><span class="marked0"><a name="line50" />  50       UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~"
         | 
| 672 | 
            +
            </span><span class="marked1"><a name="line51" />  51       PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@"
         | 
| 673 | 
            +
            </span><span class="marked0"><a name="line52" />  52       SCHEME = ALPHA + DIGIT + "\\-\\+\\."
         | 
| 674 | 
            +
            </span><span class="marked1"><a name="line53" />  53       AUTHORITY = PCHAR
         | 
| 675 | 
            +
            </span><span class="marked0"><a name="line54" />  54       PATH = PCHAR + "\\/"
         | 
| 676 | 
            +
            </span><span class="marked1"><a name="line55" />  55       QUERY = PCHAR + "\\/\\?"
         | 
| 677 | 
            +
            </span><span class="marked0"><a name="line56" />  56       FRAGMENT = PCHAR + "\\/\\?"
         | 
| 678 | 
            +
            </span><span class="inferred1"><a name="line57" />  57     end    
         | 
| 679 | 
            +
            </span><span class="inferred0"><a name="line58" />  58     
         | 
| 680 | 
            +
            </span><span class="inferred1"><a name="line59" />  59     # Returns a URI object based on the parsed string.
         | 
| 681 | 
            +
            </span><span class="marked0"><a name="line60" />  60     def self.parse(uri_string)
         | 
| 682 | 
            +
            </span><span class="marked1"><a name="line61" />  61       return nil if uri_string.nil?
         | 
| 683 | 
            +
            </span><span class="inferred0"><a name="line62" />  62       
         | 
| 684 | 
            +
            </span><span class="inferred1"><a name="line63" />  63       # If a URI object is passed, just return itself.
         | 
| 685 | 
            +
            </span><span class="marked0"><a name="line64" />  64       return uri_string if uri_string.kind_of?(self)
         | 
| 686 | 
            +
            </span><span class="inferred1"><a name="line65" />  65       
         | 
| 687 | 
            +
            </span><span class="inferred0"><a name="line66" />  66       # If a URI object of the Ruby standard library variety is passed,
         | 
| 688 | 
            +
            </span><span class="inferred1"><a name="line67" />  67       # convert it to a string, then parse the string.
         | 
| 689 | 
            +
            </span><span class="marked0"><a name="line68" />  68       if uri_string.class.name =~ /^URI::/
         | 
| 690 | 
            +
            </span><span class="inferred1"><a name="line69" />  69         uri_string = uri_string.to_s
         | 
| 691 | 
            +
            </span><span class="inferred0"><a name="line70" />  70       end
         | 
| 692 | 
            +
            </span><span class="inferred1"><a name="line71" />  71       
         | 
| 693 | 
            +
            </span><span class="marked0"><a name="line72" />  72       uri_regex =
         | 
| 694 | 
            +
            </span><span class="inferred1"><a name="line73" />  73         /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/
         | 
| 695 | 
            +
            </span><span class="marked0"><a name="line74" />  74       scan = uri_string.scan(uri_regex)
         | 
| 696 | 
            +
            </span><span class="marked1"><a name="line75" />  75       fragments = scan[0]
         | 
| 697 | 
            +
            </span><span class="marked0"><a name="line76" />  76       return nil if fragments.nil?
         | 
| 698 | 
            +
            </span><span class="marked1"><a name="line77" />  77       scheme = fragments[1]
         | 
| 699 | 
            +
            </span><span class="marked0"><a name="line78" />  78       authority = fragments[3]
         | 
| 700 | 
            +
            </span><span class="marked1"><a name="line79" />  79       path = fragments[4]
         | 
| 701 | 
            +
            </span><span class="marked0"><a name="line80" />  80       query = fragments[6]
         | 
| 702 | 
            +
            </span><span class="marked1"><a name="line81" />  81       fragment = fragments[8]
         | 
| 703 | 
            +
            </span><span class="marked0"><a name="line82" />  82       userinfo = nil
         | 
| 704 | 
            +
            </span><span class="marked1"><a name="line83" />  83       user = nil
         | 
| 705 | 
            +
            </span><span class="marked0"><a name="line84" />  84       password = nil
         | 
| 706 | 
            +
            </span><span class="marked1"><a name="line85" />  85       host = nil
         | 
| 707 | 
            +
            </span><span class="marked0"><a name="line86" />  86       port = nil
         | 
| 708 | 
            +
            </span><span class="marked1"><a name="line87" />  87       if authority != nil
         | 
| 709 | 
            +
            </span><span class="marked0"><a name="line88" />  88         userinfo = authority.scan(/^([^\[\]]*)@/).flatten[0]
         | 
| 710 | 
            +
            </span><span class="marked1"><a name="line89" />  89         if userinfo != nil
         | 
| 711 | 
            +
            </span><span class="marked0"><a name="line90" />  90           user = userinfo.strip.scan(/^([^:]*):?/).flatten[0]
         | 
| 712 | 
            +
            </span><span class="marked1"><a name="line91" />  91           password = userinfo.strip.scan(/:(.*)$/).flatten[0]
         | 
| 713 | 
            +
            </span><span class="inferred0"><a name="line92" />  92         end
         | 
| 714 | 
            +
            </span><span class="marked1"><a name="line93" />  93         host = authority.gsub(/^([^\[\]]*)@/, "").gsub(/:([^:@\[\]]*?)$/, "")
         | 
| 715 | 
            +
            </span><span class="marked0"><a name="line94" />  94         port = authority.scan(/:([^:@\[\]]*?)$/).flatten[0]
         | 
| 716 | 
            +
            </span><span class="inferred1"><a name="line95" />  95       end
         | 
| 717 | 
            +
            </span><span class="marked0"><a name="line96" />  96       if port.nil? || port == ""
         | 
| 718 | 
            +
            </span><span class="marked1"><a name="line97" />  97         port = nil
         | 
| 719 | 
            +
            </span><span class="inferred0"><a name="line98" />  98       end
         | 
| 720 | 
            +
            </span><span class="inferred1"><a name="line99" />  99       
         | 
| 721 | 
            +
            </span><span class="inferred0"><a name="line100" /> 100       # WARNING: Not standards-compliant, but follows the theme
         | 
| 722 | 
            +
            </span><span class="inferred1"><a name="line101" /> 101       # of Postel's law:
         | 
| 723 | 
            +
            </span><span class="inferred0"><a name="line102" /> 102       #
         | 
| 724 | 
            +
            </span><span class="inferred1"><a name="line103" /> 103       # Special exception for dealing with the retarded idea of the
         | 
| 725 | 
            +
            </span><span class="inferred0"><a name="line104" /> 104       # feed pseudo-protocol.  Without this exception, the parser will read
         | 
| 726 | 
            +
            </span><span class="inferred1"><a name="line105" /> 105       # the URI as having a blank port number, instead of as having a second
         | 
| 727 | 
            +
            </span><span class="inferred0"><a name="line106" /> 106       # URI embedded within.  This exception translates these broken URIs
         | 
| 728 | 
            +
            </span><span class="inferred1"><a name="line107" /> 107       # and instead treats the inner URI as opaque.
         | 
| 729 | 
            +
            </span><span class="marked0"><a name="line108" /> 108       if scheme == "feed" && host == "http"
         | 
| 730 | 
            +
            </span><span class="marked1"><a name="line109" /> 109         userinfo = nil
         | 
| 731 | 
            +
            </span><span class="marked0"><a name="line110" /> 110         user = nil
         | 
| 732 | 
            +
            </span><span class="marked1"><a name="line111" /> 111         password = nil
         | 
| 733 | 
            +
            </span><span class="marked0"><a name="line112" /> 112         host = nil
         | 
| 734 | 
            +
            </span><span class="marked1"><a name="line113" /> 113         port = nil
         | 
| 735 | 
            +
            </span><span class="marked0"><a name="line114" /> 114         path = authority + path
         | 
| 736 | 
            +
            </span><span class="inferred1"><a name="line115" /> 115       end
         | 
| 737 | 
            +
            </span><span class="inferred0"><a name="line116" /> 116       
         | 
| 738 | 
            +
            </span><span class="marked1"><a name="line117" /> 117       return Addressable::URI.new(
         | 
| 739 | 
            +
            </span><span class="marked0"><a name="line118" /> 118         scheme, user, password, host, port, path, query, fragment)
         | 
| 740 | 
            +
            </span><span class="inferred1"><a name="line119" /> 119     end
         | 
| 741 | 
            +
            </span><span class="inferred0"><a name="line120" /> 120     
         | 
| 742 | 
            +
            </span><span class="inferred1"><a name="line121" /> 121     # Converts a path to a file protocol URI.  If the path supplied is
         | 
| 743 | 
            +
            </span><span class="inferred0"><a name="line122" /> 122     # relative, it will be returned as a relative URI.  If the path supplied
         | 
| 744 | 
            +
            </span><span class="inferred1"><a name="line123" /> 123     # is actually a URI, it will return the parsed URI.
         | 
| 745 | 
            +
            </span><span class="marked0"><a name="line124" /> 124     def self.convert_path(path)
         | 
| 746 | 
            +
            </span><span class="marked1"><a name="line125" /> 125       return nil if path.nil?
         | 
| 747 | 
            +
            </span><span class="inferred0"><a name="line126" /> 126       
         | 
| 748 | 
            +
            </span><span class="marked1"><a name="line127" /> 127       converted_uri = path.strip
         | 
| 749 | 
            +
            </span><span class="marked0"><a name="line128" /> 128       if converted_uri.length > 0 && converted_uri[0..0] == "/"
         | 
| 750 | 
            +
            </span><span class="marked1"><a name="line129" /> 129         converted_uri = "file://" + converted_uri
         | 
| 751 | 
            +
            </span><span class="inferred0"><a name="line130" /> 130       end
         | 
| 752 | 
            +
            </span><span class="inferred1"><a name="line131" /> 131       if converted_uri.length > 0 &&
         | 
| 753 | 
            +
            </span><span class="marked0"><a name="line132" /> 132           converted_uri.scan(/^[a-zA-Z]:[\\\/]/).size > 0
         | 
| 754 | 
            +
            </span><span class="marked1"><a name="line133" /> 133         converted_uri = "file:///" + converted_uri
         | 
| 755 | 
            +
            </span><span class="inferred0"><a name="line134" /> 134       end
         | 
| 756 | 
            +
            </span><span class="marked1"><a name="line135" /> 135       converted_uri.gsub!(/^file:\/*/i, "file:///")
         | 
| 757 | 
            +
            </span><span class="marked0"><a name="line136" /> 136       if converted_uri =~ /^file:/i
         | 
| 758 | 
            +
            </span><span class="inferred1"><a name="line137" /> 137         # Adjust windows-style uris
         | 
| 759 | 
            +
            </span><span class="marked0"><a name="line138" /> 138         converted_uri.gsub!(/^file:\/\/\/([a-zA-Z])\|/i, 'file:///\1:')
         | 
| 760 | 
            +
            </span><span class="marked1"><a name="line139" /> 139         converted_uri.gsub!(/\\/, '/')
         | 
| 761 | 
            +
            </span><span class="marked0"><a name="line140" /> 140         converted_uri = self.parse(converted_uri).normalize
         | 
| 762 | 
            +
            </span><span class="marked1"><a name="line141" /> 141         if File.exists?(converted_uri.path) &&
         | 
| 763 | 
            +
            </span><span class="marked0"><a name="line142" /> 142             File.stat(converted_uri.path).directory?
         | 
| 764 | 
            +
            </span><span class="marked1"><a name="line143" /> 143           converted_uri.path.gsub!(/\/$/, "")
         | 
| 765 | 
            +
            </span><span class="marked0"><a name="line144" /> 144           converted_uri.path = converted_uri.path + '/'
         | 
| 766 | 
            +
            </span><span class="inferred1"><a name="line145" /> 145         end
         | 
| 767 | 
            +
            </span><span class="inferred0"><a name="line146" /> 146       else
         | 
| 768 | 
            +
            </span><span class="marked1"><a name="line147" /> 147         converted_uri = self.parse(converted_uri)
         | 
| 769 | 
            +
            </span><span class="inferred0"><a name="line148" /> 148       end
         | 
| 770 | 
            +
            </span><span class="inferred1"><a name="line149" /> 149       
         | 
| 771 | 
            +
            </span><span class="marked0"><a name="line150" /> 150       return converted_uri
         | 
| 772 | 
            +
            </span><span class="inferred1"><a name="line151" /> 151     end
         | 
| 773 | 
            +
            </span><span class="inferred0"><a name="line152" /> 152     
         | 
| 774 | 
            +
            </span><span class="inferred1"><a name="line153" /> 153     # Expands a URI template into a full URI.
         | 
| 775 | 
            +
            </span><span class="inferred0"><a name="line154" /> 154     #
         | 
| 776 | 
            +
            </span><span class="inferred1"><a name="line155" /> 155     # An optional processor object may be supplied.  The object should
         | 
| 777 | 
            +
            </span><span class="inferred0"><a name="line156" /> 156     # respond to either the :validate or :transform messages or both.
         | 
| 778 | 
            +
            </span><span class="inferred1"><a name="line157" /> 157     # Both the :validate and :transform methods should take two parameters:
         | 
| 779 | 
            +
            </span><span class="inferred0"><a name="line158" /> 158     # :name and :value.  The :validate method should return true or false;
         | 
| 780 | 
            +
            </span><span class="inferred1"><a name="line159" /> 159     # true if the value of the variable is valid, false otherwise.  The
         | 
| 781 | 
            +
            </span><span class="inferred0"><a name="line160" /> 160     # :transform method should return the transformed variable value as a
         | 
| 782 | 
            +
            </span><span class="inferred1"><a name="line161" /> 161     # string.
         | 
| 783 | 
            +
            </span><span class="inferred0"><a name="line162" /> 162     #
         | 
| 784 | 
            +
            </span><span class="inferred1"><a name="line163" /> 163     # An example:
         | 
| 785 | 
            +
            </span><span class="inferred0"><a name="line164" /> 164     #    
         | 
| 786 | 
            +
            </span><span class="inferred1"><a name="line165" /> 165     #  class ExampleProcessor
         | 
| 787 | 
            +
            </span><span class="inferred0"><a name="line166" /> 166     #    def self.validate(name, value)
         | 
| 788 | 
            +
            </span><span class="inferred1"><a name="line167" /> 167     #      return !!(value =~ /^[\w ]+$/) if name == "query"
         | 
| 789 | 
            +
            </span><span class="inferred0"><a name="line168" /> 168     #      return true
         | 
| 790 790 | 
             
            </span><span class="inferred1"><a name="line169" /> 169     #    end
         | 
| 791 | 
            -
            </span><span class="inferred0"><a name="line170" /> 170     # | 
| 792 | 
            -
            </span><span class="inferred1"><a name="line171" /> 171     # 
         | 
| 793 | 
            -
            </span><span class="inferred0"><a name="line172" /> 172     # | 
| 794 | 
            -
            </span><span class="inferred1"><a name="line173" /> 173     # | 
| 795 | 
            -
            </span><span class="inferred0"><a name="line174" /> 174     #     | 
| 796 | 
            -
            </span><span class="inferred1"><a name="line175" /> 175     # | 
| 797 | 
            -
            </span><span class="inferred0"><a name="line176" /> 176     # | 
| 798 | 
            -
            </span><span class=" | 
| 799 | 
            -
            </span><span class=" | 
| 800 | 
            -
            </span><span class=" | 
| 801 | 
            -
            </span><span class=" | 
| 802 | 
            -
            </span><span class=" | 
| 803 | 
            -
            </span><span class="marked0"><a name="line182" /> 182 | 
| 804 | 
            -
            </span><span class="marked1"><a name="line183" /> 183 | 
| 805 | 
            -
            </span><span class="marked0"><a name="line184" /> 184 | 
| 806 | 
            -
            </span><span class=" | 
| 807 | 
            -
            </span><span class=" | 
| 808 | 
            -
            </span><span class=" | 
| 809 | 
            -
            </span><span class="marked0"><a name="line188" /> 188 | 
| 810 | 
            -
            </span><span class="marked1"><a name="line189" /> 189 | 
| 811 | 
            -
            </span><span class="inferred0"><a name="line190" /> 190 | 
| 812 | 
            -
            </span><span class="inferred1"><a name="line191" /> 191 | 
| 813 | 
            -
            </span><span class="inferred0"><a name="line192" /> 192 | 
| 814 | 
            -
            </span><span class=" | 
| 815 | 
            -
            </span><span class="marked0"><a name="line194" /> 194 | 
| 816 | 
            -
            </span><span class="inferred1"><a name="line195" /> 195            | 
| 817 | 
            -
            </span><span class="inferred0"><a name="line196" /> 196 | 
| 818 | 
            -
            </span><span class="inferred1"><a name="line197" /> 197 | 
| 819 | 
            -
            </span><span class=" | 
| 820 | 
            -
            </span><span class=" | 
| 821 | 
            -
            </span><span class=" | 
| 822 | 
            -
            </span><span class=" | 
| 823 | 
            -
            </span><span class="inferred0"><a name="line202" /> 202 | 
| 824 | 
            -
            </span><span class=" | 
| 825 | 
            -
            </span><span class="inferred0"><a name="line204" /> 204 | 
| 826 | 
            -
            </span><span class="marked1"><a name="line205" /> 205 | 
| 827 | 
            -
            </span><span class=" | 
| 828 | 
            -
            </span><span class="marked1"><a name="line207" /> 207 | 
| 829 | 
            -
            </span><span class="inferred0"><a name="line208" /> 208 | 
| 830 | 
            -
            </span><span class=" | 
| 831 | 
            -
            </span><span class=" | 
| 832 | 
            -
            </span><span class=" | 
| 833 | 
            -
            </span><span class="inferred0"><a name="line212" /> 212 | 
| 834 | 
            -
            </span><span class=" | 
| 835 | 
            -
            </span><span class="inferred0"><a name="line214" /> 214      | 
| 836 | 
            -
            </span><span class="inferred1"><a name="line215" /> 215     
         | 
| 837 | 
            -
            </span><span class="inferred0"><a name="line216" /> 216     #  | 
| 838 | 
            -
            </span><span class="inferred1"><a name="line217" /> 217     #  | 
| 839 | 
            -
            </span><span class="inferred0"><a name="line218" /> 218     #  | 
| 840 | 
            -
            </span><span class="inferred1"><a name="line219" /> 219     #  | 
| 841 | 
            -
            </span><span class="inferred0"><a name="line220" /> 220     #  | 
| 842 | 
            -
            </span><span class="inferred1"><a name="line221" /> 221     # | 
| 843 | 
            -
            </span><span class="inferred0"><a name="line222" /> 222     #  | 
| 844 | 
            -
            </span><span class="inferred1"><a name="line223" /> 223     #
         | 
| 845 | 
            -
            </span><span class="inferred0"><a name="line224" /> 224     #  | 
| 846 | 
            -
            </span><span class="inferred1"><a name="line225" /> 225     #
         | 
| 847 | 
            -
            </span><span class="inferred0"><a name="line226" /> 226     # | 
| 848 | 
            -
            </span><span class="inferred1"><a name="line227" /> 227     # | 
| 849 | 
            -
            </span><span class=" | 
| 850 | 
            -
            </span><span class="inferred1"><a name="line229" /> 229 | 
| 851 | 
            -
            </span><span class=" | 
| 852 | 
            -
            </span><span class=" | 
| 853 | 
            -
            </span><span class="inferred0"><a name="line232" /> 232 | 
| 854 | 
            -
            </span><span class="inferred1"><a name="line233" /> 233 | 
| 855 | 
            -
            </span><span class="inferred0"><a name="line234" /> 234 | 
| 856 | 
            -
            </span><span class=" | 
| 857 | 
            -
            </span><span class=" | 
| 858 | 
            -
            </span><span class="inferred1"><a name="line237" /> 237      | 
| 859 | 
            -
            </span><span class="inferred0"><a name="line238" /> 238     
         | 
| 860 | 
            -
            </span><span class="inferred1"><a name="line239" /> 239     # | 
| 861 | 
            -
            </span><span class="inferred0"><a name="line240" /> 240     #  | 
| 862 | 
            -
            </span><span class=" | 
| 863 | 
            -
            </span><span class=" | 
| 864 | 
            -
            </span><span class="inferred1"><a name="line243" /> 243 | 
| 865 | 
            -
            </span><span class=" | 
| 866 | 
            -
            </span><span class=" | 
| 867 | 
            -
            </span><span class="inferred0"><a name="line246" /> 246      | 
| 868 | 
            -
            </span><span class=" | 
| 869 | 
            -
            </span><span class=" | 
| 870 | 
            -
            </span><span class=" | 
| 871 | 
            -
            </span><span class=" | 
| 872 | 
            -
            </span><span class="marked1"><a name="line251" /> 251        | 
| 873 | 
            -
            </span><span class="marked0"><a name="line252" /> 252        | 
| 874 | 
            -
            </span><span class="marked1"><a name="line253" /> 253 | 
| 875 | 
            -
            </span><span class="inferred0"><a name="line254" /> 254 | 
| 876 | 
            -
            </span><span class="marked1"><a name="line255" /> 255 | 
| 877 | 
            -
            </span><span class=" | 
| 878 | 
            -
            </span><span class=" | 
| 879 | 
            -
            </span><span class=" | 
| 880 | 
            -
            </span><span class="marked1"><a name="line259" /> 259 | 
| 881 | 
            -
            </span><span class=" | 
| 882 | 
            -
            </span><span class="marked1"><a name="line261" /> 261 | 
| 883 | 
            -
            </span><span class="inferred0"><a name="line262" /> 262            | 
| 884 | 
            -
            </span><span class=" | 
| 885 | 
            -
            </span><span class="inferred0"><a name="line264" /> 264 | 
| 886 | 
            -
            </span><span class="marked1"><a name="line265" /> 265          | 
| 887 | 
            -
            </span><span class="inferred0"><a name="line266" /> 266 | 
| 888 | 
            -
            </span><span class="marked1"><a name="line267" /> 267 | 
| 889 | 
            -
            </span><span class=" | 
| 890 | 
            -
            </span><span class="marked1"><a name="line269" /> 269 | 
| 891 | 
            -
            </span><span class=" | 
| 892 | 
            -
            </span><span class=" | 
| 893 | 
            -
            </span><span class=" | 
| 894 | 
            -
            </span><span class="marked1"><a name="line273" /> 273 | 
| 895 | 
            -
            </span><span class=" | 
| 896 | 
            -
            </span><span class=" | 
| 897 | 
            -
            </span><span class="inferred0"><a name="line276" /> 276 | 
| 898 | 
            -
            </span><span class="inferred1"><a name="line277" /> 277 | 
| 899 | 
            -
            </span><span class=" | 
| 900 | 
            -
            </span><span class="marked1"><a name="line279" /> 279 | 
| 901 | 
            -
            </span><span class=" | 
| 902 | 
            -
            </span><span class="marked1"><a name="line281" /> 281          | 
| 903 | 
            -
            </span><span class=" | 
| 904 | 
            -
            </span><span class="marked1"><a name="line283" /> 283          | 
| 905 | 
            -
            </span><span class=" | 
| 906 | 
            -
            </span><span class=" | 
| 907 | 
            -
            </span><span class=" | 
| 908 | 
            -
            </span><span class=" | 
| 909 | 
            -
            </span><span class="marked0"><a name="line288" /> 288 | 
| 910 | 
            -
            </span><span class=" | 
| 911 | 
            -
            </span><span class="marked0"><a name="line290" /> 290 | 
| 912 | 
            -
            </span><span class=" | 
| 913 | 
            -
            </span><span class="marked0"><a name="line292" /> 292 | 
| 914 | 
            -
            </span><span class="marked1"><a name="line293" /> 293 | 
| 915 | 
            -
            </span><span class=" | 
| 916 | 
            -
            </span><span class="inferred1"><a name="line295" /> 295 | 
| 917 | 
            -
            </span><span class=" | 
| 918 | 
            -
            </span><span class=" | 
| 919 | 
            -
            </span><span class=" | 
| 920 | 
            -
            </span><span class="inferred1"><a name="line299" /> 299 | 
| 921 | 
            -
            </span><span class=" | 
| 922 | 
            -
            </span><span class="inferred1"><a name="line301" /> 301 | 
| 923 | 
            -
            </span><span class=" | 
| 924 | 
            -
            </span><span class="inferred1"><a name="line303" /> 303 | 
| 925 | 
            -
            </span><span class="inferred0"><a name="line304" /> 304 | 
| 926 | 
            -
            </span><span class="inferred1"><a name="line305" /> 305 | 
| 927 | 
            -
            </span><span class=" | 
| 928 | 
            -
            </span><span class="inferred1"><a name="line307" /> 307 | 
| 929 | 
            -
            </span><span class=" | 
| 930 | 
            -
            </span><span class="inferred1"><a name="line309" /> 309 | 
| 931 | 
            -
            </span><span class=" | 
| 932 | 
            -
            </span><span class=" | 
| 933 | 
            -
            </span><span class=" | 
| 934 | 
            -
            </span><span class=" | 
| 935 | 
            -
            </span><span class=" | 
| 936 | 
            -
            </span><span class="inferred1"><a name="line315" /> 315 | 
| 937 | 
            -
            </span><span class=" | 
| 938 | 
            -
            </span><span class=" | 
| 939 | 
            -
            </span><span class="marked0"><a name="line318" /> 318 | 
| 940 | 
            -
            </span><span class="marked1"><a name="line319" /> 319        | 
| 941 | 
            -
            </span><span class="inferred0"><a name="line320" /> 320 | 
| 942 | 
            -
            </span><span class="inferred1"><a name="line321" /> 321 | 
| 943 | 
            -
            </span><span class=" | 
| 944 | 
            -
            </span><span class=" | 
| 945 | 
            -
            </span><span class="marked0"><a name="line324" /> 324 | 
| 946 | 
            -
            </span><span class="marked1"><a name="line325" /> 325        | 
| 947 | 
            -
            </span><span class=" | 
| 948 | 
            -
            </span><span class=" | 
| 949 | 
            -
            </span><span class="marked0"><a name="line328" /> 328        | 
| 950 | 
            -
            </span><span class=" | 
| 951 | 
            -
            </span><span class=" | 
| 952 | 
            -
            </span><span class="inferred1"><a name="line331" /> 331 | 
| 953 | 
            -
            </span><span class=" | 
| 954 | 
            -
            </span><span class="marked1"><a name="line333" /> 333 | 
| 955 | 
            -
            </span><span class="marked0"><a name="line334" /> 334        | 
| 956 | 
            -
            </span><span class="marked1"><a name="line335" /> 335        | 
| 957 | 
            -
            </span><span class="marked0"><a name="line336" /> 336          | 
| 958 | 
            -
            </span><span class=" | 
| 959 | 
            -
            </span><span class=" | 
| 960 | 
            -
            </span><span class=" | 
| 961 | 
            -
            </span><span class="marked0"><a name="line340" /> 340          | 
| 962 | 
            -
            </span><span class=" | 
| 963 | 
            -
            </span><span class="marked0"><a name="line342" /> 342 | 
| 964 | 
            -
            </span><span class="inferred1"><a name="line343" /> 343            | 
| 965 | 
            -
            </span><span class="marked0"><a name="line344" /> 344 | 
| 966 | 
            -
            </span><span class="inferred1"><a name="line345" /> 345            | 
| 967 | 
            -
            </span><span class=" | 
| 968 | 
            -
            </span><span class=" | 
| 969 | 
            -
            </span><span class=" | 
| 970 | 
            -
            </span><span class="inferred1"><a name="line349" /> 349 | 
| 971 | 
            -
            </span><span class="marked0"><a name="line350" /> 350 | 
| 972 | 
            -
            </span><span class=" | 
| 973 | 
            -
            </span><span class="marked0"><a name="line352" /> 352 | 
| 974 | 
            -
            </span><span class=" | 
| 975 | 
            -
            </span><span class=" | 
| 976 | 
            -
            </span><span class="marked1"><a name="line355" /> 355 | 
| 977 | 
            -
            </span><span class="marked0"><a name="line356" /> 356 | 
| 978 | 
            -
            </span><span class=" | 
| 979 | 
            -
            </span><span class=" | 
| 980 | 
            -
            </span><span class=" | 
| 981 | 
            -
            </span><span class="inferred0"><a name="line360" /> 360 | 
| 982 | 
            -
            </span><span class="marked1"><a name="line361" /> 361 | 
| 983 | 
            -
            </span><span class="marked0"><a name="line362" /> 362 | 
| 984 | 
            -
            </span><span class=" | 
| 985 | 
            -
            </span><span class="marked0"><a name="line364" /> 364          | 
| 986 | 
            -
            </span><span class=" | 
| 987 | 
            -
            </span><span class=" | 
| 988 | 
            -
            </span><span class=" | 
| 989 | 
            -
            </span><span class=" | 
| 990 | 
            -
            </span><span class=" | 
| 991 | 
            -
            </span><span class="marked0"><a name="line370" /> 370 | 
| 992 | 
            -
            </span><span class="marked1"><a name="line371" /> 371 | 
| 993 | 
            -
            </span><span class=" | 
| 994 | 
            -
            </span><span class="marked1"><a name="line373" /> 373        | 
| 995 | 
            -
            </span><span class="marked0"><a name="line374" /> 374 | 
| 996 | 
            -
            </span><span class="marked1"><a name="line375" /> 375 | 
| 997 | 
            -
            </span><span class="marked0"><a name="line376" /> 376 | 
| 998 | 
            -
            </span><span class=" | 
| 999 | 
            -
            </span><span class=" | 
| 1000 | 
            -
            </span><span class=" | 
| 1001 | 
            -
            </span><span class="marked0"><a name="line380" /> 380 | 
| 1002 | 
            -
            </span><span class=" | 
| 1003 | 
            -
            </span><span class="inferred0"><a name="line382" /> 382 | 
| 1004 | 
            -
            </span><span class="marked1"><a name="line383" /> 383 | 
| 1005 | 
            -
            </span><span class=" | 
| 1006 | 
            -
            </span><span class="marked1"><a name="line385" /> 385 | 
| 1007 | 
            -
            </span><span class=" | 
| 1008 | 
            -
            </span><span class=" | 
| 1009 | 
            -
            </span><span class="inferred0"><a name="line388" /> 388 | 
| 1010 | 
            -
            </span><span class="marked1"><a name="line389" /> 389 | 
| 1011 | 
            -
            </span><span class="inferred0"><a name="line390" /> 390 | 
| 1012 | 
            -
            </span><span class=" | 
| 1013 | 
            -
            </span><span class="inferred0"><a name="line392" /> 392 | 
| 1014 | 
            -
            </span><span class="marked1"><a name="line393" /> 393 | 
| 1015 | 
            -
            </span><span class=" | 
| 1016 | 
            -
            </span><span class="marked1"><a name="line395" /> 395 | 
| 1017 | 
            -
            </span><span class="inferred0"><a name="line396" /> 396     
         | 
| 1018 | 
            -
            </span><span class="inferred1"><a name="line397" /> 397 | 
| 1019 | 
            -
            </span><span class=" | 
| 1020 | 
            -
            </span><span class="marked1"><a name="line399" /> 399 | 
| 1021 | 
            -
            </span><span class="marked0"><a name="line400" /> 400 | 
| 1022 | 
            -
            </span><span class=" | 
| 1023 | 
            -
            </span><span class=" | 
| 1024 | 
            -
            </span><span class=" | 
| 1025 | 
            -
            </span><span class=" | 
| 1026 | 
            -
            </span><span class="marked1"><a name="line405" /> 405 | 
| 1027 | 
            -
            </span><span class=" | 
| 1028 | 
            -
            </span><span class=" | 
| 1029 | 
            -
            </span><span class="marked0"><a name="line408" /> 408 | 
| 1030 | 
            -
            </span><span class="marked1"><a name="line409" /> 409        | 
| 1031 | 
            -
            </span><span class="inferred0"><a name="line410" /> 410 
         | 
| 1032 | 
            -
            </span><span class=" | 
| 1033 | 
            -
            </span><span class="marked0"><a name="line412" /> 412        | 
| 1034 | 
            -
            </span><span class="marked1"><a name="line413" /> 413 | 
| 1035 | 
            -
            </span><span class="inferred0"><a name="line414" /> 414 | 
| 1036 | 
            -
            </span><span class=" | 
| 1037 | 
            -
            </span><span class=" | 
| 1038 | 
            -
            </span><span class="marked1"><a name="line417" /> 417        | 
| 1039 | 
            -
            </span><span class="marked0"><a name="line418" /> 418        | 
| 1040 | 
            -
            </span><span class=" | 
| 1041 | 
            -
            </span><span class=" | 
| 1042 | 
            -
            </span><span class=" | 
| 1043 | 
            -
            </span><span class=" | 
| 1044 | 
            -
            </span><span class=" | 
| 1045 | 
            -
            </span><span class=" | 
| 1046 | 
            -
            </span><span class="marked1"><a name="line425" /> 425 | 
| 1047 | 
            -
            </span><span class=" | 
| 1048 | 
            -
            </span><span class="marked1"><a name="line427" /> 427 | 
| 1049 | 
            -
            </span><span class="inferred0"><a name="line428" /> 428 | 
| 1050 | 
            -
            </span><span class="inferred1"><a name="line429" /> 429 | 
| 1051 | 
            -
            </span><span class="marked0"><a name="line430" /> 430 | 
| 1052 | 
            -
            </span><span class=" | 
| 1053 | 
            -
            </span><span class="inferred0"><a name="line432" /> 432 | 
| 1054 | 
            -
            </span><span class=" | 
| 1055 | 
            -
            </span><span class="marked0"><a name="line434" /> 434 | 
| 1056 | 
            -
            </span><span class="marked1"><a name="line435" /> 435 | 
| 1057 | 
            -
            </span><span class=" | 
| 1058 | 
            -
            </span><span class=" | 
| 1059 | 
            -
            </span><span class=" | 
| 1060 | 
            -
            </span><span class="marked1"><a name="line439" /> 439 | 
| 1061 | 
            -
            </span><span class="marked0"><a name="line440" /> 440 | 
| 1062 | 
            -
            </span><span class=" | 
| 1063 | 
            -
            </span><span class=" | 
| 1064 | 
            -
            </span><span class=" | 
| 1065 | 
            -
            </span><span class=" | 
| 1066 | 
            -
            </span><span class=" | 
| 1067 | 
            -
            </span><span class="inferred0"><a name="line446" /> 446 | 
| 1068 | 
            -
            </span><span class="marked1"><a name="line447" /> 447 | 
| 1069 | 
            -
            </span><span class=" | 
| 1070 | 
            -
            </span><span class=" | 
| 1071 | 
            -
            </span><span class=" | 
| 1072 | 
            -
            </span><span class=" | 
| 1073 | 
            -
            </span><span class=" | 
| 1074 | 
            -
            </span><span class="marked1"><a name="line453" /> 453 | 
| 1075 | 
            -
            </span><span class="marked0"><a name="line454" /> 454 | 
| 1076 | 
            -
            </span><span class="marked1"><a name="line455" /> 455 | 
| 1077 | 
            -
            </span><span class="marked0"><a name="line456" /> 456 | 
| 1078 | 
            -
            </span><span class=" | 
| 1079 | 
            -
            </span><span class=" | 
| 1080 | 
            -
            </span><span class="marked1"><a name="line459" /> 459        | 
| 1081 | 
            -
            </span><span class=" | 
| 1082 | 
            -
            </span><span class=" | 
| 1083 | 
            -
            </span><span class=" | 
| 1084 | 
            -
            </span><span class="marked1"><a name="line463" /> 463 | 
| 1085 | 
            -
            </span><span class=" | 
| 1086 | 
            -
            </span><span class=" | 
| 1087 | 
            -
            </span><span class=" | 
| 1088 | 
            -
            </span><span class=" | 
| 1089 | 
            -
            </span><span class="marked0"><a name="line468" /> 468        | 
| 1090 | 
            -
            </span><span class="marked1"><a name="line469" /> 469        | 
| 1091 | 
            -
            </span><span class=" | 
| 1092 | 
            -
            </span><span class="inferred1"><a name="line471" /> 471 | 
| 1093 | 
            -
            </span><span class="marked0"><a name="line472" /> 472        | 
| 1094 | 
            -
            </span><span class="inferred1"><a name="line473" /> 473 | 
| 1095 | 
            -
            </span><span class="inferred0"><a name="line474" /> 474 | 
| 1096 | 
            -
            </span><span class=" | 
| 1097 | 
            -
            </span><span class=" | 
| 1098 | 
            -
            </span><span class=" | 
| 1099 | 
            -
            </span><span class=" | 
| 1100 | 
            -
            </span><span class=" | 
| 1101 | 
            -
            </span><span class=" | 
| 1102 | 
            -
            </span><span class="marked1"><a name="line481" /> 481      | 
| 1103 | 
            -
            </span><span class=" | 
| 1104 | 
            -
            </span><span class=" | 
| 1105 | 
            -
            </span><span class=" | 
| 1106 | 
            -
            </span><span class=" | 
| 1107 | 
            -
            </span><span class=" | 
| 1108 | 
            -
            </span><span class=" | 
| 1109 | 
            -
            </span><span class="marked0"><a name="line488" /> 488 | 
| 1110 | 
            -
            </span><span class="inferred1"><a name="line489" /> 489 | 
| 1111 | 
            -
            </span><span class="inferred0"><a name="line490" /> 490 | 
| 1112 | 
            -
            </span><span class="marked1"><a name="line491" /> 491 | 
| 1113 | 
            -
            </span><span class=" | 
| 1114 | 
            -
            </span><span class="inferred1"><a name="line493" /> 493 | 
| 1115 | 
            -
            </span><span class="inferred0"><a name="line494" /> 494 | 
| 1116 | 
            -
            </span><span class="marked1"><a name="line495" /> 495 | 
| 1117 | 
            -
            </span><span class="marked0"><a name="line496" /> 496 | 
| 1118 | 
            -
            </span><span class=" | 
| 1119 | 
            -
            </span><span class=" | 
| 1120 | 
            -
            </span><span class=" | 
| 1121 | 
            -
            </span><span class="marked0"><a name="line500" /> 500 | 
| 1122 | 
            -
            </span><span class=" | 
| 1123 | 
            -
            </span><span class=" | 
| 1124 | 
            -
            </span><span class=" | 
| 1125 | 
            -
            </span><span class="marked0"><a name="line504" /> 504 | 
| 1126 | 
            -
            </span><span class="inferred1"><a name="line505" /> 505 | 
| 1127 | 
            -
            </span><span class="inferred0"><a name="line506" /> 506 | 
| 1128 | 
            -
            </span><span class=" | 
| 1129 | 
            -
            </span><span class=" | 
| 1130 | 
            -
            </span><span class=" | 
| 1131 | 
            -
            </span><span class=" | 
| 1132 | 
            -
            </span><span class=" | 
| 1133 | 
            -
            </span><span class=" | 
| 1134 | 
            -
            </span><span class="marked1"><a name="line513" /> 513 | 
| 1135 | 
            -
            </span><span class="marked0"><a name="line514" /> 514 | 
| 1136 | 
            -
            </span><span class=" | 
| 1137 | 
            -
            </span><span class=" | 
| 1138 | 
            -
            </span><span class=" | 
| 1139 | 
            -
            </span><span class="marked0"><a name="line518" /> 518          | 
| 1140 | 
            -
            </span><span class="inferred1"><a name="line519" /> 519 | 
| 1141 | 
            -
            </span><span class=" | 
| 1142 | 
            -
            </span><span class="inferred1"><a name="line521" /> 521 | 
| 1143 | 
            -
            </span><span class=" | 
| 1144 | 
            -
            </span><span class="marked1"><a name="line523" /> 523        | 
| 1145 | 
            -
            </span><span class="inferred0"><a name="line524" /> 524 | 
| 1146 | 
            -
            </span><span class="inferred1"><a name="line525" /> 525       #  | 
| 1147 | 
            -
            </span><span class="marked0"><a name="line526" /> 526        | 
| 1148 | 
            -
            </span><span class=" | 
| 1149 | 
            -
            </span><span class=" | 
| 1150 | 
            -
            </span><span class="inferred1"><a name="line529" /> 529 | 
| 1151 | 
            -
            </span><span class=" | 
| 1152 | 
            -
            </span><span class="marked1"><a name="line531" /> 531       @ | 
| 1153 | 
            -
            </span><span class="marked0"><a name="line532" /> 532 | 
| 1154 | 
            -
            </span><span class=" | 
| 1155 | 
            -
            </span><span class=" | 
| 1156 | 
            -
            </span><span class="marked1"><a name="line535" /> 535 | 
| 1157 | 
            -
            </span><span class=" | 
| 1158 | 
            -
            </span><span class=" | 
| 1159 | 
            -
            </span><span class=" | 
| 1160 | 
            -
            </span><span class=" | 
| 1161 | 
            -
            </span><span class="inferred0"><a name="line540" /> 540 | 
| 1162 | 
            -
            </span><span class=" | 
| 1163 | 
            -
            </span><span class="marked0"><a name="line542" /> 542       return  | 
| 1164 | 
            -
            </span><span class=" | 
| 1165 | 
            -
            </span><span class="inferred0"><a name="line544" /> 544 | 
| 1166 | 
            -
            </span><span class="inferred1"><a name="line545" /> 545     #  | 
| 1167 | 
            -
            </span><span class=" | 
| 1168 | 
            -
            </span><span class=" | 
| 1169 | 
            -
            </span><span class="marked0"><a name="line548" /> 548 | 
| 1170 | 
            -
            </span><span class=" | 
| 1171 | 
            -
            </span><span class=" | 
| 1172 | 
            -
            </span><span class=" | 
| 1173 | 
            -
            </span><span class=" | 
| 1174 | 
            -
            </span><span class="inferred1"><a name="line553" /> 553 | 
| 1175 | 
            -
            </span><span class="inferred0"><a name="line554" /> 554 | 
| 1176 | 
            -
            </span><span class=" | 
| 1177 | 
            -
            </span><span class="inferred0"><a name="line556" /> 556 | 
| 1178 | 
            -
            </span><span class="inferred1"><a name="line557" /> 557 | 
| 1179 | 
            -
            </span><span class=" | 
| 1180 | 
            -
            </span><span class="inferred1"><a name="line559" /> 559 | 
| 1181 | 
            -
            </span><span class="inferred0"><a name="line560" /> 560 | 
| 1182 | 
            -
            </span><span class="inferred1"><a name="line561" /> 561 | 
| 1183 | 
            -
            </span><span class=" | 
| 1184 | 
            -
            </span><span class=" | 
| 1185 | 
            -
            </span><span class=" | 
| 1186 | 
            -
            </span><span class=" | 
| 1187 | 
            -
            </span><span class="inferred0"><a name="line566" /> 566      | 
| 1188 | 
            -
            </span><span class=" | 
| 1189 | 
            -
            </span><span class=" | 
| 1190 | 
            -
            </span><span class="inferred1"><a name="line569" /> 569 | 
| 1191 | 
            -
            </span><span class="inferred0"><a name="line570" /> 570 | 
| 1192 | 
            -
            </span><span class="marked1"><a name="line571" /> 571 | 
| 1193 | 
            -
            </span><span class=" | 
| 1194 | 
            -
            </span><span class=" | 
| 1195 | 
            -
            </span><span class="marked0"><a name="line574" /> 574 | 
| 1196 | 
            -
            </span><span class="inferred1"><a name="line575" /> 575 | 
| 1197 | 
            -
            </span><span class=" | 
| 1198 | 
            -
            </span><span class="inferred1"><a name="line577" /> 577 | 
| 1199 | 
            -
            </span><span class="marked0"><a name="line578" /> 578 | 
| 1200 | 
            -
            </span><span class=" | 
| 1201 | 
            -
            </span><span class="marked0"><a name="line580" /> 580          | 
| 1202 | 
            -
            </span><span class="marked1"><a name="line581" /> 581          | 
| 1203 | 
            -
            </span><span class=" | 
| 1204 | 
            -
            </span><span class="marked1"><a name="line583" /> 583 | 
| 1205 | 
            -
            </span><span class="inferred0"><a name="line584" /> 584 | 
| 1206 | 
            -
            </span><span class=" | 
| 1207 | 
            -
            </span><span class="marked0"><a name="line586" /> 586 | 
| 1208 | 
            -
            </span><span class="marked1"><a name="line587" /> 587 | 
| 1209 | 
            -
            </span><span class=" | 
| 1210 | 
            -
            </span><span class=" | 
| 1211 | 
            -
            </span><span class=" | 
| 1212 | 
            -
            </span><span class="inferred1"><a name="line591" /> 591     
         | 
| 1213 | 
            -
            </span><span class="inferred0"><a name="line592" /> 592      | 
| 1214 | 
            -
            </span><span class=" | 
| 1215 | 
            -
            </span><span class="marked0"><a name="line594" /> 594 | 
| 1216 | 
            -
            </span><span class="marked1"><a name="line595" /> 595       if  | 
| 1217 | 
            -
            </span><span class="marked0"><a name="line596" /> 596          | 
| 1218 | 
            -
            </span><span class=" | 
| 1219 | 
            -
            </span><span class="marked0"><a name="line598" /> 598 | 
| 1220 | 
            -
            </span><span class=" | 
| 1221 | 
            -
            </span><span class="inferred0"><a name="line600" /> 600 | 
| 1222 | 
            -
            </span><span class=" | 
| 1223 | 
            -
            </span><span class="inferred0"><a name="line602" /> 602 | 
| 1224 | 
            -
            </span><span class="marked1"><a name="line603" /> 603 | 
| 1225 | 
            -
            </span><span class=" | 
| 1226 | 
            -
            </span><span class=" | 
| 1227 | 
            -
            </span><span class=" | 
| 1228 | 
            -
            </span><span class="inferred1"><a name="line607" /> 607 | 
| 1229 | 
            -
            </span><span class=" | 
| 1230 | 
            -
            </span><span class="marked1"><a name="line609" /> 609        | 
| 1231 | 
            -
            </span><span class="marked0"><a name="line610" /> 610 | 
| 1232 | 
            -
            </span><span class=" | 
| 1233 | 
            -
            </span><span class="inferred0"><a name="line612" /> 612 | 
| 1234 | 
            -
            </span><span class="inferred1"><a name="line613" /> 613 | 
| 1235 | 
            -
            </span><span class="marked0"><a name="line614" /> 614 | 
| 1236 | 
            -
            </span><span class="marked1"><a name="line615" /> 615        | 
| 1237 | 
            -
            </span><span class=" | 
| 1238 | 
            -
            </span><span class="inferred1"><a name="line617" /> 617 | 
| 1239 | 
            -
            </span><span class=" | 
| 1240 | 
            -
            </span><span class="inferred1"><a name="line619" /> 619      | 
| 1241 | 
            -
            </span><span class="inferred0"><a name="line620" /> 620 | 
| 1242 | 
            -
            </span><span class="inferred1"><a name="line621" /> 621     #  | 
| 1243 | 
            -
            </span><span class=" | 
| 1244 | 
            -
            </span><span class=" | 
| 1245 | 
            -
            </span><span class="marked0"><a name="line624" /> 624 | 
| 1246 | 
            -
            </span><span class=" | 
| 1247 | 
            -
            </span><span class=" | 
| 1248 | 
            -
            </span><span class="inferred1"><a name="line627" /> 627 | 
| 1249 | 
            -
            </span><span class=" | 
| 1250 | 
            -
            </span><span class=" | 
| 1251 | 
            -
            </span><span class=" | 
| 1252 | 
            -
            </span><span class=" | 
| 1253 | 
            -
            </span><span class=" | 
| 1254 | 
            -
            </span><span class="marked1"><a name="line633" /> 633 | 
| 1255 | 
            -
            </span><span class=" | 
| 1256 | 
            -
            </span><span class=" | 
| 1257 | 
            -
            </span><span class="inferred0"><a name="line636" /> 636 | 
| 1258 | 
            -
            </span><span class="inferred1"><a name="line637" /> 637 | 
| 1259 | 
            -
            </span><span class=" | 
| 1260 | 
            -
            </span><span class=" | 
| 1261 | 
            -
            </span><span class=" | 
| 1262 | 
            -
            </span><span class="inferred1"><a name="line641" /> 641 | 
| 1263 | 
            -
            </span><span class="inferred0"><a name="line642" /> 642 | 
| 1264 | 
            -
            </span><span class=" | 
| 1265 | 
            -
            </span><span class=" | 
| 1266 | 
            -
            </span><span class=" | 
| 1267 | 
            -
            </span><span class="inferred0"><a name="line646" /> 646 | 
| 1268 | 
            -
            </span><span class="inferred1"><a name="line647" /> 647 | 
| 1269 | 
            -
            </span><span class="marked0"><a name="line648" /> 648 | 
| 1270 | 
            -
            </span><span class=" | 
| 1271 | 
            -
            </span><span class=" | 
| 1272 | 
            -
            </span><span class="inferred1"><a name="line651" /> 651      | 
| 1273 | 
            -
            </span><span class="inferred0"><a name="line652" /> 652     
         | 
| 1274 | 
            -
            </span><span class="inferred1"><a name="line653" /> 653     #  | 
| 1275 | 
            -
            </span><span class="marked0"><a name="line654" /> 654     def  | 
| 1276 | 
            -
            </span><span class="marked1"><a name="line655" /> 655        | 
| 1277 | 
            -
            </span><span class="marked0"><a name="line656" /> 656 | 
| 1278 | 
            -
            </span><span class=" | 
| 1279 | 
            -
            </span><span class="inferred0"><a name="line658" /> 658 | 
| 1280 | 
            -
            </span><span class="marked1"><a name="line659" /> 659 | 
| 1281 | 
            -
            </span><span class=" | 
| 1282 | 
            -
            </span><span class="marked1"><a name="line661" /> 661 | 
| 1283 | 
            -
            </span><span class="inferred0"><a name="line662" /> 662 | 
| 1284 | 
            -
            </span><span class=" | 
| 1285 | 
            -
            </span><span class="marked0"><a name="line664" /> 664 | 
| 1286 | 
            -
            </span><span class=" | 
| 1287 | 
            -
            </span><span class="marked0"><a name="line666" /> 666 | 
| 1288 | 
            -
            </span><span class="inferred1"><a name="line667" /> 667 | 
| 1289 | 
            -
            </span><span class=" | 
| 1290 | 
            -
            </span><span class="marked1"><a name="line669" /> 669 | 
| 1291 | 
            -
            </span><span class=" | 
| 1292 | 
            -
            </span><span class=" | 
| 1293 | 
            -
            </span><span class="marked0"><a name="line672" /> 672        | 
| 1294 | 
            -
            </span><span class=" | 
| 1295 | 
            -
            </span><span class=" | 
| 1296 | 
            -
            </span><span class=" | 
| 1297 | 
            -
            </span><span class="marked0"><a name="line676" /> 676 | 
| 1298 | 
            -
            </span><span class="marked1"><a name="line677" /> 677        | 
| 1299 | 
            -
            </span><span class="marked0"><a name="line678" /> 678        | 
| 1300 | 
            -
            </span><span class="marked1"><a name="line679" /> 679 | 
| 1301 | 
            -
            </span><span class="inferred0"><a name="line680" /> 680       
         | 
| 1302 | 
            -
            </span><span class=" | 
| 1303 | 
            -
            </span><span class=" | 
| 1304 | 
            -
            </span><span class=" | 
| 1305 | 
            -
            </span><span class=" | 
| 1306 | 
            -
            </span><span class=" | 
| 1307 | 
            -
            </span><span class="marked0"><a name="line686" /> 686 | 
| 1308 | 
            -
            </span><span class="marked1"><a name="line687" /> 687 | 
| 1309 | 
            -
            </span><span class="marked0"><a name="line688" /> 688 | 
| 1310 | 
            -
            </span><span class=" | 
| 1311 | 
            -
            </span><span class="inferred0"><a name="line690" /> 690 | 
| 1312 | 
            -
            </span><span class="marked1"><a name="line691" /> 691 | 
| 1313 | 
            -
            </span><span class="marked0"><a name="line692" /> 692 | 
| 1314 | 
            -
            </span><span class="marked1"><a name="line693" /> 693 | 
| 1315 | 
            -
            </span><span class=" | 
| 1316 | 
            -
            </span><span class=" | 
| 1317 | 
            -
            </span><span class=" | 
| 1318 | 
            -
            </span><span class="marked1"><a name="line697" /> 697 | 
| 1319 | 
            -
            </span><span class=" | 
| 1320 | 
            -
            </span><span class="marked1"><a name="line699" /> 699 | 
| 1321 | 
            -
            </span><span class=" | 
| 1322 | 
            -
            </span><span class=" | 
| 1323 | 
            -
            </span><span class=" | 
| 1324 | 
            -
            </span><span class="inferred1"><a name="line703" /> 703 | 
| 1325 | 
            -
            </span><span class=" | 
| 1326 | 
            -
            </span><span class=" | 
| 1327 | 
            -
            </span><span class=" | 
| 1328 | 
            -
            </span><span class="marked1"><a name="line707" /> 707 | 
| 1329 | 
            -
            </span><span class=" | 
| 1330 | 
            -
            </span><span class="inferred1"><a name="line709" /> 709 | 
| 1331 | 
            -
            </span><span class=" | 
| 1332 | 
            -
            </span><span class="marked1"><a name="line711" /> 711 | 
| 1333 | 
            -
            </span><span class="marked0"><a name="line712" /> 712 | 
| 1334 | 
            -
            </span><span class="marked1"><a name="line713" /> 713 | 
| 1335 | 
            -
            </span><span class="inferred0"><a name="line714" /> 714 | 
| 1336 | 
            -
            </span><span class=" | 
| 1337 | 
            -
            </span><span class=" | 
| 1338 | 
            -
            </span><span class="marked1"><a name="line717" /> 717 | 
| 1339 | 
            -
            </span><span class="marked0"><a name="line718" /> 718 | 
| 1340 | 
            -
            </span><span class=" | 
| 1341 | 
            -
            </span><span class=" | 
| 1342 | 
            -
            </span><span class=" | 
| 1343 | 
            -
            </span><span class="marked0"><a name="line722" /> 722 | 
| 1344 | 
            -
            </span><span class=" | 
| 1345 | 
            -
            </span><span class=" | 
| 1346 | 
            -
            </span><span class="inferred1"><a name="line725" /> 725 | 
| 1347 | 
            -
            </span><span class="marked0"><a name="line726" /> 726 | 
| 1348 | 
            -
            </span><span class=" | 
| 1349 | 
            -
            </span><span class=" | 
| 1350 | 
            -
            </span><span class="inferred1"><a name="line729" /> 729 | 
| 1351 | 
            -
            </span><span class="inferred0"><a name="line730" /> 730 | 
| 1352 | 
            -
            </span><span class=" | 
| 1353 | 
            -
            </span><span class=" | 
| 1354 | 
            -
            </span><span class=" | 
| 1355 | 
            -
            </span><span class="inferred0"><a name="line734" /> 734 | 
| 1356 | 
            -
            </span><span class=" | 
| 1357 | 
            -
            </span><span class="inferred0"><a name="line736" /> 736      | 
| 1358 | 
            -
            </span><span class=" | 
| 1359 | 
            -
            </span><span class=" | 
| 1360 | 
            -
            </span><span class="marked1"><a name="line739" /> 739      | 
| 1361 | 
            -
            </span><span class=" | 
| 1362 | 
            -
            </span><span class=" | 
| 1363 | 
            -
            </span><span class=" | 
| 1364 | 
            -
            </span><span class=" | 
| 1365 | 
            -
            </span><span class="marked0"><a name="line744" /> 744      | 
| 1366 | 
            -
            </span><span class=" | 
| 1367 | 
            -
            </span><span class=" | 
| 1368 | 
            -
            </span><span class=" | 
| 1369 | 
            -
            </span><span class=" | 
| 1370 | 
            -
            </span><span class=" | 
| 1371 | 
            -
            </span><span class="inferred0"><a name="line750" /> 750 | 
| 1372 | 
            -
            </span><span class="marked1"><a name="line751" /> 751 | 
| 1373 | 
            -
            </span><span class="marked0"><a name="line752" /> 752 | 
| 1374 | 
            -
            </span><span class=" | 
| 1375 | 
            -
            </span><span class=" | 
| 1376 | 
            -
            </span><span class="marked1"><a name="line755" /> 755        | 
| 1377 | 
            -
            </span><span class="marked0"><a name="line756" /> 756 | 
| 1378 | 
            -
            </span><span class=" | 
| 1379 | 
            -
            </span><span class="marked0"><a name="line758" /> 758        | 
| 1380 | 
            -
            </span><span class="marked1"><a name="line759" /> 759 | 
| 1381 | 
            -
            </span><span class=" | 
| 1382 | 
            -
            </span><span class="marked1"><a name="line761" /> 761        | 
| 1383 | 
            -
            </span><span class="marked0"><a name="line762" /> 762 | 
| 1384 | 
            -
            </span><span class="inferred1"><a name="line763" /> 763        | 
| 1385 | 
            -
            </span><span class=" | 
| 1386 | 
            -
            </span><span class="marked1"><a name="line765" /> 765       if  | 
| 1387 | 
            -
            </span><span class="marked0"><a name="line766" /> 766          | 
| 1388 | 
            -
            </span><span class="marked1"><a name="line767" /> 767          | 
| 1389 | 
            -
            </span><span class="marked0"><a name="line768" /> 768 | 
| 1390 | 
            -
            </span><span class="marked1"><a name="line769" /> 769 | 
| 1391 | 
            -
            </span><span class="marked0"><a name="line770" /> 770 | 
| 1392 | 
            -
            </span><span class="marked1"><a name="line771" /> 771 | 
| 1393 | 
            -
            </span><span class="marked0"><a name="line772" /> 772 | 
| 1394 | 
            -
            </span><span class=" | 
| 1395 | 
            -
            </span><span class="marked0"><a name="line774" /> 774 | 
| 1396 | 
            -
            </span><span class="marked1"><a name="line775" /> 775 | 
| 1397 | 
            -
            </span><span class=" | 
| 1398 | 
            -
            </span><span class=" | 
| 1399 | 
            -
            </span><span class=" | 
| 1400 | 
            -
            </span><span class=" | 
| 1401 | 
            -
            </span><span class=" | 
| 1402 | 
            -
            </span><span class=" | 
| 1403 | 
            -
            </span><span class="marked0"><a name="line782" /> 782 | 
| 1404 | 
            -
            </span><span class=" | 
| 1405 | 
            -
            </span><span class="marked0"><a name="line784" /> 784 | 
| 1406 | 
            -
            </span><span class=" | 
| 1407 | 
            -
            </span><span class="inferred0"><a name="line786" /> 786 | 
| 1408 | 
            -
            </span><span class=" | 
| 1409 | 
            -
            </span><span class="inferred0"><a name="line788" /> 788 | 
| 1410 | 
            -
            </span><span class="inferred1"><a name="line789" /> 789 | 
| 1411 | 
            -
            </span><span class=" | 
| 1412 | 
            -
            </span><span class=" | 
| 1413 | 
            -
            </span><span class="inferred0"><a name="line792" /> 792 | 
| 1414 | 
            -
            </span><span class="marked1"><a name="line793" /> 793 | 
| 1415 | 
            -
            </span><span class=" | 
| 1416 | 
            -
            </span><span class=" | 
| 1417 | 
            -
            </span><span class=" | 
| 1418 | 
            -
            </span><span class="inferred1"><a name="line797" /> 797 | 
| 1419 | 
            -
            </span><span class=" | 
| 1420 | 
            -
            </span><span class=" | 
| 1421 | 
            -
            </span><span class="marked0"><a name="line800" /> 800 | 
| 1422 | 
            -
            </span><span class="marked1"><a name="line801" /> 801 | 
| 1423 | 
            -
            </span><span class=" | 
| 1424 | 
            -
            </span><span class=" | 
| 1425 | 
            -
            </span><span class="inferred0"><a name="line804" /> 804 | 
| 1426 | 
            -
            </span><span class=" | 
| 1427 | 
            -
            </span><span class="inferred0"><a name="line806" /> 806 | 
| 1428 | 
            -
            </span><span class=" | 
| 1429 | 
            -
            </span><span class="inferred0"><a name="line808" /> 808 | 
| 1430 | 
            -
            </span><span class=" | 
| 1431 | 
            -
            </span><span class="inferred0"><a name="line810" /> 810 | 
| 1432 | 
            -
            </span><span class=" | 
| 1433 | 
            -
            </span><span class=" | 
| 1434 | 
            -
            </span><span class=" | 
| 1435 | 
            -
            </span><span class=" | 
| 1436 | 
            -
            </span><span class=" | 
| 1437 | 
            -
            </span><span class=" | 
| 1438 | 
            -
            </span><span class=" | 
| 1439 | 
            -
            </span><span class="marked0"><a name="line818" /> 818 | 
| 1440 | 
            -
            </span><span class="inferred1"><a name="line819" /> 819 | 
| 1441 | 
            -
            </span><span class="inferred0"><a name="line820" /> 820 | 
| 1442 | 
            -
            </span><span class=" | 
| 1443 | 
            -
            </span><span class="marked0"><a name="line822" /> 822 | 
| 1444 | 
            -
            </span><span class="marked1"><a name="line823" /> 823        | 
| 1445 | 
            -
            </span><span class="marked0"><a name="line824" /> 824 | 
| 1446 | 
            -
            </span><span class=" | 
| 1447 | 
            -
            </span><span class=" | 
| 1448 | 
            -
            </span><span class="marked1"><a name="line827" /> 827 | 
| 1449 | 
            -
            </span><span class="marked0"><a name="line828" /> 828 | 
| 1450 | 
            -
            </span><span class="marked1"><a name="line829" /> 829 | 
| 1451 | 
            -
            </span><span class="inferred0"><a name="line830" /> 830 | 
| 1452 | 
            -
            </span><span class=" | 
| 1453 | 
            -
            </span><span class="inferred0"><a name="line832" /> 832 | 
| 1454 | 
            -
            </span><span class="inferred1"><a name="line833" /> 833 | 
| 1455 | 
            -
            </span><span class=" | 
| 1456 | 
            -
            </span><span class="marked1"><a name="line835" /> 835        | 
| 1457 | 
            -
            </span><span class="marked0"><a name="line836" /> 836        | 
| 1458 | 
            -
            </span><span class="marked1"><a name="line837" /> 837 | 
| 1459 | 
            -
            </span><span class=" | 
| 1460 | 
            -
            </span><span class="marked1"><a name="line839" /> 839 | 
| 1461 | 
            -
            </span><span class=" | 
| 1462 | 
            -
            </span><span class=" | 
| 1463 | 
            -
            </span><span class="marked0"><a name="line842" /> 842 | 
| 1464 | 
            -
            </span><span class="inferred1"><a name="line843" /> 843 | 
| 1465 | 
            -
            </span><span class="marked0"><a name="line844" /> 844 | 
| 1466 | 
            -
            </span><span class=" | 
| 1467 | 
            -
            </span><span class=" | 
| 1468 | 
            -
            </span><span class="marked1"><a name="line847" /> 847 | 
| 1469 | 
            -
            </span><span class=" | 
| 1470 | 
            -
            </span><span class="marked1"><a name="line849" /> 849 | 
| 1471 | 
            -
            </span><span class="marked0"><a name="line850" /> 850         if  | 
| 1472 | 
            -
            </span><span class="marked1"><a name="line851" /> 851            | 
| 1473 | 
            -
            </span><span class=" | 
| 1474 | 
            -
            </span><span class=" | 
| 1475 | 
            -
            </span><span class=" | 
| 1476 | 
            -
            </span><span class="marked1"><a name="line855" /> 855 | 
| 1477 | 
            -
            </span><span class="marked0"><a name="line856" /> 856 | 
| 1478 | 
            -
            </span><span class=" | 
| 1479 | 
            -
            </span><span class="marked0"><a name="line858" /> 858 | 
| 1480 | 
            -
            </span><span class=" | 
| 1481 | 
            -
            </span><span class=" | 
| 1482 | 
            -
            </span><span class=" | 
| 1483 | 
            -
            </span><span class="inferred0"><a name="line862" /> 862 | 
| 1484 | 
            -
            </span><span class="inferred1"><a name="line863" /> 863 | 
| 1485 | 
            -
            </span><span class=" | 
| 1486 | 
            -
            </span><span class=" | 
| 1487 | 
            -
            </span><span class="inferred0"><a name="line866" /> 866 | 
| 1488 | 
            -
            </span><span class=" | 
| 1489 | 
            -
            </span><span class="inferred0"><a name="line868" /> 868 | 
| 1490 | 
            -
            </span><span class="inferred1"><a name="line869" /> 869 | 
| 1491 | 
            -
            </span><span class=" | 
| 1492 | 
            -
            </span><span class="inferred1"><a name="line871" /> 871 | 
| 1493 | 
            -
            </span><span class="inferred0"><a name="line872" /> 872 | 
| 1494 | 
            -
            </span><span class="inferred1"><a name="line873" /> 873 | 
| 1495 | 
            -
            </span><span class=" | 
| 1496 | 
            -
            </span><span class=" | 
| 1497 | 
            -
            </span><span class="marked0"><a name="line876" /> 876 | 
| 1498 | 
            -
            </span><span class="inferred1"><a name="line877" /> 877     
         | 
| 1499 | 
            -
            </span><span class="inferred0"><a name="line878" /> 878      | 
| 1500 | 
            -
            </span><span class="inferred1"><a name="line879" /> 879     #  | 
| 1501 | 
            -
            </span><span class="inferred0"><a name="line880" /> 880     #  | 
| 1502 | 
            -
            </span><span class=" | 
| 1503 | 
            -
            </span><span class="marked0"><a name="line882" /> 882 | 
| 1504 | 
            -
            </span><span class="marked1"><a name="line883" /> 883        | 
| 1505 | 
            -
            </span><span class="marked0"><a name="line884" /> 884 | 
| 1506 | 
            -
            </span><span class=" | 
| 1507 | 
            -
            </span><span class="inferred0"><a name="line886" /> 886 | 
| 1508 | 
            -
            </span><span class=" | 
| 1509 | 
            -
            </span><span class="inferred0"><a name="line888" /> 888 | 
| 1510 | 
            -
            </span><span class=" | 
| 1511 | 
            -
            </span><span class="inferred0"><a name="line890" /> 890      | 
| 1512 | 
            -
            </span><span class="inferred1"><a name="line891" /> 891     
         | 
| 1513 | 
            -
            </span><span class="inferred0"><a name="line892" /> 892     #  | 
| 1514 | 
            -
            </span><span class="inferred1"><a name="line893" /> 893     #  | 
| 1515 | 
            -
            </span><span class=" | 
| 1516 | 
            -
            </span><span class="marked1"><a name="line895" /> 895 | 
| 1517 | 
            -
            </span><span class="marked0"><a name="line896" /> 896        | 
| 1518 | 
            -
            </span><span class="marked1"><a name="line897" /> 897       if  | 
| 1519 | 
            -
            </span><span class="marked0"><a name="line898" /> 898 | 
| 1520 | 
            -
            </span><span class=" | 
| 1521 | 
            -
            </span><span class="marked0"><a name="line900" /> 900 | 
| 1522 | 
            -
            </span><span class="marked1"><a name="line901" /> 901 | 
| 1523 | 
            -
            </span><span class="inferred0"><a name="line902" /> 902          | 
| 1524 | 
            -
            </span><span class=" | 
| 1525 | 
            -
            </span><span class=" | 
| 1526 | 
            -
            </span><span class=" | 
| 1527 | 
            -
            </span><span class="marked0"><a name="line906" /> 906        | 
| 1528 | 
            -
            </span><span class=" | 
| 1529 | 
            -
            </span><span class=" | 
| 1530 | 
            -
            </span><span class=" | 
| 1531 | 
            -
            </span><span class=" | 
| 1532 | 
            -
            </span><span class="marked1"><a name="line911" /> 911 | 
| 1533 | 
            -
            </span><span class="marked0"><a name="line912" /> 912 | 
| 1534 | 
            -
            </span><span class=" | 
| 1535 | 
            -
            </span><span class=" | 
| 1536 | 
            -
            </span><span class="inferred1"><a name="line915" /> 915 | 
| 1537 | 
            -
            </span><span class="inferred0"><a name="line916" /> 916 | 
| 1538 | 
            -
            </span><span class="inferred1"><a name="line917" /> 917 | 
| 1539 | 
            -
            </span><span class="marked0"><a name="line918" /> 918 | 
| 1540 | 
            -
            </span><span class="marked1"><a name="line919" /> 919        | 
| 1541 | 
            -
            </span><span class="marked0"><a name="line920" /> 920 | 
| 1542 | 
            -
            </span><span class="inferred1"><a name="line921" /> 921 | 
| 1543 | 
            -
            </span><span class=" | 
| 1544 | 
            -
            </span><span class=" | 
| 1545 | 
            -
            </span><span class=" | 
| 1546 | 
            -
            </span><span class="marked1"><a name="line925" /> 925 | 
| 1547 | 
            -
            </span><span class=" | 
| 1548 | 
            -
            </span><span class="marked1"><a name="line927" /> 927 | 
| 1549 | 
            -
            </span><span class=" | 
| 1550 | 
            -
            </span><span class="marked1"><a name="line929" /> 929        | 
| 1551 | 
            -
            </span><span class="marked0"><a name="line930" /> 930 | 
| 1552 | 
            -
            </span><span class=" | 
| 1553 | 
            -
            </span><span class="marked0"><a name="line932" /> 932        | 
| 1554 | 
            -
            </span><span class="marked1"><a name="line933" /> 933 | 
| 1555 | 
            -
            </span><span class="marked0"><a name="line934" /> 934 | 
| 1556 | 
            -
            </span><span class=" | 
| 1557 | 
            -
            </span><span class=" | 
| 1558 | 
            -
            </span><span class=" | 
| 1559 | 
            -
            </span><span class="marked0"><a name="line938" /> 938        | 
| 1560 | 
            -
            </span><span class="marked1"><a name="line939" /> 939        | 
| 1561 | 
            -
            </span><span class=" | 
| 1562 | 
            -
            </span><span class=" | 
| 1563 | 
            -
            </span><span class=" | 
| 1564 | 
            -
            </span><span class=" | 
| 1565 | 
            -
            </span><span class=" | 
| 1566 | 
            -
            </span><span class="inferred1"><a name="line945" /> 945 | 
| 1567 | 
            -
            </span><span class="inferred0"><a name="line946" /> 946 | 
| 1568 | 
            -
            </span><span class="inferred1"><a name="line947" /> 947 | 
| 1569 | 
            -
            </span><span class="inferred0"><a name="line948" /> 948 | 
| 1570 | 
            -
            </span><span class="inferred1"><a name="line949" /> 949 | 
| 1571 | 
            -
            </span><span class=" | 
| 1572 | 
            -
            </span><span class=" | 
| 1573 | 
            -
            </span><span class=" | 
| 1574 | 
            -
            </span><span class=" | 
| 1575 | 
            -
            </span><span class="inferred0"><a name="line954" /> 954     
         | 
| 1576 | 
            -
            </span><span class="inferred1"><a name="line955" /> 955 | 
| 1577 | 
            -
            </span><span class=" | 
| 1578 | 
            -
            </span><span class="marked1"><a name="line957" /> 957 | 
| 1579 | 
            -
            </span><span class="marked0"><a name="line958" /> 958        | 
| 1580 | 
            -
            </span><span class="marked1"><a name="line959" /> 959 | 
| 1581 | 
            -
            </span><span class=" | 
| 1582 | 
            -
            </span><span class=" | 
| 1583 | 
            -
            </span><span class=" | 
| 1584 | 
            -
            </span><span class=" | 
| 1585 | 
            -
            </span><span class=" | 
| 1586 | 
            -
            </span><span class=" | 
| 1587 | 
            -
            </span><span class=" | 
| 1588 | 
            -
            </span><span class="marked1"><a name="line967" /> 967 | 
| 1589 | 
            -
            </span><span class=" | 
| 1590 | 
            -
            </span><span class=" | 
| 1591 | 
            -
            </span><span class="marked0"><a name="line970" /> 970          | 
| 1592 | 
            -
            </span><span class=" | 
| 1593 | 
            -
            </span><span class="marked0"><a name="line972" /> 972 | 
| 1594 | 
            -
            </span><span class=" | 
| 1595 | 
            -
            </span><span class=" | 
| 1596 | 
            -
            </span><span class=" | 
| 1597 | 
            -
            </span><span class=" | 
| 1598 | 
            -
            </span><span class=" | 
| 1599 | 
            -
            </span><span class="marked0"><a name="line978" /> 978      | 
| 1600 | 
            -
            </span><span class=" | 
| 1601 | 
            -
            </span><span class=" | 
| 1602 | 
            -
            </span><span class="marked1"><a name="line981" /> 981 | 
| 1603 | 
            -
            </span><span class=" | 
| 1604 | 
            -
            </span><span class="marked1"><a name="line983" /> 983 | 
| 1605 | 
            -
            </span><span class=" | 
| 1606 | 
            -
            </span><span class="inferred1"><a name="line985" /> 985 | 
| 1607 | 
            -
            </span><span class=" | 
| 1608 | 
            -
            </span><span class="inferred1"><a name="line987" /> 987 | 
| 1609 | 
            -
            </span><span class="inferred0"><a name="line988" /> 988 | 
| 1610 | 
            -
            </span><span class="marked1"><a name="line989" /> 989 | 
| 1611 | 
            -
            </span><span class="inferred0"><a name="line990" /> 990 | 
| 1612 | 
            -
            </span><span class=" | 
| 1613 | 
            -
            </span><span class=" | 
| 1614 | 
            -
            </span><span class=" | 
| 1615 | 
            -
            </span><span class="marked0"><a name="line994" /> 994 | 
| 1616 | 
            -
            </span><span class=" | 
| 1617 | 
            -
            </span><span class="marked0"><a name="line996" /> 996 | 
| 1618 | 
            -
            </span><span class="inferred1"><a name="line997" /> 997 | 
| 1619 | 
            -
            </span><span class="inferred0"><a name="line998" /> 998 | 
| 1620 | 
            -
            </span><span class="inferred1"><a name="line999" /> 999 | 
| 1621 | 
            -
            </span><span class="inferred0"><a name="line1000" />1000 | 
| 1622 | 
            -
            </span><span class=" | 
| 1623 | 
            -
            </span><span class=" | 
| 1624 | 
            -
            </span><span class="marked1"><a name="line1003" />1003        | 
| 1625 | 
            -
            </span><span class=" | 
| 1626 | 
            -
            </span><span class=" | 
| 1627 | 
            -
            </span><span class=" | 
| 1628 | 
            -
            </span><span class=" | 
| 1629 | 
            -
            </span><span class="marked0"><a name="line1008" />1008 | 
| 1630 | 
            -
            </span><span class=" | 
| 1631 | 
            -
            </span><span class=" | 
| 1632 | 
            -
            </span><span class=" | 
| 1633 | 
            -
            </span><span class=" | 
| 1634 | 
            -
            </span><span class=" | 
| 1635 | 
            -
            </span><span class="marked0"><a name="line1014" />1014 | 
| 1636 | 
            -
            </span><span class=" | 
| 1637 | 
            -
            </span><span class="marked0"><a name="line1016" />1016        | 
| 1638 | 
            -
            </span><span class="marked1"><a name="line1017" />1017 | 
| 1639 | 
            -
            </span><span class="marked0"><a name="line1018" />1018 | 
| 1640 | 
            -
            </span><span class="marked1"><a name="line1019" />1019 | 
| 1641 | 
            -
            </span><span class=" | 
| 1642 | 
            -
            </span><span class="marked1"><a name="line1021" />1021 | 
| 1643 | 
            -
            </span><span class=" | 
| 1644 | 
            -
            </span><span class="marked1"><a name="line1023" />1023 | 
| 1645 | 
            -
            </span><span class=" | 
| 1646 | 
            -
            </span><span class="inferred1"><a name="line1025" />1025 | 
| 1647 | 
            -
            </span><span class=" | 
| 1648 | 
            -
            </span><span class="inferred1"><a name="line1027" />1027 | 
| 1649 | 
            -
            </span><span class=" | 
| 1650 | 
            -
            </span><span class="inferred1"><a name="line1029" />1029          | 
| 1651 | 
            -
            </span><span class=" | 
| 1652 | 
            -
            </span><span class="inferred1"><a name="line1031" />1031 | 
| 1653 | 
            -
            </span><span class="inferred0"><a name="line1032" />1032 | 
| 1654 | 
            -
            </span><span class=" | 
| 1655 | 
            -
            </span><span class="marked0"><a name="line1034" />1034 | 
| 1656 | 
            -
            </span><span class=" | 
| 1657 | 
            -
            </span><span class=" | 
| 1658 | 
            -
            </span><span class=" | 
| 1659 | 
            -
            </span><span class=" | 
| 1660 | 
            -
            </span><span class="marked1"><a name="line1039" />1039 | 
| 1661 | 
            -
            </span><span class=" | 
| 1662 | 
            -
            </span><span class="marked1"><a name="line1041" />1041 | 
| 1663 | 
            -
            </span><span class="marked0"><a name="line1042" />1042 | 
| 1664 | 
            -
            </span><span class="marked1"><a name="line1043" />1043 | 
| 1665 | 
            -
            </span><span class="marked0"><a name="line1044" />1044 | 
| 1666 | 
            -
            </span><span class="marked1"><a name="line1045" />1045 | 
| 1667 | 
            -
            </span><span class="marked0"><a name="line1046" />1046 | 
| 1668 | 
            -
            </span><span class="inferred1"><a name="line1047" />1047 | 
| 1669 | 
            -
            </span><span class=" | 
| 1670 | 
            -
            </span><span class=" | 
| 1671 | 
            -
            </span><span class="marked0"><a name="line1050" />1050 | 
| 1672 | 
            -
            </span><span class="inferred1"><a name="line1051" />1051 | 
| 1673 | 
            -
            </span><span class="marked0"><a name="line1052" />1052          | 
| 1674 | 
            -
            </span><span class="marked1"><a name="line1053" />1053          | 
| 1675 | 
            -
            </span><span class="marked0"><a name="line1054" />1054 | 
| 1676 | 
            -
            </span><span class="marked1"><a name="line1055" />1055 | 
| 1677 | 
            -
            </span><span class=" | 
| 1678 | 
            -
            </span><span class=" | 
| 1679 | 
            -
            </span><span class=" | 
| 1680 | 
            -
            </span><span class="marked1"><a name="line1059" />1059 | 
| 1681 | 
            -
            </span><span class="marked0"><a name="line1060" />1060        | 
| 1682 | 
            -
            </span><span class="marked1"><a name="line1061" />1061 | 
| 1683 | 
            -
            </span><span class=" | 
| 1684 | 
            -
            </span><span class=" | 
| 1685 | 
            -
            </span><span class=" | 
| 1686 | 
            -
            </span><span class="marked1"><a name="line1065" />1065        | 
| 1687 | 
            -
            </span><span class="marked0"><a name="line1066" />1066 | 
| 1688 | 
            -
            </span><span class=" | 
| 1689 | 
            -
            </span><span class=" | 
| 1690 | 
            -
            </span><span class="inferred1"><a name="line1069" />1069 | 
| 1691 | 
            -
            </span><span class="inferred0"><a name="line1070" />1070 | 
| 1692 | 
            -
            </span><span class="inferred1"><a name="line1071" />1071      | 
| 1693 | 
            -
            </span><span class=" | 
| 1694 | 
            -
            </span><span class="inferred1"><a name="line1073" />1073 | 
| 1695 | 
            -
            </span><span class=" | 
| 1696 | 
            -
            </span><span class="marked1"><a name="line1075" />1075 | 
| 1697 | 
            -
            </span><span class=" | 
| 1698 | 
            -
            </span><span class="marked1"><a name="line1077" />1077 | 
| 1699 | 
            -
            </span><span class=" | 
| 1700 | 
            -
            </span><span class=" | 
| 1701 | 
            -
            </span><span class=" | 
| 1702 | 
            -
            </span><span class=" | 
| 1703 | 
            -
            </span><span class=" | 
| 1704 | 
            -
            </span><span class=" | 
| 1705 | 
            -
            </span><span class=" | 
| 1706 | 
            -
            </span><span class=" | 
| 1707 | 
            -
            </span><span class="marked0"><a name="line1086" />1086        | 
| 1708 | 
            -
            </span><span class="marked1"><a name="line1087" />1087 | 
| 1709 | 
            -
            </span><span class="marked0"><a name="line1088" />1088 | 
| 1710 | 
            -
            </span><span class="marked1"><a name="line1089" />1089 | 
| 1711 | 
            -
            </span><span class="inferred0"><a name="line1090" />1090 | 
| 1712 | 
            -
            </span><span class=" | 
| 1713 | 
            -
            </span><span class="inferred0"><a name="line1092" />1092  | 
| 791 | 
            +
            </span><span class="inferred0"><a name="line170" /> 170     #    
         | 
| 792 | 
            +
            </span><span class="inferred1"><a name="line171" /> 171     #    def self.transform(name, value)
         | 
| 793 | 
            +
            </span><span class="inferred0"><a name="line172" /> 172     #      return value.gsub(/ /, "+") if name == "query"
         | 
| 794 | 
            +
            </span><span class="inferred1"><a name="line173" /> 173     #      return value
         | 
| 795 | 
            +
            </span><span class="inferred0"><a name="line174" /> 174     #    end
         | 
| 796 | 
            +
            </span><span class="inferred1"><a name="line175" /> 175     #  end
         | 
| 797 | 
            +
            </span><span class="inferred0"><a name="line176" /> 176     # 
         | 
| 798 | 
            +
            </span><span class="inferred1"><a name="line177" /> 177     #  Addressable::URI.expand_template(
         | 
| 799 | 
            +
            </span><span class="inferred0"><a name="line178" /> 178     #    "http://example.com/search/{query}/",
         | 
| 800 | 
            +
            </span><span class="inferred1"><a name="line179" /> 179     #    {"query" => "an example search query"},
         | 
| 801 | 
            +
            </span><span class="inferred0"><a name="line180" /> 180     #    ExampleProcessor).to_s
         | 
| 802 | 
            +
            </span><span class="inferred1"><a name="line181" /> 181     #  => "http://example.com/search/an+example+search+query/"
         | 
| 803 | 
            +
            </span><span class="marked0"><a name="line182" /> 182     def self.expand_template(pattern, mapping, processor=nil)
         | 
| 804 | 
            +
            </span><span class="marked1"><a name="line183" /> 183       result = pattern.dup
         | 
| 805 | 
            +
            </span><span class="marked0"><a name="line184" /> 184       for name, value in mapping
         | 
| 806 | 
            +
            </span><span class="marked1"><a name="line185" /> 185         transformed_value = value
         | 
| 807 | 
            +
            </span><span class="marked0"><a name="line186" /> 186         if processor != nil
         | 
| 808 | 
            +
            </span><span class="marked1"><a name="line187" /> 187           if processor.respond_to?(:validate)
         | 
| 809 | 
            +
            </span><span class="marked0"><a name="line188" /> 188             if !processor.validate(name, value)
         | 
| 810 | 
            +
            </span><span class="marked1"><a name="line189" /> 189               raise InvalidTemplateValue,
         | 
| 811 | 
            +
            </span><span class="inferred0"><a name="line190" /> 190                 "(#{name}, #{value}) is an invalid template value."
         | 
| 812 | 
            +
            </span><span class="inferred1"><a name="line191" /> 191             end
         | 
| 813 | 
            +
            </span><span class="inferred0"><a name="line192" /> 192           end
         | 
| 814 | 
            +
            </span><span class="marked1"><a name="line193" /> 193           if processor.respond_to?(:transform)
         | 
| 815 | 
            +
            </span><span class="marked0"><a name="line194" /> 194             transformed_value = processor.transform(name, value)
         | 
| 816 | 
            +
            </span><span class="inferred1"><a name="line195" /> 195           end
         | 
| 817 | 
            +
            </span><span class="inferred0"><a name="line196" /> 196         end
         | 
| 818 | 
            +
            </span><span class="inferred1"><a name="line197" /> 197 
         | 
| 819 | 
            +
            </span><span class="inferred0"><a name="line198" /> 198         # Handle percent escaping
         | 
| 820 | 
            +
            </span><span class="marked1"><a name="line199" /> 199         transformed_value = self.encode_segment(transformed_value,
         | 
| 821 | 
            +
            </span><span class="inferred0"><a name="line200" /> 200           Addressable::URI::CharacterClasses::RESERVED +
         | 
| 822 | 
            +
            </span><span class="inferred1"><a name="line201" /> 201           Addressable::URI::CharacterClasses::UNRESERVED)
         | 
| 823 | 
            +
            </span><span class="inferred0"><a name="line202" /> 202         
         | 
| 824 | 
            +
            </span><span class="marked1"><a name="line203" /> 203         result.gsub!(/\{#{Regexp.escape(name)}\}/, transformed_value)
         | 
| 825 | 
            +
            </span><span class="inferred0"><a name="line204" /> 204       end
         | 
| 826 | 
            +
            </span><span class="marked1"><a name="line205" /> 205       result.gsub!(
         | 
| 827 | 
            +
            </span><span class="inferred0"><a name="line206" /> 206         /\{[#{Addressable::URI::CharacterClasses::UNRESERVED}]+\}/, "")
         | 
| 828 | 
            +
            </span><span class="marked1"><a name="line207" /> 207       return Addressable::URI.parse(result)
         | 
| 829 | 
            +
            </span><span class="inferred0"><a name="line208" /> 208     end
         | 
| 830 | 
            +
            </span><span class="inferred1"><a name="line209" /> 209     
         | 
| 831 | 
            +
            </span><span class="inferred0"><a name="line210" /> 210     # Extracts a mapping from the URI using a URI Template pattern.
         | 
| 832 | 
            +
            </span><span class="inferred1"><a name="line211" /> 211     # Returns nil if the pattern doesn't match the URI.
         | 
| 833 | 
            +
            </span><span class="inferred0"><a name="line212" /> 212     #
         | 
| 834 | 
            +
            </span><span class="inferred1"><a name="line213" /> 213     # An optional processor object may be supplied.  The object should
         | 
| 835 | 
            +
            </span><span class="inferred0"><a name="line214" /> 214     # respond to either the :restore or :match messages or both.
         | 
| 836 | 
            +
            </span><span class="inferred1"><a name="line215" /> 215     # The :restore method should take two parameters: :name and :value.
         | 
| 837 | 
            +
            </span><span class="inferred0"><a name="line216" /> 216     # The :restore method should reverse any transformations that have been
         | 
| 838 | 
            +
            </span><span class="inferred1"><a name="line217" /> 217     # performed on the value to ensure a valid URI.  The :match method
         | 
| 839 | 
            +
            </span><span class="inferred0"><a name="line218" /> 218     # should take a single parameter: :name.  The :match method should
         | 
| 840 | 
            +
            </span><span class="inferred1"><a name="line219" /> 219     # return a String containing a regular expression capture group for
         | 
| 841 | 
            +
            </span><span class="inferred0"><a name="line220" /> 220     # matching on that particular variable.  The default value is ".*".
         | 
| 842 | 
            +
            </span><span class="inferred1"><a name="line221" /> 221     #
         | 
| 843 | 
            +
            </span><span class="inferred0"><a name="line222" /> 222     # An example:
         | 
| 844 | 
            +
            </span><span class="inferred1"><a name="line223" /> 223     #    
         | 
| 845 | 
            +
            </span><span class="inferred0"><a name="line224" /> 224     #  class ExampleProcessor
         | 
| 846 | 
            +
            </span><span class="inferred1"><a name="line225" /> 225     #    def self.restore(name, value)
         | 
| 847 | 
            +
            </span><span class="inferred0"><a name="line226" /> 226     #      return value.gsub(/\+/, " ") if name == "query"
         | 
| 848 | 
            +
            </span><span class="inferred1"><a name="line227" /> 227     #      return value
         | 
| 849 | 
            +
            </span><span class="inferred0"><a name="line228" /> 228     #    end
         | 
| 850 | 
            +
            </span><span class="inferred1"><a name="line229" /> 229     #
         | 
| 851 | 
            +
            </span><span class="inferred0"><a name="line230" /> 230     #    def self.match(name)
         | 
| 852 | 
            +
            </span><span class="inferred1"><a name="line231" /> 231     #      return ".*?" if name == "first"
         | 
| 853 | 
            +
            </span><span class="inferred0"><a name="line232" /> 232     #      return ".*"
         | 
| 854 | 
            +
            </span><span class="inferred1"><a name="line233" /> 233     #    end
         | 
| 855 | 
            +
            </span><span class="inferred0"><a name="line234" /> 234     #  end
         | 
| 856 | 
            +
            </span><span class="inferred1"><a name="line235" /> 235     #  
         | 
| 857 | 
            +
            </span><span class="inferred0"><a name="line236" /> 236     #  uri = Addressable::URI.parse(
         | 
| 858 | 
            +
            </span><span class="inferred1"><a name="line237" /> 237     #    "http://example.com/search/an+example+search+query/")
         | 
| 859 | 
            +
            </span><span class="inferred0"><a name="line238" /> 238     #  uri.extract_mapping("http://example.com/search/{query}/",
         | 
| 860 | 
            +
            </span><span class="inferred1"><a name="line239" /> 239     #    ExampleProcessor)
         | 
| 861 | 
            +
            </span><span class="inferred0"><a name="line240" /> 240     #  => {"query" => "an example search query"}
         | 
| 862 | 
            +
            </span><span class="inferred1"><a name="line241" /> 241     #  
         | 
| 863 | 
            +
            </span><span class="inferred0"><a name="line242" /> 242     #  uri = Addressable::URI.parse(
         | 
| 864 | 
            +
            </span><span class="inferred1"><a name="line243" /> 243     #    "http://example.com/a/b/c/")
         | 
| 865 | 
            +
            </span><span class="inferred0"><a name="line244" /> 244     #  uri.extract_mapping("http://example.com/{first}/{second}/",
         | 
| 866 | 
            +
            </span><span class="inferred1"><a name="line245" /> 245     #    ExampleProcessor)
         | 
| 867 | 
            +
            </span><span class="inferred0"><a name="line246" /> 246     #  => {"first" => "a", "second" => "b/c"}
         | 
| 868 | 
            +
            </span><span class="marked1"><a name="line247" /> 247     def extract_mapping(pattern, processor=nil)
         | 
| 869 | 
            +
            </span><span class="marked0"><a name="line248" /> 248       mapping = {}
         | 
| 870 | 
            +
            </span><span class="marked1"><a name="line249" /> 249       variable_regexp =
         | 
| 871 | 
            +
            </span><span class="inferred0"><a name="line250" /> 250         /\{([#{Addressable::URI::CharacterClasses::UNRESERVED}]+)\}/
         | 
| 872 | 
            +
            </span><span class="marked1"><a name="line251" /> 251       variables = pattern.scan(variable_regexp).flatten
         | 
| 873 | 
            +
            </span><span class="marked0"><a name="line252" /> 252       variables.each { |v| mapping[v] = "" }
         | 
| 874 | 
            +
            </span><span class="marked1"><a name="line253" /> 253       escaped_pattern =
         | 
| 875 | 
            +
            </span><span class="inferred0"><a name="line254" /> 254         Regexp.escape(pattern).gsub(/\\\{/, "{").gsub(/\\\}/, "}")
         | 
| 876 | 
            +
            </span><span class="marked1"><a name="line255" /> 255       regexp = Regexp.new(escaped_pattern.gsub(variable_regexp) do |v|
         | 
| 877 | 
            +
            </span><span class="marked0"><a name="line256" /> 256         capture_group = "(.*)"
         | 
| 878 | 
            +
            </span><span class="inferred1"><a name="line257" /> 257         
         | 
| 879 | 
            +
            </span><span class="marked0"><a name="line258" /> 258         if processor != nil
         | 
| 880 | 
            +
            </span><span class="marked1"><a name="line259" /> 259           if processor.respond_to?(:match)
         | 
| 881 | 
            +
            </span><span class="marked0"><a name="line260" /> 260             name = v.scan(variable_regexp).flatten[0]
         | 
| 882 | 
            +
            </span><span class="marked1"><a name="line261" /> 261             capture_group = "(#{processor.match(name)})"
         | 
| 883 | 
            +
            </span><span class="inferred0"><a name="line262" /> 262           end
         | 
| 884 | 
            +
            </span><span class="inferred1"><a name="line263" /> 263         end
         | 
| 885 | 
            +
            </span><span class="inferred0"><a name="line264" /> 264         
         | 
| 886 | 
            +
            </span><span class="marked1"><a name="line265" /> 265         capture_group
         | 
| 887 | 
            +
            </span><span class="inferred0"><a name="line266" /> 266       end)
         | 
| 888 | 
            +
            </span><span class="marked1"><a name="line267" /> 267       values = self.to_s.scan(regexp).flatten
         | 
| 889 | 
            +
            </span><span class="marked0"><a name="line268" /> 268       if variables.size == values.size
         | 
| 890 | 
            +
            </span><span class="marked1"><a name="line269" /> 269         for i in 0...variables.size
         | 
| 891 | 
            +
            </span><span class="marked0"><a name="line270" /> 270           name = variables[i]
         | 
| 892 | 
            +
            </span><span class="marked1"><a name="line271" /> 271           value = values[i]
         | 
| 893 | 
            +
            </span><span class="inferred0"><a name="line272" /> 272           
         | 
| 894 | 
            +
            </span><span class="marked1"><a name="line273" /> 273           if processor != nil
         | 
| 895 | 
            +
            </span><span class="marked0"><a name="line274" /> 274             if processor.respond_to?(:restore)
         | 
| 896 | 
            +
            </span><span class="marked1"><a name="line275" /> 275               value = processor.restore(name, value)
         | 
| 897 | 
            +
            </span><span class="inferred0"><a name="line276" /> 276             end
         | 
| 898 | 
            +
            </span><span class="inferred1"><a name="line277" /> 277           end
         | 
| 899 | 
            +
            </span><span class="inferred0"><a name="line278" /> 278           
         | 
| 900 | 
            +
            </span><span class="marked1"><a name="line279" /> 279           mapping[name] = value
         | 
| 901 | 
            +
            </span><span class="inferred0"><a name="line280" /> 280         end
         | 
| 902 | 
            +
            </span><span class="marked1"><a name="line281" /> 281         return mapping
         | 
| 903 | 
            +
            </span><span class="inferred0"><a name="line282" /> 282       else
         | 
| 904 | 
            +
            </span><span class="marked1"><a name="line283" /> 283         return nil
         | 
| 905 | 
            +
            </span><span class="inferred0"><a name="line284" /> 284       end
         | 
| 906 | 
            +
            </span><span class="inferred1"><a name="line285" /> 285     end
         | 
| 907 | 
            +
            </span><span class="inferred0"><a name="line286" /> 286     
         | 
| 908 | 
            +
            </span><span class="inferred1"><a name="line287" /> 287     # Joins several uris together.
         | 
| 909 | 
            +
            </span><span class="marked0"><a name="line288" /> 288     def self.join(*uris)
         | 
| 910 | 
            +
            </span><span class="marked1"><a name="line289" /> 289       uri_objects = uris.collect do |uri|
         | 
| 911 | 
            +
            </span><span class="marked0"><a name="line290" /> 290         uri.kind_of?(self) ? uri : self.parse(uri.to_s)
         | 
| 912 | 
            +
            </span><span class="inferred1"><a name="line291" /> 291       end
         | 
| 913 | 
            +
            </span><span class="marked0"><a name="line292" /> 292       result = uri_objects.shift.dup
         | 
| 914 | 
            +
            </span><span class="marked1"><a name="line293" /> 293       for uri in uri_objects
         | 
| 915 | 
            +
            </span><span class="marked0"><a name="line294" /> 294         result.merge!(uri)
         | 
| 916 | 
            +
            </span><span class="inferred1"><a name="line295" /> 295       end
         | 
| 917 | 
            +
            </span><span class="marked0"><a name="line296" /> 296       return result
         | 
| 918 | 
            +
            </span><span class="inferred1"><a name="line297" /> 297     end
         | 
| 919 | 
            +
            </span><span class="inferred0"><a name="line298" /> 298     
         | 
| 920 | 
            +
            </span><span class="inferred1"><a name="line299" /> 299     # Percent encodes a URI segment.  Returns a string.  Takes an optional
         | 
| 921 | 
            +
            </span><span class="inferred0"><a name="line300" /> 300     # character class parameter, which should be specified as a string
         | 
| 922 | 
            +
            </span><span class="inferred1"><a name="line301" /> 301     # containing a regular expression character class (not including the
         | 
| 923 | 
            +
            </span><span class="inferred0"><a name="line302" /> 302     # surrounding square brackets).  The character class parameter defaults
         | 
| 924 | 
            +
            </span><span class="inferred1"><a name="line303" /> 303     # to the reserved plus unreserved character classes specified in
         | 
| 925 | 
            +
            </span><span class="inferred0"><a name="line304" /> 304     # RFC 3986.  Usage of the constants within the CharacterClasses module is
         | 
| 926 | 
            +
            </span><span class="inferred1"><a name="line305" /> 305     # highly recommended when using this method.
         | 
| 927 | 
            +
            </span><span class="inferred0"><a name="line306" /> 306     #
         | 
| 928 | 
            +
            </span><span class="inferred1"><a name="line307" /> 307     # An example:
         | 
| 929 | 
            +
            </span><span class="inferred0"><a name="line308" /> 308     #
         | 
| 930 | 
            +
            </span><span class="inferred1"><a name="line309" /> 309     #  Addressable::URI.escape_segment("simple-example", "b-zB-Z0-9")
         | 
| 931 | 
            +
            </span><span class="inferred0"><a name="line310" /> 310     #  => "simple%2Dex%61mple"
         | 
| 932 | 
            +
            </span><span class="marked1"><a name="line311" /> 311     def self.encode_segment(segment, character_class=
         | 
| 933 | 
            +
            </span><span class="inferred0"><a name="line312" /> 312         Addressable::URI::CharacterClasses::RESERVED +
         | 
| 934 | 
            +
            </span><span class="marked1"><a name="line313" /> 313         Addressable::URI::CharacterClasses::UNRESERVED)
         | 
| 935 | 
            +
            </span><span class="marked0"><a name="line314" /> 314       return nil if segment.nil?
         | 
| 936 | 
            +
            </span><span class="inferred1"><a name="line315" /> 315       return segment.gsub(
         | 
| 937 | 
            +
            </span><span class="inferred0"><a name="line316" /> 316         /[^#{character_class}]/
         | 
| 938 | 
            +
            </span><span class="inferred1"><a name="line317" /> 317       ) do |sequence|
         | 
| 939 | 
            +
            </span><span class="marked0"><a name="line318" /> 318         ("%" + sequence.unpack('C')[0].to_s(16).upcase)
         | 
| 940 | 
            +
            </span><span class="marked1"><a name="line319" /> 319       end      
         | 
| 941 | 
            +
            </span><span class="inferred0"><a name="line320" /> 320     end
         | 
| 942 | 
            +
            </span><span class="inferred1"><a name="line321" /> 321     
         | 
| 943 | 
            +
            </span><span class="inferred0"><a name="line322" /> 322     # Unencodes any percent encoded characters within a URI segment.
         | 
| 944 | 
            +
            </span><span class="inferred1"><a name="line323" /> 323     # Returns a string.
         | 
| 945 | 
            +
            </span><span class="marked0"><a name="line324" /> 324     def self.unencode_segment(segment)
         | 
| 946 | 
            +
            </span><span class="marked1"><a name="line325" /> 325       return nil if segment.nil?
         | 
| 947 | 
            +
            </span><span class="inferred0"><a name="line326" /> 326       return segment.to_s.gsub(/%[0-9a-f]{2}/i) do |sequence|
         | 
| 948 | 
            +
            </span><span class="marked1"><a name="line327" /> 327         sequence[1..3].to_i(16).chr
         | 
| 949 | 
            +
            </span><span class="marked0"><a name="line328" /> 328       end
         | 
| 950 | 
            +
            </span><span class="inferred1"><a name="line329" /> 329     end
         | 
| 951 | 
            +
            </span><span class="inferred0"><a name="line330" /> 330     
         | 
| 952 | 
            +
            </span><span class="inferred1"><a name="line331" /> 331     # Percent encodes any special characters in the URI.  This method does
         | 
| 953 | 
            +
            </span><span class="inferred0"><a name="line332" /> 332     # not take IRIs or IDNs into account.
         | 
| 954 | 
            +
            </span><span class="marked1"><a name="line333" /> 333     def self.encode(uri)
         | 
| 955 | 
            +
            </span><span class="marked0"><a name="line334" /> 334       uri_object = uri.kind_of?(self) ? uri : self.parse(uri.to_s)
         | 
| 956 | 
            +
            </span><span class="marked1"><a name="line335" /> 335       return Addressable::URI.new(
         | 
| 957 | 
            +
            </span><span class="marked0"><a name="line336" /> 336         self.encode_segment(uri_object.scheme,
         | 
| 958 | 
            +
            </span><span class="inferred1"><a name="line337" /> 337           Addressable::URI::CharacterClasses::SCHEME),
         | 
| 959 | 
            +
            </span><span class="marked0"><a name="line338" /> 338         self.encode_segment(uri_object.user,
         | 
| 960 | 
            +
            </span><span class="inferred1"><a name="line339" /> 339           Addressable::URI::CharacterClasses::AUTHORITY),
         | 
| 961 | 
            +
            </span><span class="marked0"><a name="line340" /> 340         self.encode_segment(uri_object.password,
         | 
| 962 | 
            +
            </span><span class="inferred1"><a name="line341" /> 341           Addressable::URI::CharacterClasses::AUTHORITY),
         | 
| 963 | 
            +
            </span><span class="marked0"><a name="line342" /> 342         self.encode_segment(uri_object.host,
         | 
| 964 | 
            +
            </span><span class="inferred1"><a name="line343" /> 343           Addressable::URI::CharacterClasses::AUTHORITY),
         | 
| 965 | 
            +
            </span><span class="marked0"><a name="line344" /> 344         self.encode_segment(uri_object.specified_port,
         | 
| 966 | 
            +
            </span><span class="inferred1"><a name="line345" /> 345           Addressable::URI::CharacterClasses::AUTHORITY),
         | 
| 967 | 
            +
            </span><span class="marked0"><a name="line346" /> 346         self.encode_segment(uri_object.path,
         | 
| 968 | 
            +
            </span><span class="inferred1"><a name="line347" /> 347           Addressable::URI::CharacterClasses::PATH),
         | 
| 969 | 
            +
            </span><span class="marked0"><a name="line348" /> 348         self.encode_segment(uri_object.query,
         | 
| 970 | 
            +
            </span><span class="inferred1"><a name="line349" /> 349           Addressable::URI::CharacterClasses::QUERY),
         | 
| 971 | 
            +
            </span><span class="marked0"><a name="line350" /> 350         self.encode_segment(uri_object.fragment,
         | 
| 972 | 
            +
            </span><span class="inferred1"><a name="line351" /> 351           Addressable::URI::CharacterClasses::FRAGMENT)
         | 
| 973 | 
            +
            </span><span class="marked0"><a name="line352" /> 352       ).to_s
         | 
| 974 | 
            +
            </span><span class="inferred1"><a name="line353" /> 353     end
         | 
| 975 | 
            +
            </span><span class="inferred0"><a name="line354" /> 354     
         | 
| 976 | 
            +
            </span><span class="marked1"><a name="line355" /> 355     class << self
         | 
| 977 | 
            +
            </span><span class="marked0"><a name="line356" /> 356       alias_method :escape, :encode
         | 
| 978 | 
            +
            </span><span class="inferred1"><a name="line357" /> 357     end
         | 
| 979 | 
            +
            </span><span class="inferred0"><a name="line358" /> 358     
         | 
| 980 | 
            +
            </span><span class="inferred1"><a name="line359" /> 359     # Normalizes the encoding of a URI.  Characters within a hostname are
         | 
| 981 | 
            +
            </span><span class="inferred0"><a name="line360" /> 360     # not percent encoded to allow for internationalized domain names.
         | 
| 982 | 
            +
            </span><span class="marked1"><a name="line361" /> 361     def self.normalized_encode(uri)
         | 
| 983 | 
            +
            </span><span class="marked0"><a name="line362" /> 362       uri_object = uri.kind_of?(self) ? uri : self.parse(uri.to_s)
         | 
| 984 | 
            +
            </span><span class="marked1"><a name="line363" /> 363       segments = {
         | 
| 985 | 
            +
            </span><span class="marked0"><a name="line364" /> 364         :scheme => self.unencode_segment(uri_object.scheme),
         | 
| 986 | 
            +
            </span><span class="marked1"><a name="line365" /> 365         :user => self.unencode_segment(uri_object.user),
         | 
| 987 | 
            +
            </span><span class="marked0"><a name="line366" /> 366         :password => self.unencode_segment(uri_object.password),
         | 
| 988 | 
            +
            </span><span class="marked1"><a name="line367" /> 367         :host => self.unencode_segment(uri_object.host),
         | 
| 989 | 
            +
            </span><span class="marked0"><a name="line368" /> 368         :port => self.unencode_segment(uri_object.specified_port),
         | 
| 990 | 
            +
            </span><span class="marked1"><a name="line369" /> 369         :path => self.unencode_segment(uri_object.path),
         | 
| 991 | 
            +
            </span><span class="marked0"><a name="line370" /> 370         :query => self.unencode_segment(uri_object.query),
         | 
| 992 | 
            +
            </span><span class="marked1"><a name="line371" /> 371         :fragment => self.unencode_segment(uri_object.fragment)
         | 
| 993 | 
            +
            </span><span class="inferred0"><a name="line372" /> 372       }
         | 
| 994 | 
            +
            </span><span class="marked1"><a name="line373" /> 373       if URI::IDNA.send(:use_libidn?)
         | 
| 995 | 
            +
            </span><span class="marked0"><a name="line374" /> 374         segments.each do |key, value|
         | 
| 996 | 
            +
            </span><span class="marked1"><a name="line375" /> 375           if value != nil
         | 
| 997 | 
            +
            </span><span class="marked0"><a name="line376" /> 376             segments[key] = IDN::Stringprep.nfkc_normalize(value.to_s)
         | 
| 998 | 
            +
            </span><span class="inferred1"><a name="line377" /> 377           end
         | 
| 999 | 
            +
            </span><span class="inferred0"><a name="line378" /> 378         end
         | 
| 1000 | 
            +
            </span><span class="inferred1"><a name="line379" /> 379       end
         | 
| 1001 | 
            +
            </span><span class="marked0"><a name="line380" /> 380       return Addressable::URI.new(
         | 
| 1002 | 
            +
            </span><span class="marked1"><a name="line381" /> 381         self.encode_segment(segments[:scheme],
         | 
| 1003 | 
            +
            </span><span class="inferred0"><a name="line382" /> 382           Addressable::URI::CharacterClasses::SCHEME),
         | 
| 1004 | 
            +
            </span><span class="marked1"><a name="line383" /> 383         self.encode_segment(segments[:user],
         | 
| 1005 | 
            +
            </span><span class="inferred0"><a name="line384" /> 384           Addressable::URI::CharacterClasses::AUTHORITY),
         | 
| 1006 | 
            +
            </span><span class="marked1"><a name="line385" /> 385         self.encode_segment(segments[:password],
         | 
| 1007 | 
            +
            </span><span class="inferred0"><a name="line386" /> 386           Addressable::URI::CharacterClasses::AUTHORITY),
         | 
| 1008 | 
            +
            </span><span class="inferred1"><a name="line387" /> 387         segments[:host],
         | 
| 1009 | 
            +
            </span><span class="inferred0"><a name="line388" /> 388         segments[:port],
         | 
| 1010 | 
            +
            </span><span class="marked1"><a name="line389" /> 389         self.encode_segment(segments[:path],
         | 
| 1011 | 
            +
            </span><span class="inferred0"><a name="line390" /> 390           Addressable::URI::CharacterClasses::PATH),
         | 
| 1012 | 
            +
            </span><span class="marked1"><a name="line391" /> 391         self.encode_segment(segments[:query],
         | 
| 1013 | 
            +
            </span><span class="inferred0"><a name="line392" /> 392           Addressable::URI::CharacterClasses::QUERY),
         | 
| 1014 | 
            +
            </span><span class="marked1"><a name="line393" /> 393         self.encode_segment(segments[:fragment],
         | 
| 1015 | 
            +
            </span><span class="inferred0"><a name="line394" /> 394           Addressable::URI::CharacterClasses::FRAGMENT)
         | 
| 1016 | 
            +
            </span><span class="marked1"><a name="line395" /> 395       ).to_s
         | 
| 1017 | 
            +
            </span><span class="inferred0"><a name="line396" /> 396     end
         | 
| 1018 | 
            +
            </span><span class="inferred1"><a name="line397" /> 397 
         | 
| 1019 | 
            +
            </span><span class="inferred0"><a name="line398" /> 398     # Extracts uris from an arbitrary body of text.
         | 
| 1020 | 
            +
            </span><span class="marked1"><a name="line399" /> 399     def self.extract(text, options={})
         | 
| 1021 | 
            +
            </span><span class="marked0"><a name="line400" /> 400       defaults = {:base => nil, :parse => false} 
         | 
| 1022 | 
            +
            </span><span class="marked1"><a name="line401" /> 401       options = defaults.merge(options)
         | 
| 1023 | 
            +
            </span><span class="marked0"><a name="line402" /> 402       raise InvalidOptionError unless (options.keys - defaults.keys).empty?
         | 
| 1024 | 
            +
            </span><span class="inferred1"><a name="line403" /> 403       # This regular expression needs to be less forgiving or else it would
         | 
| 1025 | 
            +
            </span><span class="inferred0"><a name="line404" /> 404       # match virtually all text.  Which isn't exactly what we're going for.
         | 
| 1026 | 
            +
            </span><span class="marked1"><a name="line405" /> 405       extract_regex = /((([a-z\+]+):)[^ \n\<\>\"\\]+[\w\/])/
         | 
| 1027 | 
            +
            </span><span class="marked0"><a name="line406" /> 406       extracted_uris =
         | 
| 1028 | 
            +
            </span><span class="marked1"><a name="line407" /> 407         text.scan(extract_regex).collect { |match| match[0] }
         | 
| 1029 | 
            +
            </span><span class="marked0"><a name="line408" /> 408       sgml_extract_regex = /<[^>]+href=\"([^\"]+?)\"[^>]*>/
         | 
| 1030 | 
            +
            </span><span class="marked1"><a name="line409" /> 409       sgml_extracted_uris =
         | 
| 1031 | 
            +
            </span><span class="inferred0"><a name="line410" /> 410         text.scan(sgml_extract_regex).collect { |match| match[0] }
         | 
| 1032 | 
            +
            </span><span class="marked1"><a name="line411" /> 411       extracted_uris.concat(sgml_extracted_uris - extracted_uris)
         | 
| 1033 | 
            +
            </span><span class="marked0"><a name="line412" /> 412       textile_extract_regex = /\".+?\":([^ ]+\/[^ ]+)[ \,\.\;\:\?\!\<\>\"]/i
         | 
| 1034 | 
            +
            </span><span class="marked1"><a name="line413" /> 413       textile_extracted_uris =
         | 
| 1035 | 
            +
            </span><span class="inferred0"><a name="line414" /> 414         text.scan(textile_extract_regex).collect { |match| match[0] }
         | 
| 1036 | 
            +
            </span><span class="marked1"><a name="line415" /> 415       extracted_uris.concat(textile_extracted_uris - extracted_uris)
         | 
| 1037 | 
            +
            </span><span class="marked0"><a name="line416" /> 416       parsed_uris = []
         | 
| 1038 | 
            +
            </span><span class="marked1"><a name="line417" /> 417       base_uri = nil
         | 
| 1039 | 
            +
            </span><span class="marked0"><a name="line418" /> 418       if options[:base] != nil
         | 
| 1040 | 
            +
            </span><span class="marked1"><a name="line419" /> 419         base_uri = options[:base] if options[:base].kind_of?(self)
         | 
| 1041 | 
            +
            </span><span class="marked0"><a name="line420" /> 420         base_uri = self.parse(options[:base].to_s) if base_uri == nil
         | 
| 1042 | 
            +
            </span><span class="inferred1"><a name="line421" /> 421       end
         | 
| 1043 | 
            +
            </span><span class="marked0"><a name="line422" /> 422       for uri_string in extracted_uris
         | 
| 1044 | 
            +
            </span><span class="marked1"><a name="line423" /> 423         begin
         | 
| 1045 | 
            +
            </span><span class="marked0"><a name="line424" /> 424           if base_uri == nil
         | 
| 1046 | 
            +
            </span><span class="marked1"><a name="line425" /> 425             parsed_uris << self.parse(uri_string)
         | 
| 1047 | 
            +
            </span><span class="inferred0"><a name="line426" /> 426           else
         | 
| 1048 | 
            +
            </span><span class="marked1"><a name="line427" /> 427             parsed_uris << (base_uri + self.parse(uri_string))
         | 
| 1049 | 
            +
            </span><span class="inferred0"><a name="line428" /> 428           end
         | 
| 1050 | 
            +
            </span><span class="inferred1"><a name="line429" /> 429         rescue Exception
         | 
| 1051 | 
            +
            </span><span class="marked0"><a name="line430" /> 430           nil
         | 
| 1052 | 
            +
            </span><span class="inferred1"><a name="line431" /> 431         end
         | 
| 1053 | 
            +
            </span><span class="inferred0"><a name="line432" /> 432       end
         | 
| 1054 | 
            +
            </span><span class="marked1"><a name="line433" /> 433       parsed_uris.reject! do |uri|
         | 
| 1055 | 
            +
            </span><span class="marked0"><a name="line434" /> 434         (uri.scheme =~ /T\d+/ ||
         | 
| 1056 | 
            +
            </span><span class="marked1"><a name="line435" /> 435          uri.scheme == "xmlns" ||
         | 
| 1057 | 
            +
            </span><span class="marked0"><a name="line436" /> 436          uri.scheme == "xml" ||
         | 
| 1058 | 
            +
            </span><span class="marked1"><a name="line437" /> 437          uri.scheme == "thr" ||
         | 
| 1059 | 
            +
            </span><span class="marked0"><a name="line438" /> 438          uri.scheme == "this" ||
         | 
| 1060 | 
            +
            </span><span class="marked1"><a name="line439" /> 439          uri.scheme == "float" ||
         | 
| 1061 | 
            +
            </span><span class="marked0"><a name="line440" /> 440          uri.scheme == "user" ||
         | 
| 1062 | 
            +
            </span><span class="marked1"><a name="line441" /> 441          uri.scheme == "username" ||
         | 
| 1063 | 
            +
            </span><span class="marked0"><a name="line442" /> 442          uri.scheme == "out")
         | 
| 1064 | 
            +
            </span><span class="inferred1"><a name="line443" /> 443       end
         | 
| 1065 | 
            +
            </span><span class="marked0"><a name="line444" /> 444       if options[:parse]
         | 
| 1066 | 
            +
            </span><span class="marked1"><a name="line445" /> 445         return parsed_uris
         | 
| 1067 | 
            +
            </span><span class="inferred0"><a name="line446" /> 446       else
         | 
| 1068 | 
            +
            </span><span class="marked1"><a name="line447" /> 447         return parsed_uris.collect { |uri| uri.to_s }
         | 
| 1069 | 
            +
            </span><span class="inferred0"><a name="line448" /> 448       end
         | 
| 1070 | 
            +
            </span><span class="inferred1"><a name="line449" /> 449     end
         | 
| 1071 | 
            +
            </span><span class="inferred0"><a name="line450" /> 450     
         | 
| 1072 | 
            +
            </span><span class="inferred1"><a name="line451" /> 451     # Creates a new uri object from component parts.  Passing nil for
         | 
| 1073 | 
            +
            </span><span class="inferred0"><a name="line452" /> 452     # any of these parameters is acceptable.
         | 
| 1074 | 
            +
            </span><span class="marked1"><a name="line453" /> 453     def initialize(scheme, user, password, host, port, path, query, fragment)
         | 
| 1075 | 
            +
            </span><span class="marked0"><a name="line454" /> 454       @scheme = scheme
         | 
| 1076 | 
            +
            </span><span class="marked1"><a name="line455" /> 455       @scheme = nil if @scheme.to_s.strip == ""
         | 
| 1077 | 
            +
            </span><span class="marked0"><a name="line456" /> 456       @user = user
         | 
| 1078 | 
            +
            </span><span class="marked1"><a name="line457" /> 457       @password = password
         | 
| 1079 | 
            +
            </span><span class="marked0"><a name="line458" /> 458       @host = host
         | 
| 1080 | 
            +
            </span><span class="marked1"><a name="line459" /> 459       @specified_port = port.to_s
         | 
| 1081 | 
            +
            </span><span class="marked0"><a name="line460" /> 460       @port = port
         | 
| 1082 | 
            +
            </span><span class="marked1"><a name="line461" /> 461       @port = @port.to_s if @port.kind_of?(Fixnum)
         | 
| 1083 | 
            +
            </span><span class="marked0"><a name="line462" /> 462       if @port != nil && !(@port =~ /^\d+$/)
         | 
| 1084 | 
            +
            </span><span class="marked1"><a name="line463" /> 463         raise InvalidURIError,
         | 
| 1085 | 
            +
            </span><span class="inferred0"><a name="line464" /> 464           "Invalid port number: #{@port.inspect}"
         | 
| 1086 | 
            +
            </span><span class="inferred1"><a name="line465" /> 465       end
         | 
| 1087 | 
            +
            </span><span class="marked0"><a name="line466" /> 466       @port = @port.to_i
         | 
| 1088 | 
            +
            </span><span class="marked1"><a name="line467" /> 467       @port = nil if @port == 0
         | 
| 1089 | 
            +
            </span><span class="marked0"><a name="line468" /> 468       @path = path
         | 
| 1090 | 
            +
            </span><span class="marked1"><a name="line469" /> 469       @query = query
         | 
| 1091 | 
            +
            </span><span class="marked0"><a name="line470" /> 470       @fragment = fragment
         | 
| 1092 | 
            +
            </span><span class="inferred1"><a name="line471" /> 471 
         | 
| 1093 | 
            +
            </span><span class="marked0"><a name="line472" /> 472       validate()
         | 
| 1094 | 
            +
            </span><span class="inferred1"><a name="line473" /> 473     end
         | 
| 1095 | 
            +
            </span><span class="inferred0"><a name="line474" /> 474     
         | 
| 1096 | 
            +
            </span><span class="inferred1"><a name="line475" /> 475     # Returns the scheme (protocol) for this URI.
         | 
| 1097 | 
            +
            </span><span class="marked0"><a name="line476" /> 476     def scheme
         | 
| 1098 | 
            +
            </span><span class="marked1"><a name="line477" /> 477       return @scheme
         | 
| 1099 | 
            +
            </span><span class="marked0"><a name="line478" /> 478     end
         | 
| 1100 | 
            +
            </span><span class="inferred1"><a name="line479" /> 479     
         | 
| 1101 | 
            +
            </span><span class="inferred0"><a name="line480" /> 480     # Sets the scheme (protocol for this URI.)
         | 
| 1102 | 
            +
            </span><span class="marked1"><a name="line481" /> 481     def scheme=(new_scheme)
         | 
| 1103 | 
            +
            </span><span class="marked0"><a name="line482" /> 482       @scheme = new_scheme
         | 
| 1104 | 
            +
            </span><span class="marked1"><a name="line483" /> 483     end
         | 
| 1105 | 
            +
            </span><span class="inferred0"><a name="line484" /> 484     
         | 
| 1106 | 
            +
            </span><span class="inferred1"><a name="line485" /> 485     # Returns the user for this URI.
         | 
| 1107 | 
            +
            </span><span class="marked0"><a name="line486" /> 486     def user
         | 
| 1108 | 
            +
            </span><span class="marked1"><a name="line487" /> 487       return @user
         | 
| 1109 | 
            +
            </span><span class="marked0"><a name="line488" /> 488     end
         | 
| 1110 | 
            +
            </span><span class="inferred1"><a name="line489" /> 489     
         | 
| 1111 | 
            +
            </span><span class="inferred0"><a name="line490" /> 490     # Sets the user for this URI.
         | 
| 1112 | 
            +
            </span><span class="marked1"><a name="line491" /> 491     def user=(new_user)
         | 
| 1113 | 
            +
            </span><span class="marked0"><a name="line492" /> 492       @user = new_user
         | 
| 1114 | 
            +
            </span><span class="inferred1"><a name="line493" /> 493 
         | 
| 1115 | 
            +
            </span><span class="inferred0"><a name="line494" /> 494       # You can't have a nil user with a non-nil password
         | 
| 1116 | 
            +
            </span><span class="marked1"><a name="line495" /> 495       if @password != nil
         | 
| 1117 | 
            +
            </span><span class="marked0"><a name="line496" /> 496         @user = "" if @user.nil?
         | 
| 1118 | 
            +
            </span><span class="inferred1"><a name="line497" /> 497       end
         | 
| 1119 | 
            +
            </span><span class="inferred0"><a name="line498" /> 498 
         | 
| 1120 | 
            +
            </span><span class="inferred1"><a name="line499" /> 499       # Reset dependant values
         | 
| 1121 | 
            +
            </span><span class="marked0"><a name="line500" /> 500       @userinfo = nil
         | 
| 1122 | 
            +
            </span><span class="marked1"><a name="line501" /> 501       @authority = nil
         | 
| 1123 | 
            +
            </span><span class="inferred0"><a name="line502" /> 502 
         | 
| 1124 | 
            +
            </span><span class="inferred1"><a name="line503" /> 503       # Ensure we haven't created an invalid URI
         | 
| 1125 | 
            +
            </span><span class="marked0"><a name="line504" /> 504       validate()
         | 
| 1126 | 
            +
            </span><span class="inferred1"><a name="line505" /> 505     end
         | 
| 1127 | 
            +
            </span><span class="inferred0"><a name="line506" /> 506     
         | 
| 1128 | 
            +
            </span><span class="inferred1"><a name="line507" /> 507     # Returns the password for this URI.
         | 
| 1129 | 
            +
            </span><span class="marked0"><a name="line508" /> 508     def password
         | 
| 1130 | 
            +
            </span><span class="marked1"><a name="line509" /> 509       return @password
         | 
| 1131 | 
            +
            </span><span class="marked0"><a name="line510" /> 510     end
         | 
| 1132 | 
            +
            </span><span class="inferred1"><a name="line511" /> 511 
         | 
| 1133 | 
            +
            </span><span class="inferred0"><a name="line512" /> 512     # Sets the password for this URI.
         | 
| 1134 | 
            +
            </span><span class="marked1"><a name="line513" /> 513     def password=(new_password)
         | 
| 1135 | 
            +
            </span><span class="marked0"><a name="line514" /> 514       @password = new_password
         | 
| 1136 | 
            +
            </span><span class="inferred1"><a name="line515" /> 515 
         | 
| 1137 | 
            +
            </span><span class="inferred0"><a name="line516" /> 516       # You can't have a nil user with a non-nil password
         | 
| 1138 | 
            +
            </span><span class="marked1"><a name="line517" /> 517       if @password != nil
         | 
| 1139 | 
            +
            </span><span class="marked0"><a name="line518" /> 518         @user = "" if @user.nil?
         | 
| 1140 | 
            +
            </span><span class="inferred1"><a name="line519" /> 519       end
         | 
| 1141 | 
            +
            </span><span class="inferred0"><a name="line520" /> 520 
         | 
| 1142 | 
            +
            </span><span class="inferred1"><a name="line521" /> 521       # Reset dependant values
         | 
| 1143 | 
            +
            </span><span class="marked0"><a name="line522" /> 522       @userinfo = nil
         | 
| 1144 | 
            +
            </span><span class="marked1"><a name="line523" /> 523       @authority = nil
         | 
| 1145 | 
            +
            </span><span class="inferred0"><a name="line524" /> 524 
         | 
| 1146 | 
            +
            </span><span class="inferred1"><a name="line525" /> 525       # Ensure we haven't created an invalid URI
         | 
| 1147 | 
            +
            </span><span class="marked0"><a name="line526" /> 526       validate()
         | 
| 1148 | 
            +
            </span><span class="inferred1"><a name="line527" /> 527     end
         | 
| 1149 | 
            +
            </span><span class="inferred0"><a name="line528" /> 528     
         | 
| 1150 | 
            +
            </span><span class="inferred1"><a name="line529" /> 529     # Returns the username and password segment of this URI.
         | 
| 1151 | 
            +
            </span><span class="marked0"><a name="line530" /> 530     def userinfo
         | 
| 1152 | 
            +
            </span><span class="marked1"><a name="line531" /> 531       if !defined?(@userinfo) || @userinfo.nil?
         | 
| 1153 | 
            +
            </span><span class="marked0"><a name="line532" /> 532         current_user = self.user
         | 
| 1154 | 
            +
            </span><span class="marked1"><a name="line533" /> 533         current_password = self.password
         | 
| 1155 | 
            +
            </span><span class="marked0"><a name="line534" /> 534         if current_user == nil && current_password == nil
         | 
| 1156 | 
            +
            </span><span class="marked1"><a name="line535" /> 535           @userinfo = nil
         | 
| 1157 | 
            +
            </span><span class="marked0"><a name="line536" /> 536         elsif current_user != nil && current_password == nil
         | 
| 1158 | 
            +
            </span><span class="marked1"><a name="line537" /> 537           @userinfo = "#{current_user}"
         | 
| 1159 | 
            +
            </span><span class="marked0"><a name="line538" /> 538         elsif current_user != nil && current_password != nil
         | 
| 1160 | 
            +
            </span><span class="marked1"><a name="line539" /> 539           @userinfo = "#{current_user}:#{current_password}"
         | 
| 1161 | 
            +
            </span><span class="inferred0"><a name="line540" /> 540         end
         | 
| 1162 | 
            +
            </span><span class="inferred1"><a name="line541" /> 541       end
         | 
| 1163 | 
            +
            </span><span class="marked0"><a name="line542" /> 542       return @userinfo
         | 
| 1164 | 
            +
            </span><span class="inferred1"><a name="line543" /> 543     end
         | 
| 1165 | 
            +
            </span><span class="inferred0"><a name="line544" /> 544     
         | 
| 1166 | 
            +
            </span><span class="inferred1"><a name="line545" /> 545     # Sets the username and password segment of this URI.
         | 
| 1167 | 
            +
            </span><span class="marked0"><a name="line546" /> 546     def userinfo=(new_userinfo)
         | 
| 1168 | 
            +
            </span><span class="marked1"><a name="line547" /> 547       new_user = new_userinfo.to_s.strip.scan(/^(.*):/).flatten[0]
         | 
| 1169 | 
            +
            </span><span class="marked0"><a name="line548" /> 548       new_password = new_userinfo.to_s.strip.scan(/:(.*)$/).flatten[0]
         | 
| 1170 | 
            +
            </span><span class="inferred1"><a name="line549" /> 549       
         | 
| 1171 | 
            +
            </span><span class="inferred0"><a name="line550" /> 550       # Password assigned first to ensure validity in case of nil
         | 
| 1172 | 
            +
            </span><span class="marked1"><a name="line551" /> 551       self.password = new_password
         | 
| 1173 | 
            +
            </span><span class="marked0"><a name="line552" /> 552       self.user = new_user
         | 
| 1174 | 
            +
            </span><span class="inferred1"><a name="line553" /> 553 
         | 
| 1175 | 
            +
            </span><span class="inferred0"><a name="line554" /> 554       # Reset dependant values
         | 
| 1176 | 
            +
            </span><span class="marked1"><a name="line555" /> 555       @authority = nil
         | 
| 1177 | 
            +
            </span><span class="inferred0"><a name="line556" /> 556 
         | 
| 1178 | 
            +
            </span><span class="inferred1"><a name="line557" /> 557       # Ensure we haven't created an invalid URI
         | 
| 1179 | 
            +
            </span><span class="marked0"><a name="line558" /> 558       validate()
         | 
| 1180 | 
            +
            </span><span class="inferred1"><a name="line559" /> 559     end
         | 
| 1181 | 
            +
            </span><span class="inferred0"><a name="line560" /> 560     
         | 
| 1182 | 
            +
            </span><span class="inferred1"><a name="line561" /> 561     # Returns the host for this URI.
         | 
| 1183 | 
            +
            </span><span class="marked0"><a name="line562" /> 562     def host
         | 
| 1184 | 
            +
            </span><span class="marked1"><a name="line563" /> 563       return @host
         | 
| 1185 | 
            +
            </span><span class="marked0"><a name="line564" /> 564     end
         | 
| 1186 | 
            +
            </span><span class="inferred1"><a name="line565" /> 565     
         | 
| 1187 | 
            +
            </span><span class="inferred0"><a name="line566" /> 566     # Sets the host for this URI.
         | 
| 1188 | 
            +
            </span><span class="marked1"><a name="line567" /> 567     def host=(new_host)
         | 
| 1189 | 
            +
            </span><span class="marked0"><a name="line568" /> 568       @host = new_host
         | 
| 1190 | 
            +
            </span><span class="inferred1"><a name="line569" /> 569 
         | 
| 1191 | 
            +
            </span><span class="inferred0"><a name="line570" /> 570       # Reset dependant values
         | 
| 1192 | 
            +
            </span><span class="marked1"><a name="line571" /> 571       @authority = nil
         | 
| 1193 | 
            +
            </span><span class="inferred0"><a name="line572" /> 572 
         | 
| 1194 | 
            +
            </span><span class="inferred1"><a name="line573" /> 573       # Ensure we haven't created an invalid URI
         | 
| 1195 | 
            +
            </span><span class="marked0"><a name="line574" /> 574       validate()
         | 
| 1196 | 
            +
            </span><span class="inferred1"><a name="line575" /> 575     end
         | 
| 1197 | 
            +
            </span><span class="inferred0"><a name="line576" /> 576     
         | 
| 1198 | 
            +
            </span><span class="inferred1"><a name="line577" /> 577     # Returns the authority segment of this URI.
         | 
| 1199 | 
            +
            </span><span class="marked0"><a name="line578" /> 578     def authority
         | 
| 1200 | 
            +
            </span><span class="marked1"><a name="line579" /> 579       if !defined?(@authority) || @authority.nil?
         | 
| 1201 | 
            +
            </span><span class="marked0"><a name="line580" /> 580         return nil if self.host.nil?
         | 
| 1202 | 
            +
            </span><span class="marked1"><a name="line581" /> 581         @authority = ""
         | 
| 1203 | 
            +
            </span><span class="marked0"><a name="line582" /> 582         if self.userinfo != nil
         | 
| 1204 | 
            +
            </span><span class="marked1"><a name="line583" /> 583           @authority << "#{self.userinfo}@"
         | 
| 1205 | 
            +
            </span><span class="inferred0"><a name="line584" /> 584         end
         | 
| 1206 | 
            +
            </span><span class="marked1"><a name="line585" /> 585         @authority << self.host
         | 
| 1207 | 
            +
            </span><span class="marked0"><a name="line586" /> 586         if self.specified_port != nil
         | 
| 1208 | 
            +
            </span><span class="marked1"><a name="line587" /> 587           @authority << ":#{self.specified_port}"
         | 
| 1209 | 
            +
            </span><span class="inferred0"><a name="line588" /> 588         end
         | 
| 1210 | 
            +
            </span><span class="inferred1"><a name="line589" /> 589       end
         | 
| 1211 | 
            +
            </span><span class="marked0"><a name="line590" /> 590       return @authority
         | 
| 1212 | 
            +
            </span><span class="inferred1"><a name="line591" /> 591     end
         | 
| 1213 | 
            +
            </span><span class="inferred0"><a name="line592" /> 592     
         | 
| 1214 | 
            +
            </span><span class="inferred1"><a name="line593" /> 593     # Sets the authority segment of this URI.
         | 
| 1215 | 
            +
            </span><span class="marked0"><a name="line594" /> 594     def authority=(new_authority)
         | 
| 1216 | 
            +
            </span><span class="marked1"><a name="line595" /> 595       if new_authority != nil
         | 
| 1217 | 
            +
            </span><span class="marked0"><a name="line596" /> 596         new_userinfo = new_authority.scan(/^([^\[\]]*)@/).flatten[0]
         | 
| 1218 | 
            +
            </span><span class="marked1"><a name="line597" /> 597         if new_userinfo != nil
         | 
| 1219 | 
            +
            </span><span class="marked0"><a name="line598" /> 598           new_user = new_userinfo.strip.scan(/^([^:]*):?/).flatten[0]
         | 
| 1220 | 
            +
            </span><span class="marked1"><a name="line599" /> 599           new_password = new_userinfo.strip.scan(/:(.*)$/).flatten[0]
         | 
| 1221 | 
            +
            </span><span class="inferred0"><a name="line600" /> 600         end
         | 
| 1222 | 
            +
            </span><span class="marked1"><a name="line601" /> 601         new_host =
         | 
| 1223 | 
            +
            </span><span class="inferred0"><a name="line602" /> 602           new_authority.gsub(/^([^\[\]]*)@/, "").gsub(/:([^:@\[\]]*?)$/, "")
         | 
| 1224 | 
            +
            </span><span class="marked1"><a name="line603" /> 603         new_port =
         | 
| 1225 | 
            +
            </span><span class="inferred0"><a name="line604" /> 604           new_authority.scan(/:([^:@\[\]]*?)$/).flatten[0]
         | 
| 1226 | 
            +
            </span><span class="inferred1"><a name="line605" /> 605       end
         | 
| 1227 | 
            +
            </span><span class="marked0"><a name="line606" /> 606       new_port = nil if new_port == ""
         | 
| 1228 | 
            +
            </span><span class="inferred1"><a name="line607" /> 607       
         | 
| 1229 | 
            +
            </span><span class="inferred0"><a name="line608" /> 608       # Password assigned first to ensure validity in case of nil
         | 
| 1230 | 
            +
            </span><span class="marked1"><a name="line609" /> 609       self.password = new_password
         | 
| 1231 | 
            +
            </span><span class="marked0"><a name="line610" /> 610       self.user = new_user
         | 
| 1232 | 
            +
            </span><span class="marked1"><a name="line611" /> 611       self.host = new_host
         | 
| 1233 | 
            +
            </span><span class="inferred0"><a name="line612" /> 612       
         | 
| 1234 | 
            +
            </span><span class="inferred1"><a name="line613" /> 613       # Port reset to allow port normalization
         | 
| 1235 | 
            +
            </span><span class="marked0"><a name="line614" /> 614       @port = nil
         | 
| 1236 | 
            +
            </span><span class="marked1"><a name="line615" /> 615       @specified_port = new_port
         | 
| 1237 | 
            +
            </span><span class="inferred0"><a name="line616" /> 616       
         | 
| 1238 | 
            +
            </span><span class="inferred1"><a name="line617" /> 617       # Ensure we haven't created an invalid URI
         | 
| 1239 | 
            +
            </span><span class="marked0"><a name="line618" /> 618       validate()
         | 
| 1240 | 
            +
            </span><span class="inferred1"><a name="line619" /> 619     end
         | 
| 1241 | 
            +
            </span><span class="inferred0"><a name="line620" /> 620 
         | 
| 1242 | 
            +
            </span><span class="inferred1"><a name="line621" /> 621     # Returns an array of known ip-based schemes.  These schemes typically
         | 
| 1243 | 
            +
            </span><span class="inferred0"><a name="line622" /> 622     # use a similar URI form:
         | 
| 1244 | 
            +
            </span><span class="inferred1"><a name="line623" /> 623     # //<user>:<password>@<host>:<port>/<url-path>
         | 
| 1245 | 
            +
            </span><span class="marked0"><a name="line624" /> 624     def self.ip_based_schemes
         | 
| 1246 | 
            +
            </span><span class="marked1"><a name="line625" /> 625       return self.scheme_mapping.keys
         | 
| 1247 | 
            +
            </span><span class="marked0"><a name="line626" /> 626     end
         | 
| 1248 | 
            +
            </span><span class="inferred1"><a name="line627" /> 627 
         | 
| 1249 | 
            +
            </span><span class="inferred0"><a name="line628" /> 628     # Returns a hash of common IP-based schemes and their default port
         | 
| 1250 | 
            +
            </span><span class="inferred1"><a name="line629" /> 629     # numbers.  Adding new schemes to this hash, as necessary, will allow
         | 
| 1251 | 
            +
            </span><span class="inferred0"><a name="line630" /> 630     # for better URI normalization.
         | 
| 1252 | 
            +
            </span><span class="marked1"><a name="line631" /> 631     def self.scheme_mapping
         | 
| 1253 | 
            +
            </span><span class="marked0"><a name="line632" /> 632       if !defined?(@protocol_mapping) || @protocol_mapping.nil?
         | 
| 1254 | 
            +
            </span><span class="marked1"><a name="line633" /> 633         @protocol_mapping = {
         | 
| 1255 | 
            +
            </span><span class="inferred0"><a name="line634" /> 634           "http" => 80,
         | 
| 1256 | 
            +
            </span><span class="inferred1"><a name="line635" /> 635           "https" => 443,
         | 
| 1257 | 
            +
            </span><span class="inferred0"><a name="line636" /> 636           "ftp" => 21,
         | 
| 1258 | 
            +
            </span><span class="inferred1"><a name="line637" /> 637           "tftp" => 69,
         | 
| 1259 | 
            +
            </span><span class="inferred0"><a name="line638" /> 638           "ssh" => 22,
         | 
| 1260 | 
            +
            </span><span class="inferred1"><a name="line639" /> 639           "svn+ssh" => 22,
         | 
| 1261 | 
            +
            </span><span class="inferred0"><a name="line640" /> 640           "telnet" => 23,
         | 
| 1262 | 
            +
            </span><span class="inferred1"><a name="line641" /> 641           "nntp" => 119,
         | 
| 1263 | 
            +
            </span><span class="inferred0"><a name="line642" /> 642           "gopher" => 70,
         | 
| 1264 | 
            +
            </span><span class="inferred1"><a name="line643" /> 643           "wais" => 210,
         | 
| 1265 | 
            +
            </span><span class="inferred0"><a name="line644" /> 644           "ldap" => 389,
         | 
| 1266 | 
            +
            </span><span class="inferred1"><a name="line645" /> 645           "prospero" => 1525
         | 
| 1267 | 
            +
            </span><span class="inferred0"><a name="line646" /> 646         }
         | 
| 1268 | 
            +
            </span><span class="inferred1"><a name="line647" /> 647       end
         | 
| 1269 | 
            +
            </span><span class="marked0"><a name="line648" /> 648       return @protocol_mapping
         | 
| 1270 | 
            +
            </span><span class="inferred1"><a name="line649" /> 649     end
         | 
| 1271 | 
            +
            </span><span class="inferred0"><a name="line650" /> 650     
         | 
| 1272 | 
            +
            </span><span class="inferred1"><a name="line651" /> 651     # Returns the port number for this URI.  This method will normalize to the
         | 
| 1273 | 
            +
            </span><span class="inferred0"><a name="line652" /> 652     # default port for the URI's scheme if the port isn't explicitly specified
         | 
| 1274 | 
            +
            </span><span class="inferred1"><a name="line653" /> 653     # in the URI.
         | 
| 1275 | 
            +
            </span><span class="marked0"><a name="line654" /> 654     def port
         | 
| 1276 | 
            +
            </span><span class="marked1"><a name="line655" /> 655       if @port.to_i == 0
         | 
| 1277 | 
            +
            </span><span class="marked0"><a name="line656" /> 656         if self.scheme.nil?
         | 
| 1278 | 
            +
            </span><span class="marked1"><a name="line657" /> 657           @port = nil
         | 
| 1279 | 
            +
            </span><span class="inferred0"><a name="line658" /> 658         else
         | 
| 1280 | 
            +
            </span><span class="marked1"><a name="line659" /> 659           @port = self.class.scheme_mapping[self.scheme.strip.downcase]
         | 
| 1281 | 
            +
            </span><span class="inferred0"><a name="line660" /> 660         end
         | 
| 1282 | 
            +
            </span><span class="marked1"><a name="line661" /> 661         return @port
         | 
| 1283 | 
            +
            </span><span class="inferred0"><a name="line662" /> 662       else
         | 
| 1284 | 
            +
            </span><span class="marked1"><a name="line663" /> 663         @port = @port.to_i
         | 
| 1285 | 
            +
            </span><span class="marked0"><a name="line664" /> 664         return @port
         | 
| 1286 | 
            +
            </span><span class="inferred1"><a name="line665" /> 665       end
         | 
| 1287 | 
            +
            </span><span class="marked0"><a name="line666" /> 666     end
         | 
| 1288 | 
            +
            </span><span class="inferred1"><a name="line667" /> 667     
         | 
| 1289 | 
            +
            </span><span class="inferred0"><a name="line668" /> 668     # Sets the port for this URI.
         | 
| 1290 | 
            +
            </span><span class="marked1"><a name="line669" /> 669     def port=(new_port)
         | 
| 1291 | 
            +
            </span><span class="marked0"><a name="line670" /> 670       @port = new_port.to_s.to_i
         | 
| 1292 | 
            +
            </span><span class="marked1"><a name="line671" /> 671       @specified_port = @port
         | 
| 1293 | 
            +
            </span><span class="marked0"><a name="line672" /> 672       @authority = nil
         | 
| 1294 | 
            +
            </span><span class="inferred1"><a name="line673" /> 673     end
         | 
| 1295 | 
            +
            </span><span class="inferred0"><a name="line674" /> 674     
         | 
| 1296 | 
            +
            </span><span class="inferred1"><a name="line675" /> 675     # Returns the port number that was actually specified in the URI string.
         | 
| 1297 | 
            +
            </span><span class="marked0"><a name="line676" /> 676     def specified_port
         | 
| 1298 | 
            +
            </span><span class="marked1"><a name="line677" /> 677       port = @specified_port.to_s.to_i
         | 
| 1299 | 
            +
            </span><span class="marked0"><a name="line678" /> 678       if port == 0
         | 
| 1300 | 
            +
            </span><span class="marked1"><a name="line679" /> 679         return nil
         | 
| 1301 | 
            +
            </span><span class="inferred0"><a name="line680" /> 680       else
         | 
| 1302 | 
            +
            </span><span class="marked1"><a name="line681" /> 681         return port
         | 
| 1303 | 
            +
            </span><span class="inferred0"><a name="line682" /> 682       end
         | 
| 1304 | 
            +
            </span><span class="inferred1"><a name="line683" /> 683     end
         | 
| 1305 | 
            +
            </span><span class="inferred0"><a name="line684" /> 684     
         | 
| 1306 | 
            +
            </span><span class="inferred1"><a name="line685" /> 685     # Returns the path for this URI.
         | 
| 1307 | 
            +
            </span><span class="marked0"><a name="line686" /> 686     def path
         | 
| 1308 | 
            +
            </span><span class="marked1"><a name="line687" /> 687       return @path
         | 
| 1309 | 
            +
            </span><span class="marked0"><a name="line688" /> 688     end
         | 
| 1310 | 
            +
            </span><span class="inferred1"><a name="line689" /> 689     
         | 
| 1311 | 
            +
            </span><span class="inferred0"><a name="line690" /> 690     # Sets the path for this URI.
         | 
| 1312 | 
            +
            </span><span class="marked1"><a name="line691" /> 691     def path=(new_path)
         | 
| 1313 | 
            +
            </span><span class="marked0"><a name="line692" /> 692       @path = new_path
         | 
| 1314 | 
            +
            </span><span class="marked1"><a name="line693" /> 693     end
         | 
| 1315 | 
            +
            </span><span class="inferred0"><a name="line694" /> 694 
         | 
| 1316 | 
            +
            </span><span class="inferred1"><a name="line695" /> 695     # Returns the basename, if any, of the file at the path being referenced.
         | 
| 1317 | 
            +
            </span><span class="inferred0"><a name="line696" /> 696     # Returns nil if there is no path component.
         | 
| 1318 | 
            +
            </span><span class="marked1"><a name="line697" /> 697     def basename
         | 
| 1319 | 
            +
            </span><span class="marked0"><a name="line698" /> 698       return nil if self.path == nil
         | 
| 1320 | 
            +
            </span><span class="marked1"><a name="line699" /> 699       return File.basename(self.path).gsub(/;[^\/]*$/, "")
         | 
| 1321 | 
            +
            </span><span class="inferred0"><a name="line700" /> 700     end
         | 
| 1322 | 
            +
            </span><span class="inferred1"><a name="line701" /> 701         
         | 
| 1323 | 
            +
            </span><span class="inferred0"><a name="line702" /> 702     # Returns the extension, if any, of the file at the path being referenced.
         | 
| 1324 | 
            +
            </span><span class="inferred1"><a name="line703" /> 703     # Returns "" if there is no extension or nil if there is no path
         | 
| 1325 | 
            +
            </span><span class="inferred0"><a name="line704" /> 704     # component.
         | 
| 1326 | 
            +
            </span><span class="marked1"><a name="line705" /> 705     def extname
         | 
| 1327 | 
            +
            </span><span class="marked0"><a name="line706" /> 706       return nil if self.path == nil
         | 
| 1328 | 
            +
            </span><span class="marked1"><a name="line707" /> 707       return File.extname(self.basename.gsub(/;[^\/]*$/, ""))
         | 
| 1329 | 
            +
            </span><span class="inferred0"><a name="line708" /> 708     end
         | 
| 1330 | 
            +
            </span><span class="inferred1"><a name="line709" /> 709     
         | 
| 1331 | 
            +
            </span><span class="inferred0"><a name="line710" /> 710     # Returns the query string for this URI.
         | 
| 1332 | 
            +
            </span><span class="marked1"><a name="line711" /> 711     def query
         | 
| 1333 | 
            +
            </span><span class="marked0"><a name="line712" /> 712       return @query
         | 
| 1334 | 
            +
            </span><span class="marked1"><a name="line713" /> 713     end
         | 
| 1335 | 
            +
            </span><span class="inferred0"><a name="line714" /> 714     
         | 
| 1336 | 
            +
            </span><span class="inferred1"><a name="line715" /> 715     # Sets the query string for this URI.
         | 
| 1337 | 
            +
            </span><span class="marked0"><a name="line716" /> 716     def query=(new_query)
         | 
| 1338 | 
            +
            </span><span class="marked1"><a name="line717" /> 717       @query = new_query
         | 
| 1339 | 
            +
            </span><span class="marked0"><a name="line718" /> 718     end
         | 
| 1340 | 
            +
            </span><span class="inferred1"><a name="line719" /> 719     
         | 
| 1341 | 
            +
            </span><span class="inferred0"><a name="line720" /> 720     # Returns the fragment for this URI.
         | 
| 1342 | 
            +
            </span><span class="marked1"><a name="line721" /> 721     def fragment
         | 
| 1343 | 
            +
            </span><span class="marked0"><a name="line722" /> 722       return @fragment
         | 
| 1344 | 
            +
            </span><span class="marked1"><a name="line723" /> 723     end
         | 
| 1345 | 
            +
            </span><span class="inferred0"><a name="line724" /> 724     
         | 
| 1346 | 
            +
            </span><span class="inferred1"><a name="line725" /> 725     # Sets the fragment for this URI.
         | 
| 1347 | 
            +
            </span><span class="marked0"><a name="line726" /> 726     def fragment=(new_fragment)
         | 
| 1348 | 
            +
            </span><span class="marked1"><a name="line727" /> 727       @fragment = new_fragment
         | 
| 1349 | 
            +
            </span><span class="marked0"><a name="line728" /> 728     end
         | 
| 1350 | 
            +
            </span><span class="inferred1"><a name="line729" /> 729     
         | 
| 1351 | 
            +
            </span><span class="inferred0"><a name="line730" /> 730     # Returns true if the URI uses an IP-based protocol.
         | 
| 1352 | 
            +
            </span><span class="marked1"><a name="line731" /> 731     def ip_based?
         | 
| 1353 | 
            +
            </span><span class="marked0"><a name="line732" /> 732       return false if self.scheme.nil?
         | 
| 1354 | 
            +
            </span><span class="marked1"><a name="line733" /> 733       return self.class.ip_based_schemes.include?(self.scheme.strip.downcase)
         | 
| 1355 | 
            +
            </span><span class="inferred0"><a name="line734" /> 734     end
         | 
| 1356 | 
            +
            </span><span class="inferred1"><a name="line735" /> 735     
         | 
| 1357 | 
            +
            </span><span class="inferred0"><a name="line736" /> 736     # Returns true if this URI is known to be relative.
         | 
| 1358 | 
            +
            </span><span class="marked1"><a name="line737" /> 737     def relative?
         | 
| 1359 | 
            +
            </span><span class="marked0"><a name="line738" /> 738       return self.scheme.nil?
         | 
| 1360 | 
            +
            </span><span class="marked1"><a name="line739" /> 739     end
         | 
| 1361 | 
            +
            </span><span class="inferred0"><a name="line740" /> 740     
         | 
| 1362 | 
            +
            </span><span class="inferred1"><a name="line741" /> 741     # Returns true if this URI is known to be absolute.
         | 
| 1363 | 
            +
            </span><span class="marked0"><a name="line742" /> 742     def absolute?
         | 
| 1364 | 
            +
            </span><span class="marked1"><a name="line743" /> 743       return !relative?
         | 
| 1365 | 
            +
            </span><span class="marked0"><a name="line744" /> 744     end
         | 
| 1366 | 
            +
            </span><span class="inferred1"><a name="line745" /> 745     
         | 
| 1367 | 
            +
            </span><span class="inferred0"><a name="line746" /> 746     # Joins two URIs together.
         | 
| 1368 | 
            +
            </span><span class="marked1"><a name="line747" /> 747     def +(uri)
         | 
| 1369 | 
            +
            </span><span class="marked0"><a name="line748" /> 748       if !uri.kind_of?(self.class)
         | 
| 1370 | 
            +
            </span><span class="marked1"><a name="line749" /> 749         uri = URI.parse(uri.to_s)
         | 
| 1371 | 
            +
            </span><span class="inferred0"><a name="line750" /> 750       end
         | 
| 1372 | 
            +
            </span><span class="marked1"><a name="line751" /> 751       if uri.to_s == ""
         | 
| 1373 | 
            +
            </span><span class="marked0"><a name="line752" /> 752         return self.dup
         | 
| 1374 | 
            +
            </span><span class="inferred1"><a name="line753" /> 753       end
         | 
| 1375 | 
            +
            </span><span class="inferred0"><a name="line754" /> 754       
         | 
| 1376 | 
            +
            </span><span class="marked1"><a name="line755" /> 755       joined_scheme = nil
         | 
| 1377 | 
            +
            </span><span class="marked0"><a name="line756" /> 756       joined_user = nil
         | 
| 1378 | 
            +
            </span><span class="marked1"><a name="line757" /> 757       joined_password = nil
         | 
| 1379 | 
            +
            </span><span class="marked0"><a name="line758" /> 758       joined_host = nil
         | 
| 1380 | 
            +
            </span><span class="marked1"><a name="line759" /> 759       joined_port = nil
         | 
| 1381 | 
            +
            </span><span class="marked0"><a name="line760" /> 760       joined_path = nil
         | 
| 1382 | 
            +
            </span><span class="marked1"><a name="line761" /> 761       joined_query = nil
         | 
| 1383 | 
            +
            </span><span class="marked0"><a name="line762" /> 762       joined_fragment = nil
         | 
| 1384 | 
            +
            </span><span class="inferred1"><a name="line763" /> 763       
         | 
| 1385 | 
            +
            </span><span class="inferred0"><a name="line764" /> 764       # Section 5.2.2 of RFC 3986
         | 
| 1386 | 
            +
            </span><span class="marked1"><a name="line765" /> 765       if uri.scheme != nil
         | 
| 1387 | 
            +
            </span><span class="marked0"><a name="line766" /> 766         joined_scheme = uri.scheme
         | 
| 1388 | 
            +
            </span><span class="marked1"><a name="line767" /> 767         joined_user = uri.user
         | 
| 1389 | 
            +
            </span><span class="marked0"><a name="line768" /> 768         joined_password = uri.password
         | 
| 1390 | 
            +
            </span><span class="marked1"><a name="line769" /> 769         joined_host = uri.host
         | 
| 1391 | 
            +
            </span><span class="marked0"><a name="line770" /> 770         joined_port = uri.specified_port
         | 
| 1392 | 
            +
            </span><span class="marked1"><a name="line771" /> 771         joined_path = self.class.normalize_path(uri.path)
         | 
| 1393 | 
            +
            </span><span class="marked0"><a name="line772" /> 772         joined_query = uri.query
         | 
| 1394 | 
            +
            </span><span class="inferred1"><a name="line773" /> 773       else
         | 
| 1395 | 
            +
            </span><span class="marked0"><a name="line774" /> 774         if uri.authority != nil
         | 
| 1396 | 
            +
            </span><span class="marked1"><a name="line775" /> 775           joined_user = uri.user
         | 
| 1397 | 
            +
            </span><span class="marked0"><a name="line776" /> 776           joined_password = uri.password
         | 
| 1398 | 
            +
            </span><span class="marked1"><a name="line777" /> 777           joined_host = uri.host
         | 
| 1399 | 
            +
            </span><span class="marked0"><a name="line778" /> 778           joined_port = uri.specified_port
         | 
| 1400 | 
            +
            </span><span class="marked1"><a name="line779" /> 779           joined_path = self.class.normalize_path(uri.path)
         | 
| 1401 | 
            +
            </span><span class="marked0"><a name="line780" /> 780           joined_query = uri.query
         | 
| 1402 | 
            +
            </span><span class="inferred1"><a name="line781" /> 781         else
         | 
| 1403 | 
            +
            </span><span class="marked0"><a name="line782" /> 782           if uri.path == nil || uri.path == ""
         | 
| 1404 | 
            +
            </span><span class="marked1"><a name="line783" /> 783             joined_path = self.path
         | 
| 1405 | 
            +
            </span><span class="marked0"><a name="line784" /> 784             if uri.query != nil
         | 
| 1406 | 
            +
            </span><span class="marked1"><a name="line785" /> 785               joined_query = uri.query
         | 
| 1407 | 
            +
            </span><span class="inferred0"><a name="line786" /> 786             else
         | 
| 1408 | 
            +
            </span><span class="marked1"><a name="line787" /> 787               joined_query = self.query
         | 
| 1409 | 
            +
            </span><span class="inferred0"><a name="line788" /> 788             end
         | 
| 1410 | 
            +
            </span><span class="inferred1"><a name="line789" /> 789           else
         | 
| 1411 | 
            +
            </span><span class="marked0"><a name="line790" /> 790             if uri.path[0..0] == "/"
         | 
| 1412 | 
            +
            </span><span class="marked1"><a name="line791" /> 791               joined_path = self.class.normalize_path(uri.path)
         | 
| 1413 | 
            +
            </span><span class="inferred0"><a name="line792" /> 792             else
         | 
| 1414 | 
            +
            </span><span class="marked1"><a name="line793" /> 793               base_path = self.path.nil? ? "" : self.path.dup
         | 
| 1415 | 
            +
            </span><span class="marked0"><a name="line794" /> 794               base_path = self.class.normalize_path(base_path)
         | 
| 1416 | 
            +
            </span><span class="marked1"><a name="line795" /> 795               base_path.gsub!(/\/[^\/]+$/, "/")
         | 
| 1417 | 
            +
            </span><span class="marked0"><a name="line796" /> 796               joined_path = self.class.normalize_path(base_path + uri.path)
         | 
| 1418 | 
            +
            </span><span class="inferred1"><a name="line797" /> 797             end
         | 
| 1419 | 
            +
            </span><span class="marked0"><a name="line798" /> 798             joined_query = uri.query
         | 
| 1420 | 
            +
            </span><span class="inferred1"><a name="line799" /> 799           end
         | 
| 1421 | 
            +
            </span><span class="marked0"><a name="line800" /> 800           joined_user = self.user
         | 
| 1422 | 
            +
            </span><span class="marked1"><a name="line801" /> 801           joined_password = self.password
         | 
| 1423 | 
            +
            </span><span class="marked0"><a name="line802" /> 802           joined_host = self.host
         | 
| 1424 | 
            +
            </span><span class="marked1"><a name="line803" /> 803           joined_port = self.specified_port
         | 
| 1425 | 
            +
            </span><span class="inferred0"><a name="line804" /> 804         end
         | 
| 1426 | 
            +
            </span><span class="marked1"><a name="line805" /> 805         joined_scheme = self.scheme
         | 
| 1427 | 
            +
            </span><span class="inferred0"><a name="line806" /> 806       end
         | 
| 1428 | 
            +
            </span><span class="marked1"><a name="line807" /> 807       joined_fragment = uri.fragment
         | 
| 1429 | 
            +
            </span><span class="inferred0"><a name="line808" /> 808       
         | 
| 1430 | 
            +
            </span><span class="marked1"><a name="line809" /> 809       return Addressable::URI.new(
         | 
| 1431 | 
            +
            </span><span class="inferred0"><a name="line810" /> 810         joined_scheme,
         | 
| 1432 | 
            +
            </span><span class="inferred1"><a name="line811" /> 811         joined_user,
         | 
| 1433 | 
            +
            </span><span class="inferred0"><a name="line812" /> 812         joined_password,
         | 
| 1434 | 
            +
            </span><span class="inferred1"><a name="line813" /> 813         joined_host,
         | 
| 1435 | 
            +
            </span><span class="inferred0"><a name="line814" /> 814         joined_port,
         | 
| 1436 | 
            +
            </span><span class="inferred1"><a name="line815" /> 815         joined_path,
         | 
| 1437 | 
            +
            </span><span class="inferred0"><a name="line816" /> 816         joined_query,
         | 
| 1438 | 
            +
            </span><span class="inferred1"><a name="line817" /> 817         joined_fragment
         | 
| 1439 | 
            +
            </span><span class="marked0"><a name="line818" /> 818       )
         | 
| 1440 | 
            +
            </span><span class="inferred1"><a name="line819" /> 819     end
         | 
| 1441 | 
            +
            </span><span class="inferred0"><a name="line820" /> 820     
         | 
| 1442 | 
            +
            </span><span class="inferred1"><a name="line821" /> 821     # Merges two URIs together.
         | 
| 1443 | 
            +
            </span><span class="marked0"><a name="line822" /> 822     def merge(uri)
         | 
| 1444 | 
            +
            </span><span class="marked1"><a name="line823" /> 823       return self + uri
         | 
| 1445 | 
            +
            </span><span class="marked0"><a name="line824" /> 824     end
         | 
| 1446 | 
            +
            </span><span class="inferred1"><a name="line825" /> 825     
         | 
| 1447 | 
            +
            </span><span class="inferred0"><a name="line826" /> 826     # Destructive form of merge.
         | 
| 1448 | 
            +
            </span><span class="marked1"><a name="line827" /> 827     def merge!(uri)
         | 
| 1449 | 
            +
            </span><span class="marked0"><a name="line828" /> 828       replace_self(self.merge(uri))
         | 
| 1450 | 
            +
            </span><span class="marked1"><a name="line829" /> 829     end
         | 
| 1451 | 
            +
            </span><span class="inferred0"><a name="line830" /> 830     
         | 
| 1452 | 
            +
            </span><span class="inferred1"><a name="line831" /> 831     # Returns the shortest normalized relative form of this URI that uses the
         | 
| 1453 | 
            +
            </span><span class="inferred0"><a name="line832" /> 832     # supplied URI as a base for resolution.  Returns an absolute URI if
         | 
| 1454 | 
            +
            </span><span class="inferred1"><a name="line833" /> 833     # necessary.
         | 
| 1455 | 
            +
            </span><span class="marked0"><a name="line834" /> 834     def route_from(uri)
         | 
| 1456 | 
            +
            </span><span class="marked1"><a name="line835" /> 835       uri = uri.kind_of?(self.class) ? uri : self.class.parse(uri.to_s)
         | 
| 1457 | 
            +
            </span><span class="marked0"><a name="line836" /> 836       uri = uri.normalize
         | 
| 1458 | 
            +
            </span><span class="marked1"><a name="line837" /> 837       normalized_self = self.normalize
         | 
| 1459 | 
            +
            </span><span class="marked0"><a name="line838" /> 838       if normalized_self.relative?
         | 
| 1460 | 
            +
            </span><span class="marked1"><a name="line839" /> 839         raise ArgumentError, "Expected absolute URI, got: #{self.to_s}"
         | 
| 1461 | 
            +
            </span><span class="inferred0"><a name="line840" /> 840       end
         | 
| 1462 | 
            +
            </span><span class="marked1"><a name="line841" /> 841       if uri.relative?
         | 
| 1463 | 
            +
            </span><span class="marked0"><a name="line842" /> 842         raise ArgumentError, "Expected absolute URI, got: #{self.to_s}"
         | 
| 1464 | 
            +
            </span><span class="inferred1"><a name="line843" /> 843       end
         | 
| 1465 | 
            +
            </span><span class="marked0"><a name="line844" /> 844       if normalized_self == uri
         | 
| 1466 | 
            +
            </span><span class="marked1"><a name="line845" /> 845         return Addressable::URI.parse("##{normalized_self.fragment}")
         | 
| 1467 | 
            +
            </span><span class="inferred0"><a name="line846" /> 846       end
         | 
| 1468 | 
            +
            </span><span class="marked1"><a name="line847" /> 847       segments = normalized_self.to_h
         | 
| 1469 | 
            +
            </span><span class="marked0"><a name="line848" /> 848       if normalized_self.scheme == uri.scheme
         | 
| 1470 | 
            +
            </span><span class="marked1"><a name="line849" /> 849         segments[:scheme] = nil
         | 
| 1471 | 
            +
            </span><span class="marked0"><a name="line850" /> 850         if normalized_self.authority == uri.authority
         | 
| 1472 | 
            +
            </span><span class="marked1"><a name="line851" /> 851           segments[:user] = nil
         | 
| 1473 | 
            +
            </span><span class="marked0"><a name="line852" /> 852           segments[:password] = nil
         | 
| 1474 | 
            +
            </span><span class="marked1"><a name="line853" /> 853           segments[:host] = nil
         | 
| 1475 | 
            +
            </span><span class="marked0"><a name="line854" /> 854           segments[:port] = nil
         | 
| 1476 | 
            +
            </span><span class="marked1"><a name="line855" /> 855           if normalized_self.path == uri.path
         | 
| 1477 | 
            +
            </span><span class="marked0"><a name="line856" /> 856             segments[:path] = nil
         | 
| 1478 | 
            +
            </span><span class="marked1"><a name="line857" /> 857             if normalized_self.query == uri.query
         | 
| 1479 | 
            +
            </span><span class="marked0"><a name="line858" /> 858               segments[:query] = nil
         | 
| 1480 | 
            +
            </span><span class="inferred1"><a name="line859" /> 859             end
         | 
| 1481 | 
            +
            </span><span class="inferred0"><a name="line860" /> 860           end
         | 
| 1482 | 
            +
            </span><span class="inferred1"><a name="line861" /> 861         end
         | 
| 1483 | 
            +
            </span><span class="inferred0"><a name="line862" /> 862       end
         | 
| 1484 | 
            +
            </span><span class="inferred1"><a name="line863" /> 863       # Avoid network-path references.
         | 
| 1485 | 
            +
            </span><span class="marked0"><a name="line864" /> 864       if segments[:scheme] == nil && segments[:host] != nil
         | 
| 1486 | 
            +
            </span><span class="marked1"><a name="line865" /> 865         segments[:scheme] = normalized_self.scheme
         | 
| 1487 | 
            +
            </span><span class="inferred0"><a name="line866" /> 866       end
         | 
| 1488 | 
            +
            </span><span class="marked1"><a name="line867" /> 867       return Addressable::URI.new(
         | 
| 1489 | 
            +
            </span><span class="inferred0"><a name="line868" /> 868         segments[:scheme],
         | 
| 1490 | 
            +
            </span><span class="inferred1"><a name="line869" /> 869         segments[:user],
         | 
| 1491 | 
            +
            </span><span class="inferred0"><a name="line870" /> 870         segments[:password],
         | 
| 1492 | 
            +
            </span><span class="inferred1"><a name="line871" /> 871         segments[:host],
         | 
| 1493 | 
            +
            </span><span class="inferred0"><a name="line872" /> 872         segments[:port],
         | 
| 1494 | 
            +
            </span><span class="inferred1"><a name="line873" /> 873         segments[:path],
         | 
| 1495 | 
            +
            </span><span class="inferred0"><a name="line874" /> 874         segments[:query],
         | 
| 1496 | 
            +
            </span><span class="inferred1"><a name="line875" /> 875         segments[:fragment]
         | 
| 1497 | 
            +
            </span><span class="marked0"><a name="line876" /> 876       )
         | 
| 1498 | 
            +
            </span><span class="inferred1"><a name="line877" /> 877     end
         | 
| 1499 | 
            +
            </span><span class="inferred0"><a name="line878" /> 878     
         | 
| 1500 | 
            +
            </span><span class="inferred1"><a name="line879" /> 879     # Returns the shortest normalized relative form of the supplied URI that
         | 
| 1501 | 
            +
            </span><span class="inferred0"><a name="line880" /> 880     # uses this URI as a base for resolution.  Returns an absolute URI if
         | 
| 1502 | 
            +
            </span><span class="inferred1"><a name="line881" /> 881     # necessary.
         | 
| 1503 | 
            +
            </span><span class="marked0"><a name="line882" /> 882     def route_to(uri)
         | 
| 1504 | 
            +
            </span><span class="marked1"><a name="line883" /> 883       uri = uri.kind_of?(self.class) ? uri : self.class.parse(uri.to_s)
         | 
| 1505 | 
            +
            </span><span class="marked0"><a name="line884" /> 884       return uri.route_from(self)
         | 
| 1506 | 
            +
            </span><span class="inferred1"><a name="line885" /> 885     end
         | 
| 1507 | 
            +
            </span><span class="inferred0"><a name="line886" /> 886     
         | 
| 1508 | 
            +
            </span><span class="inferred1"><a name="line887" /> 887     # Returns a normalized URI object.
         | 
| 1509 | 
            +
            </span><span class="inferred0"><a name="line888" /> 888     #
         | 
| 1510 | 
            +
            </span><span class="inferred1"><a name="line889" /> 889     # NOTE: This method does not attempt to fully conform to specifications.
         | 
| 1511 | 
            +
            </span><span class="inferred0"><a name="line890" /> 890     # It exists largely to correct other people's failures to read the
         | 
| 1512 | 
            +
            </span><span class="inferred1"><a name="line891" /> 891     # specifications, and also to deal with caching issues since several
         | 
| 1513 | 
            +
            </span><span class="inferred0"><a name="line892" /> 892     # different URIs may represent the same resource and should not be
         | 
| 1514 | 
            +
            </span><span class="inferred1"><a name="line893" /> 893     # cached multiple times.
         | 
| 1515 | 
            +
            </span><span class="marked0"><a name="line894" /> 894     def normalize
         | 
| 1516 | 
            +
            </span><span class="marked1"><a name="line895" /> 895       normalized_scheme = nil
         | 
| 1517 | 
            +
            </span><span class="marked0"><a name="line896" /> 896       normalized_scheme = self.scheme.strip.downcase if self.scheme != nil
         | 
| 1518 | 
            +
            </span><span class="marked1"><a name="line897" /> 897       normalized_scheme = "svn+ssh" if normalized_scheme == "ssh+svn"
         | 
| 1519 | 
            +
            </span><span class="marked0"><a name="line898" /> 898       if normalized_scheme == "feed"
         | 
| 1520 | 
            +
            </span><span class="marked1"><a name="line899" /> 899         if self.to_s =~ /^feed:\/*http:\/*/
         | 
| 1521 | 
            +
            </span><span class="marked0"><a name="line900" /> 900           return self.class.parse(
         | 
| 1522 | 
            +
            </span><span class="marked1"><a name="line901" /> 901             self.to_s.scan(/^feed:\/*(http:\/*.*)/).flatten[0]).normalize
         | 
| 1523 | 
            +
            </span><span class="inferred0"><a name="line902" /> 902         end
         | 
| 1524 | 
            +
            </span><span class="inferred1"><a name="line903" /> 903       end
         | 
| 1525 | 
            +
            </span><span class="marked0"><a name="line904" /> 904       normalized_user = nil
         | 
| 1526 | 
            +
            </span><span class="marked1"><a name="line905" /> 905       normalized_user = self.user.strip if self.user != nil
         | 
| 1527 | 
            +
            </span><span class="marked0"><a name="line906" /> 906       normalized_password = nil
         | 
| 1528 | 
            +
            </span><span class="marked1"><a name="line907" /> 907       normalized_password = self.password.strip if self.password != nil
         | 
| 1529 | 
            +
            </span><span class="marked0"><a name="line908" /> 908       normalized_host = nil
         | 
| 1530 | 
            +
            </span><span class="marked1"><a name="line909" /> 909       normalized_host = self.host.strip.downcase if self.host != nil
         | 
| 1531 | 
            +
            </span><span class="marked0"><a name="line910" /> 910       if normalized_host != nil
         | 
| 1532 | 
            +
            </span><span class="marked1"><a name="line911" /> 911         begin
         | 
| 1533 | 
            +
            </span><span class="marked0"><a name="line912" /> 912           normalized_host = URI::IDNA.to_ascii(normalized_host)
         | 
| 1534 | 
            +
            </span><span class="inferred1"><a name="line913" /> 913         rescue Exception
         | 
| 1535 | 
            +
            </span><span class="marked0"><a name="line914" /> 914           nil
         | 
| 1536 | 
            +
            </span><span class="inferred1"><a name="line915" /> 915         end
         | 
| 1537 | 
            +
            </span><span class="inferred0"><a name="line916" /> 916       end
         | 
| 1538 | 
            +
            </span><span class="inferred1"><a name="line917" /> 917       
         | 
| 1539 | 
            +
            </span><span class="marked0"><a name="line918" /> 918       normalized_port = self.port
         | 
| 1540 | 
            +
            </span><span class="marked1"><a name="line919" /> 919       if self.class.scheme_mapping[normalized_scheme] == normalized_port
         | 
| 1541 | 
            +
            </span><span class="marked0"><a name="line920" /> 920         normalized_port = nil
         | 
| 1542 | 
            +
            </span><span class="inferred1"><a name="line921" /> 921       end
         | 
| 1543 | 
            +
            </span><span class="marked0"><a name="line922" /> 922       normalized_path = nil
         | 
| 1544 | 
            +
            </span><span class="marked1"><a name="line923" /> 923       normalized_path = self.path.strip if self.path != nil
         | 
| 1545 | 
            +
            </span><span class="inferred0"><a name="line924" /> 924       if normalized_path == nil &&
         | 
| 1546 | 
            +
            </span><span class="marked1"><a name="line925" /> 925           normalized_scheme != nil &&
         | 
| 1547 | 
            +
            </span><span class="inferred0"><a name="line926" /> 926           normalized_host != nil
         | 
| 1548 | 
            +
            </span><span class="marked1"><a name="line927" /> 927         normalized_path = "/"
         | 
| 1549 | 
            +
            </span><span class="inferred0"><a name="line928" /> 928       end
         | 
| 1550 | 
            +
            </span><span class="marked1"><a name="line929" /> 929       if normalized_path != nil
         | 
| 1551 | 
            +
            </span><span class="marked0"><a name="line930" /> 930         normalized_path = self.class.normalize_path(normalized_path)
         | 
| 1552 | 
            +
            </span><span class="inferred1"><a name="line931" /> 931       end
         | 
| 1553 | 
            +
            </span><span class="marked0"><a name="line932" /> 932       if normalized_path == ""
         | 
| 1554 | 
            +
            </span><span class="marked1"><a name="line933" /> 933         if ["http", "https", "ftp", "tftp"].include?(normalized_scheme)
         | 
| 1555 | 
            +
            </span><span class="marked0"><a name="line934" /> 934           normalized_path = "/"
         | 
| 1556 | 
            +
            </span><span class="inferred1"><a name="line935" /> 935         end
         | 
| 1557 | 
            +
            </span><span class="inferred0"><a name="line936" /> 936       end
         | 
| 1558 | 
            +
            </span><span class="inferred1"><a name="line937" /> 937 
         | 
| 1559 | 
            +
            </span><span class="marked0"><a name="line938" /> 938       normalized_query = nil
         | 
| 1560 | 
            +
            </span><span class="marked1"><a name="line939" /> 939       normalized_query = self.query.strip if self.query != nil
         | 
| 1561 | 
            +
            </span><span class="inferred0"><a name="line940" /> 940 
         | 
| 1562 | 
            +
            </span><span class="marked1"><a name="line941" /> 941       normalized_fragment = nil
         | 
| 1563 | 
            +
            </span><span class="marked0"><a name="line942" /> 942       normalized_fragment = self.fragment.strip if self.fragment != nil
         | 
| 1564 | 
            +
            </span><span class="marked1"><a name="line943" /> 943       return Addressable::URI.parse(
         | 
| 1565 | 
            +
            </span><span class="marked0"><a name="line944" /> 944         Addressable::URI.normalized_encode(Addressable::URI.new(
         | 
| 1566 | 
            +
            </span><span class="inferred1"><a name="line945" /> 945           normalized_scheme,
         | 
| 1567 | 
            +
            </span><span class="inferred0"><a name="line946" /> 946           normalized_user,
         | 
| 1568 | 
            +
            </span><span class="inferred1"><a name="line947" /> 947           normalized_password,
         | 
| 1569 | 
            +
            </span><span class="inferred0"><a name="line948" /> 948           normalized_host,
         | 
| 1570 | 
            +
            </span><span class="inferred1"><a name="line949" /> 949           normalized_port,
         | 
| 1571 | 
            +
            </span><span class="inferred0"><a name="line950" /> 950           normalized_path,
         | 
| 1572 | 
            +
            </span><span class="inferred1"><a name="line951" /> 951           normalized_query,
         | 
| 1573 | 
            +
            </span><span class="inferred0"><a name="line952" /> 952           normalized_fragment
         | 
| 1574 | 
            +
            </span><span class="marked1"><a name="line953" /> 953         )))
         | 
| 1575 | 
            +
            </span><span class="inferred0"><a name="line954" /> 954     end
         | 
| 1576 | 
            +
            </span><span class="inferred1"><a name="line955" /> 955 
         | 
| 1577 | 
            +
            </span><span class="inferred0"><a name="line956" /> 956     # Destructively normalizes this URI object.
         | 
| 1578 | 
            +
            </span><span class="marked1"><a name="line957" /> 957     def normalize!
         | 
| 1579 | 
            +
            </span><span class="marked0"><a name="line958" /> 958       replace_self(self.normalize)
         | 
| 1580 | 
            +
            </span><span class="marked1"><a name="line959" /> 959     end
         | 
| 1581 | 
            +
            </span><span class="inferred0"><a name="line960" /> 960     
         | 
| 1582 | 
            +
            </span><span class="inferred1"><a name="line961" /> 961     # Creates a URI suitable for display to users.  If semantic attacks are
         | 
| 1583 | 
            +
            </span><span class="inferred0"><a name="line962" /> 962     # likely, the application should try to detect these and warn the user.
         | 
| 1584 | 
            +
            </span><span class="inferred1"><a name="line963" /> 963     # See RFC 3986 section 7.6 for more information.
         | 
| 1585 | 
            +
            </span><span class="marked0"><a name="line964" /> 964     def display_uri
         | 
| 1586 | 
            +
            </span><span class="marked1"><a name="line965" /> 965       display_uri = self.normalize
         | 
| 1587 | 
            +
            </span><span class="marked0"><a name="line966" /> 966       begin
         | 
| 1588 | 
            +
            </span><span class="marked1"><a name="line967" /> 967         display_uri.instance_variable_set("@host",
         | 
| 1589 | 
            +
            </span><span class="marked0"><a name="line968" /> 968           URI::IDNA.to_unicode(display_uri.host))
         | 
| 1590 | 
            +
            </span><span class="inferred1"><a name="line969" /> 969       rescue Exception
         | 
| 1591 | 
            +
            </span><span class="marked0"><a name="line970" /> 970         nil
         | 
| 1592 | 
            +
            </span><span class="inferred1"><a name="line971" /> 971       end
         | 
| 1593 | 
            +
            </span><span class="marked0"><a name="line972" /> 972       return display_uri
         | 
| 1594 | 
            +
            </span><span class="inferred1"><a name="line973" /> 973     end
         | 
| 1595 | 
            +
            </span><span class="inferred0"><a name="line974" /> 974     
         | 
| 1596 | 
            +
            </span><span class="inferred1"><a name="line975" /> 975     # Returns true if the URI objects are equal.  This method normalizes
         | 
| 1597 | 
            +
            </span><span class="inferred0"><a name="line976" /> 976     # both URIs before doing the comparison, and allows comparison against
         | 
| 1598 | 
            +
            </span><span class="inferred1"><a name="line977" /> 977     # strings.
         | 
| 1599 | 
            +
            </span><span class="marked0"><a name="line978" /> 978     def ===(uri)
         | 
| 1600 | 
            +
            </span><span class="marked1"><a name="line979" /> 979       uri_string = nil
         | 
| 1601 | 
            +
            </span><span class="marked0"><a name="line980" /> 980       if uri.respond_to?(:normalize)
         | 
| 1602 | 
            +
            </span><span class="marked1"><a name="line981" /> 981         uri_string = uri.normalize.to_s
         | 
| 1603 | 
            +
            </span><span class="inferred0"><a name="line982" /> 982       else
         | 
| 1604 | 
            +
            </span><span class="marked1"><a name="line983" /> 983         begin
         | 
| 1605 | 
            +
            </span><span class="marked0"><a name="line984" /> 984           uri_string = URI.parse(uri.to_s).normalize.to_s
         | 
| 1606 | 
            +
            </span><span class="inferred1"><a name="line985" /> 985         rescue Exception
         | 
| 1607 | 
            +
            </span><span class="marked0"><a name="line986" /> 986           return false
         | 
| 1608 | 
            +
            </span><span class="inferred1"><a name="line987" /> 987         end
         | 
| 1609 | 
            +
            </span><span class="inferred0"><a name="line988" /> 988       end
         | 
| 1610 | 
            +
            </span><span class="marked1"><a name="line989" /> 989       return self.normalize.to_s == uri_string
         | 
| 1611 | 
            +
            </span><span class="inferred0"><a name="line990" /> 990     end
         | 
| 1612 | 
            +
            </span><span class="inferred1"><a name="line991" /> 991     
         | 
| 1613 | 
            +
            </span><span class="inferred0"><a name="line992" /> 992     # Returns true if the URI objects are equal.  This method normalizes
         | 
| 1614 | 
            +
            </span><span class="inferred1"><a name="line993" /> 993     # both URIs before doing the comparison.
         | 
| 1615 | 
            +
            </span><span class="marked0"><a name="line994" /> 994     def ==(uri)
         | 
| 1616 | 
            +
            </span><span class="marked1"><a name="line995" /> 995       return false unless uri.kind_of?(self.class) 
         | 
| 1617 | 
            +
            </span><span class="marked0"><a name="line996" /> 996       return self.normalize.to_s == uri.normalize.to_s
         | 
| 1618 | 
            +
            </span><span class="inferred1"><a name="line997" /> 997     end
         | 
| 1619 | 
            +
            </span><span class="inferred0"><a name="line998" /> 998 
         | 
| 1620 | 
            +
            </span><span class="inferred1"><a name="line999" /> 999     # Returns true if the URI objects are equal.  This method does NOT
         | 
| 1621 | 
            +
            </span><span class="inferred0"><a name="line1000" />1000     # normalize either URI before doing the comparison.
         | 
| 1622 | 
            +
            </span><span class="marked1"><a name="line1001" />1001     def eql?(uri)
         | 
| 1623 | 
            +
            </span><span class="marked0"><a name="line1002" />1002       return false unless uri.kind_of?(self.class) 
         | 
| 1624 | 
            +
            </span><span class="marked1"><a name="line1003" />1003       return self.to_s == uri.to_s
         | 
| 1625 | 
            +
            </span><span class="inferred0"><a name="line1004" />1004     end
         | 
| 1626 | 
            +
            </span><span class="inferred1"><a name="line1005" />1005     
         | 
| 1627 | 
            +
            </span><span class="inferred0"><a name="line1006" />1006     # Clones the URI object.
         | 
| 1628 | 
            +
            </span><span class="marked1"><a name="line1007" />1007     def dup
         | 
| 1629 | 
            +
            </span><span class="marked0"><a name="line1008" />1008       duplicated_scheme = nil
         | 
| 1630 | 
            +
            </span><span class="marked1"><a name="line1009" />1009       duplicated_scheme = self.scheme.dup if self.scheme != nil
         | 
| 1631 | 
            +
            </span><span class="marked0"><a name="line1010" />1010       duplicated_user = nil
         | 
| 1632 | 
            +
            </span><span class="marked1"><a name="line1011" />1011       duplicated_user = self.user.dup if self.user != nil
         | 
| 1633 | 
            +
            </span><span class="marked0"><a name="line1012" />1012       duplicated_password = nil
         | 
| 1634 | 
            +
            </span><span class="marked1"><a name="line1013" />1013       duplicated_password = self.password.dup if self.password != nil
         | 
| 1635 | 
            +
            </span><span class="marked0"><a name="line1014" />1014       duplicated_host = nil
         | 
| 1636 | 
            +
            </span><span class="marked1"><a name="line1015" />1015       duplicated_host = self.host.dup if self.host != nil
         | 
| 1637 | 
            +
            </span><span class="marked0"><a name="line1016" />1016       duplicated_port = self.port
         | 
| 1638 | 
            +
            </span><span class="marked1"><a name="line1017" />1017       duplicated_path = nil
         | 
| 1639 | 
            +
            </span><span class="marked0"><a name="line1018" />1018       duplicated_path = self.path.dup if self.path != nil
         | 
| 1640 | 
            +
            </span><span class="marked1"><a name="line1019" />1019       duplicated_query = nil
         | 
| 1641 | 
            +
            </span><span class="marked0"><a name="line1020" />1020       duplicated_query = self.query.dup if self.query != nil
         | 
| 1642 | 
            +
            </span><span class="marked1"><a name="line1021" />1021       duplicated_fragment = nil
         | 
| 1643 | 
            +
            </span><span class="marked0"><a name="line1022" />1022       duplicated_fragment = self.fragment.dup if self.fragment != nil
         | 
| 1644 | 
            +
            </span><span class="marked1"><a name="line1023" />1023       duplicated_uri = Addressable::URI.new(
         | 
| 1645 | 
            +
            </span><span class="inferred0"><a name="line1024" />1024         duplicated_scheme,
         | 
| 1646 | 
            +
            </span><span class="inferred1"><a name="line1025" />1025         duplicated_user,
         | 
| 1647 | 
            +
            </span><span class="inferred0"><a name="line1026" />1026         duplicated_password,
         | 
| 1648 | 
            +
            </span><span class="inferred1"><a name="line1027" />1027         duplicated_host,
         | 
| 1649 | 
            +
            </span><span class="inferred0"><a name="line1028" />1028         duplicated_port,
         | 
| 1650 | 
            +
            </span><span class="inferred1"><a name="line1029" />1029         duplicated_path,
         | 
| 1651 | 
            +
            </span><span class="inferred0"><a name="line1030" />1030         duplicated_query,
         | 
| 1652 | 
            +
            </span><span class="inferred1"><a name="line1031" />1031         duplicated_fragment
         | 
| 1653 | 
            +
            </span><span class="inferred0"><a name="line1032" />1032       )
         | 
| 1654 | 
            +
            </span><span class="marked1"><a name="line1033" />1033       @specified_port = nil if !defined?(@specified_port)
         | 
| 1655 | 
            +
            </span><span class="marked0"><a name="line1034" />1034       duplicated_uri.instance_variable_set("@specified_port", @specified_port)
         | 
| 1656 | 
            +
            </span><span class="marked1"><a name="line1035" />1035       return duplicated_uri
         | 
| 1657 | 
            +
            </span><span class="inferred0"><a name="line1036" />1036     end
         | 
| 1658 | 
            +
            </span><span class="inferred1"><a name="line1037" />1037     
         | 
| 1659 | 
            +
            </span><span class="inferred0"><a name="line1038" />1038     # Returns the assembled URI as a string.
         | 
| 1660 | 
            +
            </span><span class="marked1"><a name="line1039" />1039     def to_s
         | 
| 1661 | 
            +
            </span><span class="marked0"><a name="line1040" />1040       uri_string = ""
         | 
| 1662 | 
            +
            </span><span class="marked1"><a name="line1041" />1041       uri_string << "#{self.scheme}:" if self.scheme != nil
         | 
| 1663 | 
            +
            </span><span class="marked0"><a name="line1042" />1042       uri_string << "//#{self.authority}" if self.authority != nil
         | 
| 1664 | 
            +
            </span><span class="marked1"><a name="line1043" />1043       uri_string << self.path.to_s
         | 
| 1665 | 
            +
            </span><span class="marked0"><a name="line1044" />1044       uri_string << "?#{self.query}" if self.query != nil
         | 
| 1666 | 
            +
            </span><span class="marked1"><a name="line1045" />1045       uri_string << "##{self.fragment}" if self.fragment != nil
         | 
| 1667 | 
            +
            </span><span class="marked0"><a name="line1046" />1046       return uri_string
         | 
| 1668 | 
            +
            </span><span class="inferred1"><a name="line1047" />1047     end
         | 
| 1669 | 
            +
            </span><span class="inferred0"><a name="line1048" />1048     
         | 
| 1670 | 
            +
            </span><span class="inferred1"><a name="line1049" />1049     # Returns a Hash of the URI segments.
         | 
| 1671 | 
            +
            </span><span class="marked0"><a name="line1050" />1050     def to_h
         | 
| 1672 | 
            +
            </span><span class="inferred1"><a name="line1051" />1051       return {
         | 
| 1673 | 
            +
            </span><span class="marked0"><a name="line1052" />1052         :scheme => self.scheme,
         | 
| 1674 | 
            +
            </span><span class="marked1"><a name="line1053" />1053         :user => self.user,
         | 
| 1675 | 
            +
            </span><span class="marked0"><a name="line1054" />1054         :password => self.password,
         | 
| 1676 | 
            +
            </span><span class="marked1"><a name="line1055" />1055         :host => self.host,
         | 
| 1677 | 
            +
            </span><span class="marked0"><a name="line1056" />1056         :port => self.specified_port,
         | 
| 1678 | 
            +
            </span><span class="marked1"><a name="line1057" />1057         :path => self.path,
         | 
| 1679 | 
            +
            </span><span class="marked0"><a name="line1058" />1058         :query => self.query,
         | 
| 1680 | 
            +
            </span><span class="marked1"><a name="line1059" />1059         :fragment => self.fragment
         | 
| 1681 | 
            +
            </span><span class="marked0"><a name="line1060" />1060       }
         | 
| 1682 | 
            +
            </span><span class="marked1"><a name="line1061" />1061     end
         | 
| 1683 | 
            +
            </span><span class="inferred0"><a name="line1062" />1062     
         | 
| 1684 | 
            +
            </span><span class="inferred1"><a name="line1063" />1063     # Returns a string representation of the URI object's state.
         | 
| 1685 | 
            +
            </span><span class="marked0"><a name="line1064" />1064     def inspect
         | 
| 1686 | 
            +
            </span><span class="marked1"><a name="line1065" />1065       sprintf("#<%s:%#0x URI:%s>", self.class.to_s, self.object_id, self.to_s)
         | 
| 1687 | 
            +
            </span><span class="marked0"><a name="line1066" />1066     end
         | 
| 1688 | 
            +
            </span><span class="inferred1"><a name="line1067" />1067     
         | 
| 1689 | 
            +
            </span><span class="inferred0"><a name="line1068" />1068     # This module handles internationalized domain names.  When Ruby has an
         | 
| 1690 | 
            +
            </span><span class="inferred1"><a name="line1069" />1069     # implementation of nameprep, stringprep, punycode, etc, this
         | 
| 1691 | 
            +
            </span><span class="inferred0"><a name="line1070" />1070     # module should contain an actual implementation of IDNA instead of
         | 
| 1692 | 
            +
            </span><span class="inferred1"><a name="line1071" />1071     # returning nil if libidn can't be used.
         | 
| 1693 | 
            +
            </span><span class="marked0"><a name="line1072" />1072     module IDNA
         | 
| 1694 | 
            +
            </span><span class="inferred1"><a name="line1073" />1073       # Returns the ascii representation of the label.
         | 
| 1695 | 
            +
            </span><span class="marked0"><a name="line1074" />1074       def self.to_ascii(label)
         | 
| 1696 | 
            +
            </span><span class="marked1"><a name="line1075" />1075         return nil if label.nil?
         | 
| 1697 | 
            +
            </span><span class="marked0"><a name="line1076" />1076         if self.use_libidn?
         | 
| 1698 | 
            +
            </span><span class="marked1"><a name="line1077" />1077           return IDN::Idna.toASCII(label)
         | 
| 1699 | 
            +
            </span><span class="inferred0"><a name="line1078" />1078         else
         | 
| 1700 | 
            +
            </span><span class="marked1"><a name="line1079" />1079           raise NotImplementedError,
         | 
| 1701 | 
            +
            </span><span class="inferred0"><a name="line1080" />1080             "There is no available pure-ruby implementation.  " +
         | 
| 1702 | 
            +
            </span><span class="inferred1"><a name="line1081" />1081             "Install libidn bindings."
         | 
| 1703 | 
            +
            </span><span class="inferred0"><a name="line1082" />1082         end
         | 
| 1704 | 
            +
            </span><span class="inferred1"><a name="line1083" />1083       end
         | 
| 1705 | 
            +
            </span><span class="inferred0"><a name="line1084" />1084       
         | 
| 1706 | 
            +
            </span><span class="inferred1"><a name="line1085" />1085       # Returns the unicode representation of the label.
         | 
| 1707 | 
            +
            </span><span class="marked0"><a name="line1086" />1086       def self.to_unicode(label)
         | 
| 1708 | 
            +
            </span><span class="marked1"><a name="line1087" />1087         return nil if label.nil?
         | 
| 1709 | 
            +
            </span><span class="marked0"><a name="line1088" />1088         if self.use_libidn?
         | 
| 1710 | 
            +
            </span><span class="marked1"><a name="line1089" />1089           return IDN::Idna.toUnicode(label)
         | 
| 1711 | 
            +
            </span><span class="inferred0"><a name="line1090" />1090         else
         | 
| 1712 | 
            +
            </span><span class="marked1"><a name="line1091" />1091           raise NotImplementedError,
         | 
| 1713 | 
            +
            </span><span class="inferred0"><a name="line1092" />1092             "There is no available pure-ruby implementation.  " +
         | 
| 1714 | 
            +
            </span><span class="inferred1"><a name="line1093" />1093             "Install libidn bindings."
         | 
| 1715 | 
            +
            </span><span class="inferred0"><a name="line1094" />1094         end
         | 
| 1716 | 
            +
            </span><span class="inferred1"><a name="line1095" />1095       end
         | 
| 1717 | 
            +
            </span><span class="inferred0"><a name="line1096" />1096       
         | 
| 1718 | 
            +
            </span><span class="marked1"><a name="line1097" />1097     private
         | 
| 1719 | 
            +
            </span><span class="inferred0"><a name="line1098" />1098       # Determines if the libidn bindings are available and able to be used.
         | 
| 1720 | 
            +
            </span><span class="marked1"><a name="line1099" />1099       def self.use_libidn?
         | 
| 1721 | 
            +
            </span><span class="marked0"><a name="line1100" />1100         if !defined?(@use_libidn) || @use_libidn.nil?
         | 
| 1722 | 
            +
            </span><span class="marked1"><a name="line1101" />1101           begin
         | 
| 1723 | 
            +
            </span><span class="marked0"><a name="line1102" />1102             require 'rubygems'
         | 
| 1724 | 
            +
            </span><span class="inferred1"><a name="line1103" />1103           rescue LoadError
         | 
| 1725 | 
            +
            </span><span class="marked0"><a name="line1104" />1104             nil
         | 
| 1726 | 
            +
            </span><span class="inferred1"><a name="line1105" />1105           end
         | 
| 1727 | 
            +
            </span><span class="marked0"><a name="line1106" />1106           begin
         | 
| 1728 | 
            +
            </span><span class="marked1"><a name="line1107" />1107             require 'idn'
         | 
| 1729 | 
            +
            </span><span class="inferred0"><a name="line1108" />1108           rescue LoadError
         | 
| 1730 | 
            +
            </span><span class="marked1"><a name="line1109" />1109             nil
         | 
| 1731 | 
            +
            </span><span class="inferred0"><a name="line1110" />1110           end
         | 
| 1732 | 
            +
            </span><span class="marked1"><a name="line1111" />1111           @use_libidn = !!(defined?(IDN::Idna))
         | 
| 1733 | 
            +
            </span><span class="inferred0"><a name="line1112" />1112         end
         | 
| 1734 | 
            +
            </span><span class="marked1"><a name="line1113" />1113         return @use_libidn
         | 
| 1735 | 
            +
            </span><span class="inferred0"><a name="line1114" />1114       end
         | 
| 1736 | 
            +
            </span><span class="inferred1"><a name="line1115" />1115     end
         | 
| 1737 | 
            +
            </span><span class="inferred0"><a name="line1116" />1116     
         | 
| 1738 | 
            +
            </span><span class="marked1"><a name="line1117" />1117   private
         | 
| 1739 | 
            +
            </span><span class="inferred0"><a name="line1118" />1118     # Resolves paths to their simplest form.
         | 
| 1740 | 
            +
            </span><span class="marked1"><a name="line1119" />1119     def self.normalize_path(path)
         | 
| 1741 | 
            +
            </span><span class="marked0"><a name="line1120" />1120       return nil if path.nil?
         | 
| 1742 | 
            +
            </span><span class="marked1"><a name="line1121" />1121       normalized_path = path.dup
         | 
| 1743 | 
            +
            </span><span class="marked0"><a name="line1122" />1122       previous_state = normalized_path.dup
         | 
| 1744 | 
            +
            </span><span class="inferred1"><a name="line1123" />1123       begin
         | 
| 1745 | 
            +
            </span><span class="marked0"><a name="line1124" />1124         previous_state = normalized_path.dup
         | 
| 1746 | 
            +
            </span><span class="marked1"><a name="line1125" />1125         normalized_path.gsub!(/\/\.\//, "/")
         | 
| 1747 | 
            +
            </span><span class="marked0"><a name="line1126" />1126         normalized_path.gsub!(/\/\.$/, "/")
         | 
| 1748 | 
            +
            </span><span class="marked1"><a name="line1127" />1127         parent = normalized_path.scan(/\/([^\/]+)\/\.\.\//).flatten[0]
         | 
| 1749 | 
            +
            </span><span class="marked0"><a name="line1128" />1128         if parent != "." && parent != ".."
         | 
| 1750 | 
            +
            </span><span class="marked1"><a name="line1129" />1129           normalized_path.gsub!(/\/#{parent}\/\.\.\//, "/")
         | 
| 1751 | 
            +
            </span><span class="inferred0"><a name="line1130" />1130         end
         | 
| 1752 | 
            +
            </span><span class="marked1"><a name="line1131" />1131         parent = normalized_path.scan(/\/([^\/]+)\/\.\.$/).flatten[0]
         | 
| 1753 | 
            +
            </span><span class="marked0"><a name="line1132" />1132         if parent != "." && parent != ".."
         | 
| 1754 | 
            +
            </span><span class="marked1"><a name="line1133" />1133           normalized_path.gsub!(/\/#{parent}\/\.\.$/, "/")
         | 
| 1755 | 
            +
            </span><span class="inferred0"><a name="line1134" />1134         end
         | 
| 1756 | 
            +
            </span><span class="marked1"><a name="line1135" />1135         normalized_path.gsub!(/^\.\.?\/?/, "")
         | 
| 1757 | 
            +
            </span><span class="marked0"><a name="line1136" />1136         normalized_path.gsub!(/^\/\.\.?\//, "/")
         | 
| 1758 | 
            +
            </span><span class="marked1"><a name="line1137" />1137       end until previous_state == normalized_path
         | 
| 1759 | 
            +
            </span><span class="marked0"><a name="line1138" />1138       return normalized_path
         | 
| 1760 | 
            +
            </span><span class="inferred1"><a name="line1139" />1139     end
         | 
| 1761 | 
            +
            </span><span class="inferred0"><a name="line1140" />1140 
         | 
| 1762 | 
            +
            </span><span class="inferred1"><a name="line1141" />1141     # Ensures that the URI is valid.
         | 
| 1763 | 
            +
            </span><span class="marked0"><a name="line1142" />1142     def validate
         | 
| 1764 | 
            +
            </span><span class="marked1"><a name="line1143" />1143       if self.scheme == nil && self.user == nil && self.password == nil &&
         | 
| 1765 | 
            +
            </span><span class="marked0"><a name="line1144" />1144           self.host == nil && self.port == nil && self.path == nil &&
         | 
| 1766 | 
            +
            </span><span class="marked1"><a name="line1145" />1145           self.query == nil && self.fragment == nil
         | 
| 1767 | 
            +
            </span><span class="marked0"><a name="line1146" />1146         raise InvalidURIError, "All segments were nil."
         | 
| 1768 | 
            +
            </span><span class="inferred1"><a name="line1147" />1147       end
         | 
| 1769 | 
            +
            </span><span class="marked0"><a name="line1148" />1148       if self.scheme != nil &&
         | 
| 1770 | 
            +
            </span><span class="marked1"><a name="line1149" />1149           (self.host == nil || self.host == "") &&
         | 
| 1771 | 
            +
            </span><span class="marked0"><a name="line1150" />1150           (self.path == nil || self.path == "")
         | 
| 1772 | 
            +
            </span><span class="marked1"><a name="line1151" />1151         raise InvalidURIError,
         | 
| 1773 | 
            +
            </span><span class="inferred0"><a name="line1152" />1152           "Absolute URI missing hierarchical segment."
         | 
| 1774 | 
            +
            </span><span class="inferred1"><a name="line1153" />1153       end
         | 
| 1775 | 
            +
            </span><span class="inferred0"><a name="line1154" />1154     end
         | 
| 1776 | 
            +
            </span><span class="inferred1"><a name="line1155" />1155     
         | 
| 1777 | 
            +
            </span><span class="inferred0"><a name="line1156" />1156     # Replaces the internal state of self with the specified URI's state.
         | 
| 1778 | 
            +
            </span><span class="inferred1"><a name="line1157" />1157     # Used in destructive operations to avoid massive code repetition.
         | 
| 1779 | 
            +
            </span><span class="marked0"><a name="line1158" />1158     def replace_self(uri)
         | 
| 1780 | 
            +
            </span><span class="inferred1"><a name="line1159" />1159       # Reset dependant values
         | 
| 1781 | 
            +
            </span><span class="marked0"><a name="line1160" />1160       @userinfo = nil
         | 
| 1782 | 
            +
            </span><span class="marked1"><a name="line1161" />1161       @authority = nil
         | 
| 1783 | 
            +
            </span><span class="inferred0"><a name="line1162" />1162       
         | 
| 1784 | 
            +
            </span><span class="marked1"><a name="line1163" />1163       @scheme = uri.scheme
         | 
| 1785 | 
            +
            </span><span class="marked0"><a name="line1164" />1164       @user = uri.user
         | 
| 1786 | 
            +
            </span><span class="marked1"><a name="line1165" />1165       @password = uri.password
         | 
| 1787 | 
            +
            </span><span class="marked0"><a name="line1166" />1166       @host = uri.host
         | 
| 1788 | 
            +
            </span><span class="marked1"><a name="line1167" />1167       @specified_port = uri.instance_variable_get("@specified_port")
         | 
| 1789 | 
            +
            </span><span class="marked0"><a name="line1168" />1168       @port = @specified_port.to_s.to_i
         | 
| 1790 | 
            +
            </span><span class="marked1"><a name="line1169" />1169       @path = uri.path
         | 
| 1791 | 
            +
            </span><span class="marked0"><a name="line1170" />1170       @query = uri.query
         | 
| 1792 | 
            +
            </span><span class="marked1"><a name="line1171" />1171       @fragment = uri.fragment
         | 
| 1793 | 
            +
            </span><span class="marked0"><a name="line1172" />1172       return self
         | 
| 1794 | 
            +
            </span><span class="inferred1"><a name="line1173" />1173     end
         | 
| 1795 | 
            +
            </span><span class="inferred0"><a name="line1174" />1174   end
         | 
| 1796 | 
            +
            </span><span class="inferred1"><a name="line1175" />1175 end
         | 
| 1714 1797 | 
             
            </span></pre><hr />    <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> version 0.8.0.</p><p>
         | 
| 1715 1798 | 
             
                      <a href='http://validator.w3.org/check/referer'>
         | 
| 1716 1799 | 
             
                        <img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88' />
         |