Changeset 36551 in project


Ignore:
Timestamp:
09/08/18 12:12:54 (2 months ago)
Author:
sjamaan
Message:

uri-generic: Drop unnecessary dependency on srfi-13

We used only three procedures: string-index, string-upcase and string-downcase.
string-index can be replaced relatively easily using substring-index, which is
implemented as memcmp so it might be even faster. string-upcase and
string-downcase are trivially re-implemented and for percent encoded characters
we even did this on a string which we know has only one character (in hex-digit),
so it's pointless to convert back and forth between a list, which is what these
procedures do. Instead, just take the one char and upcase it.

This should provide a (minor) performance benefit, besides dropping the useless
dependency.

Location:
release/5/uri-generic/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • release/5/uri-generic/trunk/alternatives/uri-generic.abnf.scm

    r33645 r36551  
    4343;; What to do with these?
    4444;; #;(cond-expand
    45 ;;    (utf8-strings (use utf8-srfi-13 utf8-srfi-14))
    46 ;;    (else (use srfi-13 srfi-14)))
     45;;    (utf8-strings (use utf8-srfi-14))
     46;;    (else (use srfi-14)))
    4747
    4848(define-record-type <URI>
     
    382382
    383383;; Section 4.2; if the first segment contains a colon, it must be prefixed "./"
    384 (define (protect? sa) (string-index sa #\:))
     384(define (protect? sa) (substring-index ":" sa))
    385385
    386386; specific: ((uri-authority uri) (uri-path uri) (uri-query uri)).
     
    401401
    402402(define (uri-normalize-case uri)
    403   (let* ((normalized-uri (uri-reference
     403  (let* ((downcase (lambda (s)
     404                     (list->string (map char-downcase (string->list s)))))
     405         (normalized-uri (uri-reference
    404406                          (normalize-pct-encoding (uri->string uri (lambda (user pass) (conc user ":" pass))))))
    405          (scheme         (string->symbol (string-downcase (->string (uri-scheme uri)))))
    406          (host           (normalize-pct-encoding (string-downcase (uri-host uri)))))
     407         (scheme         (string->symbol (downcase (->string (uri-scheme uri)))))
     408         (host           (normalize-pct-encoding (downcase (uri-host uri)))))
    407409    (update-uri* normalized-uri 'scheme scheme 'host host)))
    408410
     
    422424  (define (hex-digit i)
    423425    (and (>= i 0) (< i 16)
    424          (car (string->list (string-upcase (number->string i 16))))))
     426         (char-upcase (string-ref (number->string i 16) 0))))
    425427  (define (pct-encode c)
    426428    (let ((i (char->integer c)))
  • release/5/uri-generic/trunk/alternatives/uri-generic.comparse.scm

    r33646 r36551  
    3939;; What to do with these?
    4040;; #;(cond-expand
    41 ;;    (utf8-strings (use utf8-srfi-13 utf8-srfi-14))
    42 ;;    (else (use srfi-13 srfi-14)))
     41;;    (utf8-strings (use utf8-srfi-14))
     42;;    (else (use srfi-14)))
    4343
    4444(define-record-type <URI>
     
    379379
    380380;; Section 4.2; if the first segment contains a colon, it must be prefixed "./"
    381 (define (protect? sa) (string-index sa #\:))
     381(define (protect? sa) (substring-index ":" sa))
    382382
    383383; specific: ((uri-authority uri) (uri-path uri) (uri-query uri)).
     
    398398
    399399(define (uri-normalize-case uri)
    400   (let* ((normalized-uri (uri-reference
     400  (let* ((downcase (lambda (s)
     401                     (list->string (map char-downcase (string->list s)))))
     402         (normalized-uri (uri-reference
    401403                          (normalize-pct-encoding (uri->string uri (lambda (user pass) (conc user ":" pass))))))
    402          (scheme         (string->symbol (string-downcase (->string (uri-scheme uri)))))
    403          (host           (normalize-pct-encoding (string-downcase (uri-host uri)))))
     404         (scheme         (string->symbol (downcase (->string (uri-scheme uri)))))
     405         (host           (normalize-pct-encoding (downcase (uri-host uri)))))
    404406    (update-uri* normalized-uri 'scheme scheme 'host host)))
    405407
     
    412414  (define (hex-digit i)
    413415    (and (>= i 0) (< i 16)
    414          (car (string->list (string-upcase (number->string i 16))))))
     416         (char-upcase (string-ref (number->string i 16) 0))))
    415417  (define (pct-encode c)
    416418    (let ((i (char->integer c)))
  • release/5/uri-generic/trunk/alternatives/uri-generic.irregex.scm

    r30841 r36551  
    4242;; What to do with these?
    4343;; #;(cond-expand
    44 ;;    (utf8-strings (use utf8-srfi-13 utf8-srfi-14))
    45 ;;    (else (use srfi-13 srfi-14)))
     44;;    (utf8-strings (use utf8-srfi-14))
     45;;    (else (use srfi-14)))
    4646
    4747(define-record-type <URI>
     
    367367
    368368;; Section 4.2; if the first segment contains a colon, it must be prefixed "./"
    369 (define (protect? sa) (string-index sa #\:))
     369(define (protect? sa) (substring-index ":" sa))
    370370
    371371; specific: ((uri-authority uri) (uri-path uri) (uri-query uri)).
     
    386386
    387387(define (uri-normalize-case uri)
    388   (let* ((normalized-uri (uri-reference
     388  (let* ((downcase (lambda (s)
     389                     (list->string (map char-downcase (string->list s)))))
     390         (normalized-uri (uri-reference
    389391                          (normalize-pct-encoding (uri->string uri (lambda (user pass) (conc user ":" pass))))))
    390          (scheme         (string->symbol (string-downcase (->string (uri-scheme uri)))))
    391          (host           (normalize-pct-encoding (string-downcase (uri-host uri)))))
     392         (scheme         (string->symbol (downcase (->string (uri-scheme uri)))))
     393         (host           (normalize-pct-encoding (downcase (uri-host uri)))))
    392394    (update-uri* normalized-uri 'scheme scheme 'host host)))
    393395
     
    400402  (define (hex-digit i)
    401403    (and (>= i 0) (< i 16)
    402          (car (string->list (string-upcase (number->string i 16))))))
     404         (char-upcase (string-ref (number->string i 16) 0))))
    403405  (define (pct-encode c)
    404406    (let ((i (char->integer c)))
  • release/5/uri-generic/trunk/alternatives/uri-generic.matchable.scm

    r33643 r36551  
    44;; Based on the Haskell URI library by  Graham Klyne <gk@ninebynine.org>.
    55;;
    6 ;; Copyright 2008-2016 Ivan Raikov, Peter Bex, Seth Alves.
     6;; Copyright 2008-2018 Ivan Raikov, Peter Bex, Seth Alves.
    77;;
    88;;
     
    4141  (uri-reference make-uri update-uri update-authority
    4242   uri-reference? uri-auth uri-authority uri-scheme uri-path uri-query
    43    uri-fragment uri-host uri-port uri-username uri-password
    44    authority? authority-host authority-port
     43   uri-fragment uri-host uri-ipv6-host? uri-port
     44   uri-username uri-password
     45   authority? authority-host authority-ipv6-host? authority-port
    4546   authority-username authority-password
    4647   
     
    5455   char-set:uri-reserved char-set:uri-unreserved)
    5556
    56 (import chicken scheme)
    57  
    58 (use extras data-structures ports matchable
    59      srfi-1 srfi-4 srfi-13 srfi-14)
    60 
     57(import scheme (chicken base) (chicken string) (chicken port)
     58        (chicken format) srfi-1 srfi-4 srfi-14 matchable)
    6159
    6260(define uri-error error)
     
    7674;; What to do with these?
    7775;; #;(cond-expand
    78 ;;    (utf8-strings (use utf8-srfi-13 utf8-srfi-14))
    79 ;;    (else (use srfi-13 srfi-14)))
     76;;    (utf8-strings (use utf8-srfi-14))
     77;;    (else (use srfi-14)))
    8078
    8179(define-record-type <URI>
     
    8987
    9088(define-record-type <URIAuth>
    91   (make-URIAuth username password host port)
     89  (make-URIAuth username password host ipv6-host? port)
    9290  URIAuth?
    9391  (username URIAuth-username URIAuth-username-set!)
    9492  (password URIAuth-password URIAuth-password-set!)
    9593  (host URIAuth-host URIAuth-host-set!)
     94  (ipv6-host? URIAuth-ipv6-host? URIAuth-ipv6-host?-set!)
    9695  (port URIAuth-port URIAuth-port-set!))
    9796
     
    108107 
    109108  (define-record-printer (<URIAuth> x out)
    110     (fprintf out "#(URIAuth host=~S port=~A)"
     109    (fprintf out "#(URIAuth host=~S~A port=~A)"
    111110             (URIAuth-host x)
     111             (if (URIAuth-ipv6-host? x) "(ipv6)" "")
    112112             (URIAuth-port x))))
    113113 (else))
     
    136136
    137137
     138(define (is-ipv6-host? h) (and (substring-index ":" h) #t))
     139
    138140(define (update-URIAuth uri-auth . args)
    139141  (let loop ((args args)
     
    141143             (new-password (URIAuth-password uri-auth))
    142144             (new-host (URIAuth-host uri-auth))
     145             (new-ipv6-host? (URIAuth-ipv6-host? uri-auth))
    143146             (new-port (URIAuth-port uri-auth)))
    144147    (cond ((null? args)
    145            (make-URIAuth new-username new-password new-host new-port))
     148           (make-URIAuth new-username new-password
     149                         new-host new-ipv6-host? new-port))
    146150          ((null? (cdr args))
    147151           (uri-error "malformed arguments to update-URIAuth"))
     
    153157                   (if (eq? key 'password) value new-password)
    154158                   (if (eq? key 'host) value new-host)
     159                   (if (eq? key 'host)
     160                       (is-ipv6-host? value)
     161                       new-ipv6-host?)
    155162                   (if (eq? key 'port) value new-port)))))))
    156163
     
    169176    (and auth (URIAuth-host auth))))
    170177
     178(define (uri-ipv6-host? x)
     179  (let ((auth (URI-authority x)))
     180    (and auth (URIAuth-ipv6-host? auth))))
     181
    171182(define (uri-port x)
    172183  (let ((auth (URI-authority x)))
     
    183194(define authority? URIAuth?)
    184195(define authority-host URIAuth-host)
     196(define authority-ipv6-host? URIAuth-ipv6-host?)
    185197(define authority-port URIAuth-port)
    186198(define authority-username URIAuth-username)
     
    207219                            ((not (eq? unset authority)) authority)
    208220                            (else (URI-authority uri)))
    209                              (make-URIAuth #f #f #f #f)))
     221                             (make-URIAuth #f #f #f #f #f)))
    210222                 (updated-auth (apply update-authority base-auth args))
    211                  (final-auth (if (uri-auth-equal? (make-URIAuth #f #f #f #f)
    212                                                   updated-auth)
    213                                #f
    214                                updated-auth)))
     223                 (final-auth (if (uri-auth-equal?
     224                                  (make-URIAuth #f #f #f #f #f)
     225                                  updated-auth)
     226                                 #f
     227                                 updated-auth)))
    215228            (make-URI scheme final-auth path query fragment)))
    216229         ((null? (cdr key/values))
     
    297310       (equal? (URIAuth-password a) (URIAuth-password b))
    298311       (equal? (URIAuth-host a) (URIAuth-host b))
     312       ;; Should always be equal if hosts are equal
     313       ;; (equal? (URIAuth-ipv6-host? a) (URIAuth-ipv6-host? b))
    299314       (equal? (URIAuth-port a) (URIAuth-port b)))))
    300315
     
    391406
    392407(define (consume-min-max m n f)
    393   (lambda (s) 
     408  (lambda (s)
    394409    (let loop ((m m) (n n) (lst (list)) (rst s))
    395410      (cond ((positive? m)
     
    398413                    (else #f)))
    399414            ((<= n 0)   (list (reverse lst) rst))
    400             (else
    401              (match (f rst)
    402                     ((a1 rst) (loop 0 (- n 1) (cons a1 lst) rst))
    403                     (else #f)))))))
     415            (else
     416             (match (f rst)
     417                    ((a1 rst) (loop 0 (- n 1) (cons a1 lst) rst))
     418                    (else (list (reverse lst) rst))))
     419            ))
     420    ))
    404421
    405422;; Helper function for malformed ip address error messages
     
    418435  (define (hex-digit i)
    419436    (and (>= i 0) (< i 16)
    420          (car (string->list (string-upcase (number->string i 16))))))
     437         (char-upcase (string-ref (number->string i 16) 0))))
    421438  (reverse (fold (lambda (c cl)
    422439                   (if (char-set-contains? char-set c)
     
    537554               ((uh rst)      (host rst))
    538555               ((up rst)      (or (port rst) (list #f rst))))
    539               (list
    540                (make-URIAuth
    541                 (and uu (uri-char-list->string uu))
    542                 (and uw (uri-char-list->string uw))
    543                 (uri-char-list->string uh)
    544                 (and (pair? up) (string->number (list->string up))))
    545                     rst)))
     556    (let ((host (uri-char-list->string uh)))
     557      (list
     558       (make-URIAuth
     559        (and uu (uri-char-list->string uu))
     560        (and uw (uri-char-list->string uw))
     561        host
     562        (is-ipv6-host? host)
     563        (and (pair? up) (string->number (list->string up))))
     564       rst))))
    546565
    547566;;  RFC3986, section 3.2.1
     
    584603
    585604(define (ip-literal s)
    586   (match s ((#\[ . rst) 
    587             (match (or (ipv6-address rst) (ipv-future rst))
    588                    ((ua (#\] . rst))  (list ua rst))
     605  (match s ((#\[ . rst)
     606            (match (or (ipv6-address rst) (ipv-future rst))
     607                   ((ua (#\] . rst))  (list ua rst))
    589608                   (else (uri-error 'ip-literal "malformed ip literal"
    590                                 (try-ip-literal->string rst)))))
     609                                    (try-ip-literal->string rst)))))
    591610         (else #f)))
    592611
     
    594613
    595614(define (ipv-future s)
    596   (match s ((#\v (? hexdigit-char?) #\. . rst)  (ipv-future0 rst))
     615  (match s ((#\v (and a1 (? hexdigit-char?)) #\. . rst)
     616            (match (ipv-future0 rst)
     617              ((ar rst) (list (append (list #\v a1 #\.) ar) rst))
     618              (else #f)))
    597619         (else #f)))
    598620
    599621(define char-set:ipv-future
    600   (char-set-union char-set:uri-unreserved char-set:sub-delims (char-set #\;)))
     622  (char-set-union char-set:uri-unreserved char-set:sub-delims (char-set #\:)))
    601623
    602624
     
    621643(define (ipv6-address s)
    622644  (or (match (u6-h4c s) ;; 6( h16 ":" ) ls32
    623 
    624              ((a2 rst)  (match (ls32 rst)
    625                                ((a3 rst)  (list (append (concatenate a2) a3) rst))
    626                                (else #f)))
     645             ((a2 rst) (match (ls32 rst)
     646                              ((a3 rst)  (list (append (concatenate a2) a3) rst))
     647                              (else #f)))
    627648             (else #f))
    628649      (match s          ;; "::" 5( h16 ":" ) ls32
    629              ((#\: #\: . rst) 
    630               (match (u5-h4c rst)
    631                      ((a2 rst)  (match (ls32 rst)
    632                                        ((a3 rst)  (list (append (list #\: #\:) (concatenate a2) a3) rst))
    633                                        (else #f)))))
    634              (else #f))
     650             ((#\: #\: . rst) 
     651              (match (u5-h4c rst)
     652                     ((a2 rst)  (match (ls32 rst)
     653                                       ((a3 rst)  (list (append (list #\: #\:) (concatenate a2) a3) rst))
     654                                       (else #f)))
     655                     (else #f)))
     656             (else #f))
    635657      (match (u_opt_n_h4c_h4 0 s)
    636              ((a1 rst) (match rst
    637                               ((#\: #\: . rst) 
    638                                (match (u4-h4c rst)
    639                                       ((a2 rst)  (match (ls32 rst)
    640                                                         ((a3 rst) 
    641                                                         (list (append (concatenate a1) (list #\: #\:)
    642                                                                        (concatenate a2) a3) rst))
    643                                                         (else #f)))
    644                                       (else #f)
    645                                       ))
    646                               (else #f)))
    647               (else #f))
     658             ((a1 rst) (match rst
     659                              ((#\: #\: . rst) 
     660                               (match (u4-h4c rst)
     661                                      ((a2 rst)  (match (ls32 rst)
     662                                                        ((a3 rst) 
     663                                                        (list (append (concatenate a1) (list #\: #\:)
     664                                                                       (concatenate a2) a3) rst))
     665                                                        (else #f)))
     666                                      (else #f)
     667                                      ))
     668                              (else #f)))
     669             (else #f))
    648670      (match (u_opt_n_h4c_h4 1 s)
    649671             ((a1 rst)
     
    678700                                      ((a2 rst)  (match (ls32 rst)
    679701                                                        ((a3 rst)  (list (append (concatenate a1) (list #\: #\:)
    680                                                                                  (concatenate a2) a3) rst))
     702                                                                                 a2 a3) rst))
    681703                                                        (else #f)))
    682704                                      (else #f)
     
    691713                                      (else #f)))
    692714                              (else #f)))
    693               (else #f))
     715             (else #f))
    694716      (match (u_opt_n_h4c_h4 5 s)
    695              ((a1 rst) (match rst       
    696                               ((#\: #\: . rst) 
    697                                (match (h4 rst)
    698                                       ((a3 rst)  (list (append (concatenate a1) (list #\: #\:) a3) rst))
    699                                       (else #f)))
    700                               (else #f)))
    701               (else #f))
     717             ((a1 rst) (match rst       
     718                              ((#\: #\: . rst)
     719                               (match (h4 rst)
     720                                      ((a3 rst)  (list (append (concatenate a1) (list #\: #\:) a3) rst))
     721                                      (else #f)))
     722                              (else #f)))
     723               (else #f))
    702724      (match (u_opt_n_h4c_h4 6 s)
    703725             ((a1 rst) (match rst       
     
    705727                               (list (append (concatenate a1) (list #\: #\:)) rst))
    706728                              (else #f)))
    707               (else #f))
    708       (uri-error 'ipv6-address "malformed ipv6 address" (try-ip-literal->string s))))
     729              (else #f))))
    709730
    710731
     
    713734  (match ((consume-min-max 0 n h4c) s)
    714735         ((a1 rst)  (match (h4 rst)
    715                            ((a2 rst) (list (append a1 (list a2)) rst))
    716                            (else #f)))
     736                           ((a2 rst) (list (append a1 (list a2)) rst))
     737                           (else (list a1 rst))))
    717738         (else #f)))
    718739
     
    959980                              (password (URIAuth-password authority))
    960981                              (host (URIAuth-host authority))
     982                              (ipv6? (URIAuth-ipv6-host? authority))
    961983                              (port (URIAuth-port authority)))
    962984                          (list "//" (and username (list (userinfomap
    963985                                                          username
    964986                                                          password) "@"))
    965                                 host (and port (list ":" port)))))
     987                                (if ipv6? "[" "") host (if ipv6? "]" "")
     988                                (and port (list ":" port)))))
    966989                   (path->string path)
    967990                   (and query (list "?" query))
     
    10001023
    10011024;; Section 4.2; if the first segment contains a colon, it must be prefixed "./"
    1002 (define (protect? sa) (string-index sa #\:))
     1025(define (protect? sa) (substring-index ":" sa))
    10031026
    10041027; specific: ((uri-authority uri) (uri-path uri) (uri-query uri)).
     
    12561279
    12571280(define (uri-normalize-case uri)
    1258   (let* ((normalized-uri (uri-reference
     1281  (let* ((downcase (lambda (s)
     1282                     (list->string (map char-downcase (string->list s)))))
     1283         (normalized-uri (uri-reference
    12591284                          (normalize-pct-encoding (uri->string uri (lambda (user pass) (conc user ":" pass))))))
    1260          (scheme         (string->symbol (string-downcase (->string (uri-scheme uri)))))
    1261          (host           (normalize-pct-encoding (string-downcase (uri-host uri)))))
     1285         (scheme         (string->symbol (downcase (->string (uri-scheme uri)))))
     1286         (host           (normalize-pct-encoding (downcase (uri-host uri)))))
    12621287    (update-uri* normalized-uri 'scheme scheme 'host host)))
    12631288
  • release/5/uri-generic/trunk/alternatives/uri-generic.prcc.scm

    r33654 r36551  
    3939;; What to do with these?
    4040;; #;(cond-expand
    41 ;;    (utf8-strings (use utf8-srfi-13 utf8-srfi-14))
    42 ;;    (else (use srfi-13 srfi-14)))
     41;;    (utf8-strings (use utf8-srfi-14))
     42;;    (else (use srfi-14)))
    4343
    4444(define-record-type <URI>
     
    398398
    399399;; Section 4.2; if the first segment contains a colon, it must be prefixed "./"
    400 (define (protect? sa) (string-index sa #\:))
     400(define (protect? sa) (substring-index ":" sa))
    401401
    402402; specific: ((uri-authority uri) (uri-path uri) (uri-query uri)).
     
    417417
    418418(define (uri-normalize-case uri)
    419   (let* ((normalized-uri (uri-reference
     419  (let* ((downcase (lambda (s)
     420                     (list->string (map char-downcase (string->list s)))))
     421         (normalized-uri (uri-reference
    420422                          (normalize-pct-encoding (uri->string uri (lambda (user pass) (conc user ":" pass))))))
    421          (scheme         (string->symbol (string-downcase (->string (uri-scheme uri)))))
    422          (host           (normalize-pct-encoding (string-downcase (uri-host uri)))))
     423         (scheme         (string->symbol (downcase (->string (uri-scheme uri)))))
     424         (host           (normalize-pct-encoding (downcase (uri-host uri)))))
    423425    (update-uri* normalized-uri 'scheme scheme 'host host)))
    424426
     
    431433  (define (hex-digit i)
    432434    (and (>= i 0) (< i 16)
    433          (car (string->list (string-upcase (number->string i 16))))))
     435         (char-upcase (string-ref (number->string i 16) 0))))
    434436  (define (pct-encode c)
    435437    (let ((i (char->integer c)))
  • release/5/uri-generic/trunk/uri-generic.egg

    r35619 r36551  
    22((license "BSD")
    33 (category web)
    4  (dependencies matchable srfi-1 srfi-13 srfi-14)
     4 (dependencies matchable srfi-1 srfi-14)
    55 (test-dependencies test)
    66 (author "Ivan Raikov, Peter Bex, Seth Alves")
  • release/5/uri-generic/trunk/uri-generic.scm

    r36544 r36551  
    5656
    5757(import scheme (chicken base) (chicken string) (chicken port)
    58         (chicken format) srfi-1 srfi-4 srfi-13 srfi-14 matchable)
     58        (chicken format) srfi-1 srfi-4 srfi-14 matchable)
    5959
    6060(define uri-error error)
     
    7474;; What to do with these?
    7575;; #;(cond-expand
    76 ;;    (utf8-strings (use utf8-srfi-13 utf8-srfi-14))
    77 ;;    (else (use srfi-13 srfi-14)))
     76;;    (utf8-strings (use utf8-srfi-14))
     77;;    (else (use srfi-14)))
    7878
    7979(define-record-type <URI>
     
    435435  (define (hex-digit i)
    436436    (and (>= i 0) (< i 16)
    437          (car (string->list (string-upcase (number->string i 16))))))
     437         (char-upcase (string-ref (number->string i 16) 0))))
    438438  (reverse (fold (lambda (c cl)
    439439                   (if (char-set-contains? char-set c)
     
    10231023
    10241024;; Section 4.2; if the first segment contains a colon, it must be prefixed "./"
    1025 (define (protect? sa) (string-index sa #\:))
     1025(define (protect? sa) (substring-index ":" sa))
    10261026
    10271027; specific: ((uri-authority uri) (uri-path uri) (uri-query uri)).
     
    12791279
    12801280(define (uri-normalize-case uri)
    1281   (let* ((normalized-uri (uri-reference
     1281  (let* ((downcase (lambda (s)
     1282                     (list->string (map char-downcase (string->list s)))))
     1283         (normalized-uri (uri-reference
    12821284                          (normalize-pct-encoding (uri->string uri (lambda (user pass) (conc user ":" pass))))))
    1283          (scheme         (string->symbol (string-downcase (->string (uri-scheme uri)))))
    1284          (host           (normalize-pct-encoding (string-downcase (uri-host uri)))))
     1285         (scheme         (string->symbol (downcase (->string (uri-scheme uri)))))
     1286         (host           (normalize-pct-encoding (downcase (uri-host uri)))))
    12851287    (update-uri* normalized-uri 'scheme scheme 'host host)))
    12861288
Note: See TracChangeset for help on using the changeset viewer.