Hex Artifact Content
Not logged in

Artifact 7449afe912a1b3af00e98a6f7c951dda8e4eb8d3:


0000: 5c 20 6e 65 74 32 6f 20 63 6f 6e 6e 65 63 74 65  \ net2o connecte
0010: 64 20 63 6f 6d 6d 61 6e 64 73 0a 0a 5c 20 43 6f  d commands..\ Co
0020: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 31 31  pyright (C) 2011
0030: 2d 32 30 31 34 20 20 20 42 65 72 6e 64 20 50 61  -2014   Bernd Pa
0040: 79 73 61 6e 0a 0a 5c 20 54 68 69 73 20 70 72 6f  ysan..\ This pro
0050: 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66  gram is free sof
0060: 74 77 61 72 65 3a 20 79 6f 75 20 63 61 6e 20 72  tware: you can r
0070: 65 64 69 73 74 72 69 62 75 74 65 20 69 74 20 61  edistribute it a
0080: 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 5c 20 69  nd/or modify.\ i
0090: 74 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d  t under the term
00a0: 73 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66  s of the GNU Aff
00b0: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ero General Publ
00c0: 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75  ic License as pu
00d0: 62 6c 69 73 68 65 64 20 62 79 0a 5c 20 74 68 65  blished by.\ the
00e0: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46   Free Software F
00f0: 6f 75 6e 64 61 74 69 6f 6e 2c 20 65 69 74 68 65  oundation, eithe
0100: 72 20 76 65 72 73 69 6f 6e 20 33 20 6f 66 20 74  r version 3 of t
0110: 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a 5c  he License, or.\
0120: 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69 6f 6e   (at your option
0130: 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65 72 73  ) any later vers
0140: 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73 20 70 72 6f  ion...\ This pro
0150: 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62 75  gram is distribu
0160: 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20  ted in the hope 
0170: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
0180: 75 73 65 66 75 6c 2c 0a 5c 20 62 75 74 20 57 49  useful,.\ but WI
0190: 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e  THOUT ANY WARRAN
01a0: 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e  TY; without even
01b0: 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72   the implied war
01c0: 72 61 6e 74 79 20 6f 66 0a 5c 20 4d 45 52 43 48  ranty of.\ MERCH
01d0: 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49  ANTABILITY or FI
01e0: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54  TNESS FOR A PART
01f0: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20  ICULAR PURPOSE. 
0200: 20 53 65 65 20 74 68 65 0a 5c 20 47 4e 55 20 41   See the.\ GNU A
0210: 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75  ffero General Pu
0220: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f 72  blic License for
0230: 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a   more details...
0240: 5c 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76  \ You should hav
0250: 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f 70  e received a cop
0260: 79 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66  y of the GNU Aff
0270: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ero General Publ
0280: 69 63 20 4c 69 63 65 6e 73 65 0a 5c 20 61 6c 6f  ic License.\ alo
0290: 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72 6f  ng with this pro
02a0: 67 72 61 6d 2e 20 20 49 66 20 6e 6f 74 2c 20 73  gram.  If not, s
02b0: 65 65 20 3c 68 74 74 70 3a 2f 2f 77 77 77 2e 67  ee <http://www.g
02c0: 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f  nu.org/licenses/
02d0: 3e 2e 0a 0a 5c 20 65 76 65 72 79 74 68 69 6e 67  >...\ everything
02e0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 68 65   that follows he
02f0: 72 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 6f  re can assume to
0300: 20 68 61 76 65 20 61 20 63 6f 6e 6e 65 63 74 69   have a connecti
0310: 6f 6e 20 63 6f 6e 74 65 78 74 0a 0a 73 63 6f 70  on context..scop
0320: 65 7b 20 6e 65 74 32 6f 2d 62 61 73 65 0a 0a 63  e{ net2o-base..c
0330: 6f 6e 6e 65 63 74 2d 74 61 62 6c 65 20 24 40 20  onnect-table $@ 
0340: 69 6e 68 65 72 69 74 2d 74 61 62 6c 65 20 63 6f  inherit-table co
0350: 6e 74 65 78 74 2d 74 61 62 6c 65 0a 0a 5c 20 67  ntext-table..\ g
0360: 65 6e 65 72 69 63 20 66 75 6e 63 74 69 6f 6e 73  eneric functions
0370: 0a 5c 67 20 0a 5c 67 20 23 23 23 20 63 6f 6e 6e  .\g .\g ### conn
0380: 65 63 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20  ection commands 
0390: 23 23 23 0a 5c 67 20 0a 2b 6e 65 74 32 6f 3a 20  ###.\g .+net2o: 
03a0: 64 69 73 63 6f 6e 6e 65 63 74 20 28 20 2d 2d 20  disconnect ( -- 
03b0: 29 20 5c 67 20 63 6c 6f 73 65 20 63 6f 6e 6e 65  ) \g close conne
03c0: 63 74 69 6f 6e 0a 20 20 20 20 6f 20 49 46 0a 09  ction.    o IF..
03d0: 77 61 69 74 2d 74 61 73 6b 20 40 20 3f 64 75 70  wait-task @ ?dup
03e0: 2d 49 46 0a 09 20 20 20 20 3c 65 76 65 6e 74 20  -IF..    <event 
03f0: 6f 20 65 6c 69 74 2c 20 3a 3e 64 69 73 70 6f 73  o elit, :>dispos
0400: 65 2d 63 6f 6e 74 65 78 74 20 65 76 65 6e 74 3e  e-context event>
0410: 0a 09 45 4c 53 45 20 20 6e 65 74 32 6f 3a 64 69  ..ELSE  net2o:di
0420: 73 70 6f 73 65 2d 63 6f 6e 74 65 78 74 20 20 54  spose-context  T
0430: 48 45 4e 0a 09 75 6e 2d 63 6d 64 20 20 54 48 45  HEN..un-cmd  THE
0440: 4e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 2d  N ;.+net2o: set-
0450: 69 70 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d  ip ( $:string --
0460: 20 29 20 5c 67 20 73 65 74 20 61 64 64 72 65 73   ) \g set addres
0470: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  s information.  
0480: 20 20 24 3e 20 73 65 74 69 70 2d 78 74 20 3b 0a    $> setip-xt ;.
0490: 2b 6e 65 74 32 6f 3a 20 67 65 74 2d 69 70 20 28  +net2o: get-ip (
04a0: 20 2d 2d 20 29 20 5c 67 20 72 65 71 75 65 73 74   -- ) \g request
04b0: 20 61 64 64 72 65 73 73 20 69 6e 66 6f 72 6d 61   address informa
04c0: 74 69 6f 6e 0a 20 20 20 20 3e 73 6f 63 6b 61 64  tion.    >sockad
04d0: 64 72 20 24 2c 20 73 65 74 2d 69 70 20 5b 3a 20  dr $, set-ip [: 
04e0: 24 2c 20 73 65 74 2d 69 70 20 3b 5d 20 6e 32 6f  $, set-ip ;] n2o
04f0: 61 64 64 72 73 20 3b 0a 0a 2b 6e 65 74 32 6f 3a  addrs ;..+net2o:
0500: 20 73 65 74 2d 62 6c 6f 63 6b 73 69 7a 65 20 28   set-blocksize (
0510: 20 6e 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 62   n -- ) \g set b
0520: 6c 6f 63 6b 73 69 7a 65 20 74 6f 20 32 5e 6e 0a  locksize to 2^n.
0530: 20 20 20 20 36 34 3e 6e 20 31 20 73 77 61 70 20      64>n 1 swap 
0540: 6d 61 78 2d 62 6c 6f 63 6b 23 20 75 6d 69 6e 20  max-block# umin 
0550: 6c 73 68 69 66 74 20 62 6c 6f 63 6b 73 69 7a 65  lshift blocksize
0560: 73 21 20 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74  s! ;.+net2o: set
0570: 2d 62 6c 6f 63 6b 61 6c 69 67 6e 20 28 20 6e 20  -blockalign ( n 
0580: 2d 2d 20 29 20 5c 67 20 73 65 74 20 62 6c 6f 63  -- ) \g set bloc
0590: 6b 20 61 6c 69 67 6e 6d 65 6e 74 20 74 6f 20 32  k alignment to 2
05a0: 5e 6e 0a 20 20 20 20 36 34 3e 6e 20 31 20 73 77  ^n.    64>n 1 sw
05b0: 61 70 20 6d 61 78 2d 62 6c 6f 63 6b 23 20 75 6d  ap max-block# um
05c0: 69 6e 20 6c 73 68 69 66 74 20 62 6c 6f 63 6b 61  in lshift blocka
05d0: 6c 69 67 6e 20 21 20 3b 0a 2b 6e 65 74 32 6f 3a  lign ! ;.+net2o:
05e0: 20 63 6c 6f 73 65 2d 61 6c 6c 20 28 20 2d 2d 20   close-all ( -- 
05f0: 29 20 5c 67 20 63 6c 6f 73 65 20 61 6c 6c 20 66  ) \g close all f
0600: 69 6c 65 73 0a 20 20 20 20 6e 65 74 32 6f 3a 63  iles.    net2o:c
0610: 6c 6f 73 65 2d 61 6c 6c 20 3b 0a 5c 20 62 65 74  lose-all ;.\ bet
0620: 74 65 72 20 73 6c 75 72 70 69 6e 67 0a 0a 2b 6e  ter slurping..+n
0630: 65 74 32 6f 3a 20 73 65 74 2d 74 6f 70 20 28 20  et2o: set-top ( 
0640: 75 74 6f 70 20 66 6c 61 67 20 2d 2d 20 29 20 5c  utop flag -- ) \
0650: 67 20 73 65 74 20 74 6f 70 2c 20 66 6c 61 67 20  g set top, flag 
0660: 69 73 20 74 72 75 65 20 77 68 65 6e 20 61 6c 6c  is true when all
0670: 20 64 61 74 61 20 69 73 20 73 65 6e 74 0a 20 20   data is sent.  
0680: 20 20 3e 72 20 36 34 3e 6e 20 72 3e 20 64 61 74    >r 64>n r> dat
0690: 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61 70 63  a-rmap with mapc
06a0: 0a 20 20 20 20 6f 76 65 72 20 64 65 73 74 2d 74  .    over dest-t
06b0: 6f 70 20 3c 3e 20 61 6e 64 20 64 65 73 74 2d 65  op <> and dest-e
06c0: 6e 64 20 6f 72 21 20 64 65 73 74 2d 74 6f 70 21  nd or! dest-top!
06d0: 0a 20 20 20 20 65 6e 64 77 69 74 68 20 3b 0a 2b  .    endwith ;.+
06e0: 6e 65 74 32 6f 3a 20 73 6c 75 72 70 20 28 20 2d  net2o: slurp ( -
06f0: 2d 20 29 20 5c 67 20 73 6c 75 72 70 20 69 6e 20  - ) \g slurp in 
0700: 74 72 61 63 6b 65 64 20 66 69 6c 65 73 0a 20 20  tracked files.  
0710: 20 20 5c 20 21 21 46 49 58 4d 45 21 21 20 74 68    \ !!FIXME!! th
0720: 69 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  is should probab
0730: 6c 79 20 62 65 20 61 73 79 6e 63 68 72 6f 6e 6f  ly be asynchrono
0740: 75 73 0a 20 20 20 20 6e 65 74 32 6f 3a 73 6c 75  us.    net2o:slu
0750: 72 70 20 73 77 61 70 20 75 6c 69 74 2c 20 66 6c  rp swap ulit, fl
0760: 61 67 2c 20 73 65 74 2d 74 6f 70 0a 20 20 20 20  ag, set-top.    
0770: 5b 27 5d 20 64 6f 2d 74 72 61 63 6b 2d 73 65 65  ['] do-track-see
0780: 6b 20 6e 65 74 32 6f 3a 74 72 61 63 6b 2d 61 6c  k net2o:track-al
0790: 6c 2d 73 65 65 6b 73 20 6e 65 74 32 6f 3a 73 65  l-seeks net2o:se
07a0: 6e 64 2d 63 68 75 6e 6b 73 20 3b 0a 2b 6e 65 74  nd-chunks ;.+net
07b0: 32 6f 3a 20 61 63 6b 2d 72 65 73 65 74 20 28 20  2o: ack-reset ( 
07c0: 2d 2d 20 29 20 5c 67 20 72 65 73 65 74 20 61 63  -- ) \g reset ac
07d0: 6b 20 73 74 61 74 65 0a 20 20 20 20 30 20 61 63  k state.    0 ac
07e0: 6b 2d 73 74 61 74 65 20 63 21 20 3b 0a 0a 5c 20  k-state c! ;..\ 
07f0: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 73 0a 5c  object handles.\
0800: 67 20 0a 5c 67 20 23 23 23 20 66 69 6c 65 20 63  g .\g ### file c
0810: 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 5c 67 20 0a  ommands ###.\g .
0820: 0a 24 33 30 20 6e 65 74 32 6f 3a 20 66 69 6c 65  .$30 net2o: file
0830: 2d 69 64 20 28 20 75 69 64 20 2d 2d 20 6f 3a 66  -id ( uid -- o:f
0840: 69 6c 65 20 29 20 5c 67 20 63 68 6f 6f 73 65 20  ile ) \g choose 
0850: 61 20 66 69 6c 65 20 6f 62 6a 65 63 74 0a 20 20  a file object.  
0860: 20 20 36 34 3e 6e 20 73 74 61 74 65 2d 61 64 64    64>n state-add
0870: 72 20 6e 3a 3e 6f 20 3b 0a 66 73 2d 74 61 62 6c  r n:>o ;.fs-tabl
0880: 65 20 3e 74 61 62 6c 65 0a 0a 72 65 70 6c 79 2d  e >table..reply-
0890: 74 61 62 6c 65 20 24 40 20 69 6e 68 65 72 69 74  table $@ inherit
08a0: 2d 74 61 62 6c 65 20 66 73 2d 74 61 62 6c 65 0a  -table fs-table.
08b0: 0a 3a 20 66 69 6c 65 2d 73 74 61 72 74 2d 72 65  .: file-start-re
08c0: 71 20 66 73 2d 69 64 20 40 20 75 6c 69 74 2c 20  q fs-id @ ulit, 
08d0: 66 69 6c 65 2d 69 64 20 3b 0a 27 20 66 69 6c 65  file-id ;.' file
08e0: 2d 73 74 61 72 74 2d 72 65 71 0a 66 69 6c 65 2d  -start-req.file-
08f0: 63 6c 61 73 73 65 73 20 66 69 6c 65 2d 63 6c 61  classes file-cla
0900: 73 73 65 73 23 20 63 65 6c 6c 73 20 62 6f 75 6e  sses# cells boun
0910: 64 73 0a 5b 44 4f 5d 20 64 75 70 20 5b 49 5d 20  ds.[DO] dup [I] 
0920: 40 20 74 6f 20 73 74 61 72 74 2d 72 65 71 20 63  @ to start-req c
0930: 65 6c 6c 20 5b 2b 4c 4f 4f 50 5d 0a 64 72 6f 70  ell [+LOOP].drop
0940: 0a 0a 24 32 30 20 6e 65 74 32 6f 3a 20 6f 70 65  ..$20 net2o: ope
0950: 6e 2d 66 69 6c 65 20 28 20 24 3a 73 74 72 69 6e  n-file ( $:strin
0960: 67 20 6d 6f 64 65 20 2d 2d 20 29 20 5c 67 20 6f  g mode -- ) \g o
0970: 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 6d 6f  pen file with mo
0980: 64 65 0a 20 20 20 20 70 61 72 65 6e 74 20 2e 70  de.    parent .p
0990: 65 72 6d 2d 6d 61 73 6b 20 40 20 3e 72 20 72 40  erm-mask @ >r r@
09a0: 20 66 73 2d 70 65 72 6d 3f 0a 20 20 20 20 36 34   fs-perm?.    64
09b0: 3e 6e 20 2d 32 20 61 6e 64 20 34 20 75 6d 69 6e  >n -2 and 4 umin
09c0: 20 64 75 70 20 72 3e 20 3f 72 77 2d 70 65 72 6d   dup r> ?rw-perm
09d0: 20 20 3e 72 20 24 3e 20 72 3e 20 66 73 2d 6f 70    >r $> r> fs-op
09e0: 65 6e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 66 69 6c  en ;.+net2o: fil
09f0: 65 2d 74 79 70 65 20 28 20 6e 20 2d 2d 20 29 20  e-type ( n -- ) 
0a00: 5c 67 20 63 68 6f 6f 73 65 20 66 69 6c 65 20 74  \g choose file t
0a10: 79 70 65 0a 20 20 20 20 36 34 3e 6e 20 66 73 2d  ype.    64>n fs-
0a20: 63 6c 61 73 73 21 20 3b 0a 2b 6e 65 74 32 6f 3a  class! ;.+net2o:
0a30: 20 63 6c 6f 73 65 2d 66 69 6c 65 20 28 20 2d 2d   close-file ( --
0a40: 20 29 20 5c 67 20 63 6c 6f 73 65 20 66 69 6c 65   ) \g close file
0a50: 0a 20 20 20 20 66 73 2d 63 6c 6f 73 65 20 3b 0a  .    fs-close ;.
0a60: 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 73 69 7a 65  +net2o: set-size
0a70: 20 28 20 73 69 7a 65 20 2d 2d 20 29 20 5c 67 20   ( size -- ) \g 
0a80: 73 65 74 20 73 69 7a 65 20 61 74 74 72 69 62 75  set size attribu
0a90: 74 65 20 6f 66 20 63 75 72 72 65 6e 74 20 66 69  te of current fi
0aa0: 6c 65 0a 20 20 20 20 74 72 61 63 6b 28 20 2e 22  le.    track( ."
0ab0: 20 66 69 6c 65 20 3c 22 20 66 73 2d 69 64 20 40   file <" fs-id @
0ac0: 20 30 20 2e 72 20 2e 22 20 3e 20 73 69 7a 65 3a   0 .r ." > size:
0ad0: 20 22 20 36 34 64 75 70 20 75 36 34 2e 20 66 6f   " 64dup u64. fo
0ae0: 72 74 68 3a 63 72 20 29 20 73 69 7a 65 21 20 3b  rth:cr ) size! ;
0af0: 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 73 65 65  .+net2o: set-see
0b00: 6b 20 28 20 75 73 65 65 6b 20 2d 2d 20 29 20 5c  k ( useek -- ) \
0b10: 67 20 73 65 74 20 73 65 65 6b 20 61 74 74 72 69  g set seek attri
0b20: 62 75 74 65 20 6f 66 20 63 75 72 72 65 6e 74 20  bute of current 
0b30: 66 69 6c 65 0a 20 20 20 20 74 72 61 63 6b 28 20  file.    track( 
0b40: 2e 22 20 66 69 6c 65 20 3c 22 20 66 73 2d 69 64  ." file <" fs-id
0b50: 20 40 20 30 20 2e 72 20 2e 22 20 3e 20 73 65 65   @ 0 .r ." > see
0b60: 6b 3a 20 22 20 36 34 64 75 70 20 75 36 34 2e 20  k: " 64dup u64. 
0b70: 66 6f 72 74 68 3a 63 72 20 29 20 73 65 65 6b 74  forth:cr ) seekt
0b80: 6f 21 20 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74  o! ;.+net2o: set
0b90: 2d 6c 69 6d 69 74 20 28 20 75 6c 69 6d 69 74 20  -limit ( ulimit 
0ba0: 2d 2d 20 29 20 5c 67 20 73 65 74 20 6c 69 6d 69  -- ) \g set limi
0bb0: 74 20 61 74 74 72 69 62 75 74 65 20 6f 66 20 63  t attribute of c
0bc0: 75 72 72 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  urrent file.    
0bd0: 74 72 61 63 6b 28 20 2e 22 20 66 69 6c 65 20 3c  track( ." file <
0be0: 22 20 66 73 2d 69 64 20 40 20 30 20 2e 72 20 2e  " fs-id @ 0 .r .
0bf0: 22 20 3e 20 73 65 65 6b 20 74 6f 3a 20 22 20 36  " > seek to: " 6
0c00: 34 64 75 70 20 75 36 34 2e 20 66 6f 72 74 68 3a  4dup u64. forth:
0c10: 63 72 20 29 20 6c 69 6d 69 74 2d 6d 69 6e 21 20  cr ) limit-min! 
0c20: 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 73 74  ;.+net2o: set-st
0c30: 61 74 20 28 20 75 6d 74 69 6d 65 20 75 6d 6f 64  at ( umtime umod
0c40: 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 74 69 6d   -- ) \g set tim
0c50: 65 20 61 6e 64 20 6d 6f 64 65 20 6f 66 20 63 75  e and mode of cu
0c60: 72 72 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 36  rrent file.    6
0c70: 34 3e 6e 20 66 73 2d 73 65 74 2d 73 74 61 74 20  4>n fs-set-stat 
0c80: 3b 0a 2b 6e 65 74 32 6f 3a 20 67 65 74 2d 73 69  ;.+net2o: get-si
0c90: 7a 65 20 28 20 2d 2d 20 29 20 5c 67 20 72 65 71  ze ( -- ) \g req
0ca0: 75 65 73 74 20 66 69 6c 65 20 73 69 7a 65 0a 20  uest file size. 
0cb0: 20 20 20 66 73 2d 73 69 7a 65 20 6c 69 74 2c 20     fs-size lit, 
0cc0: 73 65 74 2d 73 69 7a 65 20 3b 0a 2b 6e 65 74 32  set-size ;.+net2
0cd0: 6f 3a 20 67 65 74 2d 73 74 61 74 20 28 20 2d 2d  o: get-stat ( --
0ce0: 20 29 20 5c 67 20 72 65 71 75 65 73 74 20 73 74   ) \g request st
0cf0: 61 74 20 6f 66 20 63 75 72 72 65 6e 74 20 66 69  at of current fi
0d00: 6c 65 0a 20 20 20 20 66 73 2d 67 65 74 2d 73 74  le.    fs-get-st
0d10: 61 74 20 3e 72 20 6c 69 74 2c 20 72 3e 20 75 6c  at >r lit, r> ul
0d20: 69 74 2c 20 73 65 74 2d 73 74 61 74 20 3b 0a 2b  it, set-stat ;.+
0d30: 6e 65 74 32 6f 3a 20 73 65 74 2d 66 6f 72 6d 20  net2o: set-form 
0d40: 28 20 77 20 68 20 2d 2d 20 29 20 5c 67 20 69 66  ( w h -- ) \g if
0d50: 20 66 69 6c 65 20 69 73 20 61 20 74 65 72 6d 69   file is a termi
0d60: 6e 61 6c 2c 20 73 65 74 20 73 69 7a 65 0a 20 20  nal, set size.  
0d70: 20 20 74 65 72 6d 2d 68 20 21 20 74 65 72 6d 2d    term-h ! term-
0d80: 77 20 21 20 3b 0a 2b 6e 65 74 32 6f 3a 20 67 65  w ! ;.+net2o: ge
0d90: 74 2d 66 6f 72 6d 20 28 20 2d 2d 20 29 20 5c 67  t-form ( -- ) \g
0da0: 20 69 66 20 66 69 6c 65 20 69 73 20 61 20 74 65   if file is a te
0db0: 72 6d 69 6e 61 6c 2c 20 72 65 71 75 65 73 74 20  rminal, request 
0dc0: 73 69 7a 65 0a 20 20 20 20 74 65 72 6d 2d 77 20  size.    term-w 
0dd0: 40 20 75 6c 69 74 2c 20 74 65 72 6d 2d 68 20 40  @ ulit, term-h @
0de0: 20 75 6c 69 74 2c 20 73 65 74 2d 66 6f 72 6d 20   ulit, set-form 
0df0: 3b 0a 2b 6e 65 74 32 6f 3a 20 70 6f 6c 6c 2d 72  ;.+net2o: poll-r
0e00: 65 71 75 65 73 74 20 28 20 75 6c 69 6d 69 74 20  equest ( ulimit 
0e10: 2d 2d 20 29 20 5c 67 20 70 6f 6c 6c 20 61 20 66  -- ) \g poll a f
0e20: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 66 6f 72  ile to check for
0e30: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 0a 20 20   size changes.  
0e40: 20 20 70 6f 6c 6c 21 20 6c 69 74 2c 20 73 65 74    poll! lit, set
0e50: 2d 73 69 7a 65 20 3b 0a 0a 67 65 6e 2d 74 61 62  -size ;..gen-tab
0e60: 6c 65 20 24 66 72 65 65 7a 65 0a 27 20 63 6f 6e  le $freeze.' con
0e70: 74 65 78 74 2d 74 61 62 6c 65 20 69 73 20 67 65  text-table is ge
0e80: 6e 2d 74 61 62 6c 65 0a 0a 3a 6e 6f 6e 61 6d 65  n-table..:noname
0e90: 20 28 20 75 69 64 20 75 73 65 65 6b 20 2d 2d 20   ( uid useek -- 
0ea0: 29 20 36 34 3e 72 20 75 6c 69 74 2c 20 66 69 6c  ) 64>r ulit, fil
0eb0: 65 2d 69 64 0a 20 20 20 20 36 34 72 3e 20 6c 69  e-id.    64r> li
0ec0: 74 2c 20 73 65 74 2d 73 65 65 6b 20 65 6e 64 2d  t, set-seek end-
0ed0: 77 69 74 68 20 3b 20 69 73 20 64 6f 2d 74 72 61  with ; is do-tra
0ee0: 63 6b 2d 73 65 65 6b 0a 0a 5c 20 66 6c 6f 77 20  ck-seek..\ flow 
0ef0: 63 6f 6e 74 72 6f 6c 20 66 75 6e 63 74 69 6f 6e  control function
0f00: 73 0a 5c 67 20 0a 5c 67 20 23 23 23 20 61 63 6b  s.\g .\g ### ack
0f10: 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 5c 67   commands ###.\g
0f20: 20 0a 0a 24 33 31 20 6e 65 74 32 6f 3a 20 61 63   ..$31 net2o: ac
0f30: 6b 20 28 20 2d 2d 20 6f 3a 61 63 6b 6f 20 29 20  k ( -- o:acko ) 
0f40: 5c 67 20 61 63 6b 20 6f 62 6a 65 63 74 0a 20 20  \g ack object.  
0f50: 20 20 61 63 6b 40 20 6e 3a 3e 6f 20 3b 0a 61 63    ack@ n:>o ;.ac
0f60: 6b 2d 74 61 62 6c 65 20 3e 74 61 62 6c 65 0a 72  k-table >table.r
0f70: 65 70 6c 79 2d 74 61 62 6c 65 20 24 40 20 69 6e  eply-table $@ in
0f80: 68 65 72 69 74 2d 74 61 62 6c 65 20 61 63 6b 2d  herit-table ack-
0f90: 74 61 62 6c 65 0a 0a 3a 6e 6f 6e 61 6d 65 20 61  table..:noname a
0fa0: 63 6b 20 3b 20 61 63 6b 2d 63 6c 61 73 73 20 74  ck ; ack-class t
0fb0: 6f 20 73 74 61 72 74 2d 72 65 71 0a 24 32 30 20  o start-req.$20 
0fc0: 6e 65 74 32 6f 3a 20 61 63 6b 2d 61 64 64 72 74  net2o: ack-addrt
0fd0: 69 6d 65 20 28 20 75 74 69 6d 65 20 61 64 64 72  ime ( utime addr
0fe0: 20 2d 2d 20 29 20 5c 67 20 70 61 63 6b 65 74 20   -- ) \g packet 
0ff0: 61 74 20 61 64 64 72 20 72 65 63 65 69 76 65 64  at addr received
1000: 20 61 74 20 74 69 6d 65 0a 20 20 20 20 6e 65 74   at time.    net
1010: 32 6f 3a 61 63 6b 2d 61 64 64 72 74 69 6d 65 20  2o:ack-addrtime 
1020: 3b 0a 2b 6e 65 74 32 6f 3a 20 61 63 6b 2d 72 65  ;.+net2o: ack-re
1030: 73 65 6e 64 20 28 20 66 6c 61 67 20 2d 2d 20 29  send ( flag -- )
1040: 20 5c 67 20 73 65 74 20 72 65 73 65 6e 64 20 74   \g set resend t
1050: 6f 67 67 6c 65 20 66 6c 61 67 0a 20 20 20 20 36  oggle flag.    6
1060: 34 3e 6e 20 20 70 61 72 65 6e 74 20 2e 6e 65 74  4>n  parent .net
1070: 32 6f 3a 61 63 6b 2d 72 65 73 65 6e 64 20 3b 0a  2o:ack-resend ;.
1080: 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 72 61 74 65  +net2o: set-rate
1090: 20 28 20 75 72 61 74 65 20 75 64 65 6c 74 61 2d   ( urate udelta-
10a0: 74 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 72 61  t -- ) \g set ra
10b0: 74 65 20 0a 20 20 20 20 70 61 72 65 6e 74 20 3e  te .    parent >
10c0: 6f 20 63 6f 6f 6b 69 65 3f 20 49 46 20 20 61 63  o cookie? IF  ac
10d0: 6b 40 20 2e 6e 65 74 32 6f 3a 73 65 74 2d 72 61  k@ .net2o:set-ra
10e0: 74 65 0a 20 20 20 20 45 4c 53 45 20 20 36 34 64  te.    ELSE  64d
10f0: 72 6f 70 20 36 34 64 72 6f 70 20 61 63 6b 2d 6f  rop 64drop ack-o
1100: 72 64 65 72 3f 0a 09 49 46 20 20 61 63 6b 40 20  rder?..IF  ack@ 
1110: 2e 6e 73 2f 62 75 72 73 74 20 64 75 70 20 3e 72  .ns/burst dup >r
1120: 20 36 34 40 20 36 34 2d 32 2a 20 36 34 2d 32 2a   64@ 64-2* 64-2*
1130: 20 72 3e 20 36 34 21 0a 09 54 48 45 4e 0a 20 20   r> 64!..THEN.  
1140: 20 20 54 48 45 4e 20 6f 3e 20 3b 0a 2b 6e 65 74    THEN o> ;.+net
1150: 32 6f 3a 20 72 65 73 65 6e 64 2d 6d 61 73 6b 20  2o: resend-mask 
1160: 28 20 61 64 64 72 20 75 6d 61 73 6b 20 2d 2d 20  ( addr umask -- 
1170: 29 20 5c 67 20 72 65 73 65 6e 64 20 6d 61 73 6b  ) \g resend mask
1180: 20 62 6c 6f 63 6b 73 20 73 74 61 72 74 69 6e 67   blocks starting
1190: 20 61 74 20 61 64 64 72 0a 20 20 20 20 32 2a 36   at addr.    2*6
11a0: 34 3e 6e 20 70 61 72 65 6e 74 20 3e 6f 20 6e 65  4>n parent >o ne
11b0: 74 32 6f 3a 72 65 73 65 6e 64 2d 6d 61 73 6b 20  t2o:resend-mask 
11c0: 6e 65 74 32 6f 3a 73 65 6e 64 2d 63 68 75 6e 6b  net2o:send-chunk
11d0: 73 20 6f 3e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 74  s o> ;.+net2o: t
11e0: 72 61 63 6b 2d 74 69 6d 69 6e 67 20 28 20 2d 2d  rack-timing ( --
11f0: 20 29 20 5c 67 20 74 72 61 63 6b 20 74 69 6d 69   ) \g track timi
1200: 6e 67 0a 20 20 20 20 6e 65 74 32 6f 3a 74 72 61  ng.    net2o:tra
1210: 63 6b 2d 74 69 6d 69 6e 67 20 3b 0a 2b 6e 65 74  ck-timing ;.+net
1220: 32 6f 3a 20 72 65 63 2d 74 69 6d 69 6e 67 20 28  2o: rec-timing (
1230: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 20 5c   $:string -- ) \
1240: 67 20 72 65 63 6f 72 64 65 64 20 74 69 6d 69 6e  g recorded timin
1250: 67 0a 20 20 20 20 24 3e 20 6e 65 74 32 6f 3a 72  g.    $> net2o:r
1260: 65 63 2d 74 69 6d 69 6e 67 20 3b 0a 2b 6e 65 74  ec-timing ;.+net
1270: 32 6f 3a 20 73 65 6e 64 2d 74 69 6d 69 6e 67 20  2o: send-timing 
1280: 28 20 2d 2d 20 29 20 5c 67 20 72 65 71 75 65 73  ( -- ) \g reques
1290: 74 20 72 65 63 6f 72 64 65 64 20 74 69 6d 69 6e  t recorded timin
12a0: 67 0a 20 20 20 20 6e 65 74 32 6f 3a 74 69 6d 69  g.    net2o:timi
12b0: 6e 67 24 20 6d 61 78 74 69 6d 69 6e 67 20 75 6d  ng$ maxtiming um
12c0: 69 6e 20 74 75 63 6b 20 24 2c 20 6e 65 74 32 6f  in tuck $, net2o
12d0: 3a 2f 74 69 6d 69 6e 67 20 72 65 63 2d 74 69 6d  :/timing rec-tim
12e0: 69 6e 67 20 3b 0a 2b 6e 65 74 32 6f 3a 20 61 63  ing ;.+net2o: ac
12f0: 6b 2d 62 32 62 74 69 6d 65 20 28 20 75 74 69 6d  k-b2btime ( utim
1300: 65 20 61 64 64 72 20 2d 2d 20 29 20 5c 67 20 62  e addr -- ) \g b
1310: 75 72 73 74 2d 74 6f 2d 62 75 72 73 74 20 74 69  urst-to-burst ti
1320: 6d 65 20 61 74 20 70 61 63 6b 65 74 20 61 64 64  me at packet add
1330: 72 0a 20 20 20 20 6e 65 74 32 6f 3a 61 63 6b 2d  r.    net2o:ack-
1340: 62 32 62 74 69 6d 65 20 3b 0a 2b 6e 65 74 32 6f  b2btime ;.+net2o
1350: 3a 20 61 63 6b 2d 72 65 73 65 6e 64 23 20 28 20  : ack-resend# ( 
1360: 61 64 64 72 20 24 3a 73 74 72 69 6e 67 20 2d 2d  addr $:string --
1370: 20 29 20 5c 67 20 72 65 73 65 6e 64 20 6e 75 6d   ) \g resend num
1380: 62 65 72 73 0a 20 20 20 20 36 34 3e 6e 20 24 3e  bers.    64>n $>
1390: 0a 20 20 20 20 61 63 6b 2d 6f 72 64 65 72 3f 20  .    ack-order? 
13a0: 49 46 0a 09 70 61 72 65 6e 74 20 2e 64 61 74 61  IF..parent .data
13b0: 2d 6d 61 70 20 2e 6d 61 70 63 3a 72 65 73 65 6e  -map .mapc:resen
13c0: 64 23 3f 20 64 75 70 20 30 3d 20 49 46 0a 09 20  d#? dup 0= IF.. 
13d0: 20 20 20 64 72 6f 70 20 74 69 6d 65 6f 75 74 28     drop timeout(
13e0: 20 2e 22 20 72 65 73 65 6e 64 23 20 64 6f 6e 27   ." resend# don'
13f0: 74 20 6d 61 74 63 68 21 22 20 66 6f 72 74 68 3a  t match!" forth:
1400: 63 72 0a 09 20 20 20 20 70 61 72 65 6e 74 20 2e  cr..    parent .
1410: 6e 65 74 32 6f 3a 73 65 65 2d 6d 65 20 29 0a 09  net2o:see-me )..
1420: 20 20 20 20 5b 20 63 6f 6f 6b 69 65 2d 76 61 6c      [ cookie-val
1430: 20 31 20 76 61 6c 69 64 61 74 65 64 23 20 6c 73   1 validated# ls
1440: 68 69 66 74 20 31 2d 20 78 6f 72 20 5d 4c 20 76  hift 1- xor ]L v
1450: 61 6c 69 64 61 74 65 64 20 61 6e 64 21 0a 09 45  alidated and!..E
1460: 4c 53 45 0a 09 20 20 20 20 76 61 6c 69 64 61 74  LSE..    validat
1470: 65 64 23 20 6c 73 68 69 66 74 20 76 61 6c 69 64  ed# lshift valid
1480: 61 74 65 64 20 2b 21 20 63 6f 6f 6b 69 65 2d 76  ated +! cookie-v
1490: 61 6c 20 76 61 6c 69 64 61 74 65 64 20 6f 72 21  al validated or!
14a0: 0a 09 54 48 45 4e 0a 20 20 20 20 45 4c 53 45 20  ..THEN.    ELSE 
14b0: 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 6f 75 74   timeout( ." out
14c0: 20 6f 66 20 6f 72 64 65 72 20 61 72 72 69 76 61   of order arriva
14d0: 6c 20 6f 66 20 61 63 6b 22 20 66 6f 72 74 68 3a  l of ack" forth:
14e0: 63 72 20 29 0a 09 32 64 72 6f 70 20 64 72 6f 70  cr )..2drop drop
14f0: 0a 20 20 20 20 54 48 45 4e 20 3b 0a 2b 6e 65 74  .    THEN ;.+net
1500: 32 6f 3a 20 61 63 6b 2d 66 6c 75 73 68 20 28 20  2o: ack-flush ( 
1510: 61 64 64 72 20 2d 2d 20 29 20 5c 67 20 66 6c 75  addr -- ) \g flu
1520: 73 68 65 64 20 74 6f 20 61 64 64 72 0a 20 20 20  shed to addr.   
1530: 20 36 34 3e 6e 20 70 61 72 65 6e 74 20 2e 6e 65   64>n parent .ne
1540: 74 32 6f 3a 72 65 77 69 6e 64 2d 73 65 6e 64 65  t2o:rewind-sende
1550: 72 2d 70 61 72 74 69 61 6c 20 3b 0a 2b 6e 65 74  r-partial ;.+net
1560: 32 6f 3a 20 73 65 74 2d 68 65 61 64 20 28 20 61  2o: set-head ( a
1570: 64 64 72 20 2d 2d 20 29 20 5c 67 20 73 65 74 20  ddr -- ) \g set 
1580: 68 65 61 64 0a 20 20 20 20 36 34 3e 6e 20 70 61  head.    64>n pa
1590: 72 65 6e 74 20 2e 64 61 74 61 2d 72 6d 61 70 20  rent .data-rmap 
15a0: 3e 6f 20 61 64 64 72 20 6d 61 70 63 3a 64 65 73  >o addr mapc:des
15b0: 74 2d 68 65 61 64 20 6f 3e 20 75 6d 61 78 21 20  t-head o> umax! 
15c0: 3b 0a 2b 6e 65 74 32 6f 3a 20 74 69 6d 65 6f 75  ;.+net2o: timeou
15d0: 74 20 28 20 75 74 69 63 6b 73 20 2d 2d 20 29 20  t ( uticks -- ) 
15e0: 5c 67 20 74 69 6d 65 6f 75 74 20 72 65 71 75 65  \g timeout reque
15f0: 73 74 0a 20 20 20 20 70 61 72 65 6e 74 20 3e 6f  st.    parent >o
1600: 20 6e 65 74 32 6f 3a 74 69 6d 65 6f 75 74 20 20   net2o:timeout  
1610: 64 61 74 61 2d 6d 61 70 20 2e 6d 61 70 63 3a 64  data-map .mapc:d
1620: 65 73 74 2d 74 61 69 6c 20 6f 3e 20 75 6c 69 74  est-tail o> ulit
1630: 2c 20 73 65 74 2d 68 65 61 64 20 3b 0a 2b 6e 65  , set-head ;.+ne
1640: 74 32 6f 3a 20 73 65 74 2d 72 74 64 65 6c 61 79  t2o: set-rtdelay
1650: 20 28 20 74 69 63 6b 73 20 2d 2d 20 29 20 5c 67   ( ticks -- ) \g
1660: 20 73 65 74 20 72 6f 75 6e 64 20 74 72 69 70 20   set round trip 
1670: 64 65 6c 61 79 20 6f 6e 6c 79 0a 20 20 20 20 72  delay only.    r
1680: 74 64 65 6c 61 79 21 20 3b 0a 2b 6e 65 74 32 6f  tdelay! ;.+net2o
1690: 3a 20 73 65 71 23 20 28 20 6e 20 2d 2d 20 29 20  : seq# ( n -- ) 
16a0: 5c 67 20 73 65 74 20 74 68 65 20 61 63 6b 20 6e  \g set the ack n
16b0: 75 6d 62 65 72 20 61 6e 64 20 63 68 65 63 6b 20  umber and check 
16c0: 66 6f 72 20 73 6d 61 6c 6c 65 72 0a 20 20 20 20  for smaller.    
16d0: 36 34 3e 6e 20 70 61 72 65 6e 74 20 2e 64 61 74  64>n parent .dat
16e0: 61 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 0a  a-map with mapc.
16f0: 20 20 20 20 64 75 70 20 73 65 6e 64 2d 61 63 6b      dup send-ack
1700: 23 20 75 3e 20 49 46 20 20 74 6f 20 73 65 6e 64  # u> IF  to send
1710: 2d 61 63 6b 23 20 20 61 63 6b 2d 6f 72 64 65 72  -ack#  ack-order
1720: 2d 76 61 6c 20 76 61 6c 69 64 61 74 65 64 20 6f  -val validated o
1730: 72 21 20 20 45 4c 53 45 0a 09 64 72 6f 70 20 5b  r!  ELSE..drop [
1740: 20 61 63 6b 2d 6f 72 64 65 72 2d 76 61 6c 20 69   ack-order-val i
1750: 6e 76 65 72 74 20 5d 4c 20 76 61 6c 69 64 61 74  nvert ]L validat
1760: 65 64 20 61 6e 64 21 0a 20 20 20 20 54 48 45 4e  ed and!.    THEN
1770: 0a 20 20 20 20 65 6e 64 77 69 74 68 20 3b 0a 0a  .    endwith ;..
1780: 5c 20 70 72 6f 66 69 6c 69 6e 67 2c 20 6e 61 74  \ profiling, nat
1790: 20 74 72 61 76 65 72 73 61 6c 0a 0a 67 65 6e 2d   traversal..gen-
17a0: 74 61 62 6c 65 20 24 66 72 65 65 7a 65 0a 27 20  table $freeze.' 
17b0: 63 6f 6e 74 65 78 74 2d 74 61 62 6c 65 20 69 73  context-table is
17c0: 20 67 65 6e 2d 74 61 62 6c 65 0a 0a 69 6e 20 6e   gen-table..in n
17d0: 65 74 32 6f 20 3a 20 67 65 6e 2d 72 65 73 65 6e  et2o : gen-resen
17e0: 64 20 28 20 2d 2d 20 29 0a 20 20 20 20 61 63 6b  d ( -- ).    ack
17f0: 2d 72 65 63 65 69 76 65 20 69 6e 76 65 72 74 20  -receive invert 
1800: 72 65 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20 61  resend-toggle# a
1810: 6e 64 20 75 6c 69 74 2c 20 61 63 6b 2d 72 65 73  nd ulit, ack-res
1820: 65 6e 64 20 3b 0a 69 6e 20 6e 65 74 32 6f 20 3a  end ;.in net2o :
1830: 20 67 65 6e 2d 72 65 73 65 74 20 28 20 2d 2d 20   gen-reset ( -- 
1840: 29 0a 20 20 20 20 61 63 6b 2d 72 65 73 65 74 20  ).    ack-reset 
1850: 30 20 74 6f 20 61 63 6b 2d 72 65 63 65 69 76 65  0 to ack-receive
1860: 20 3b 0a 0a 3a 20 72 65 77 69 6e 64 20 28 20 2d   ;..: rewind ( -
1870: 2d 20 29 0a 20 20 20 20 64 61 74 61 2d 72 6d 61  - ).    data-rma
1880: 70 20 2e 6d 61 70 63 3a 64 65 73 74 2d 62 61 63  p .mapc:dest-bac
1890: 6b 20 75 6c 69 74 2c 20 61 63 6b 2d 66 6c 75 73  k ulit, ack-flus
18a0: 68 20 3b 0a 0a 5c 20 73 61 66 65 20 69 6e 69 74  h ;..\ safe init
18b0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 0a 3a 20 6c 69  ialization..: li
18c0: 74 3c 20 20 20 6c 69 74 2c 20 70 75 73 68 2d 6c  t<   lit, push-l
18d0: 69 74 20 3b 0a 3a 6e 6f 6e 61 6d 65 20 28 20 74  it ;.:noname ( t
18e0: 68 72 6f 77 63 6f 64 65 20 2d 2d 20 29 0a 20 20  hrowcode -- ).  
18f0: 20 20 72 65 6d 6f 74 65 3f 20 40 20 49 46 0a 09    remote? @ IF..
1900: 3f 64 75 70 2d 49 46 20 20 69 6e 69 74 2d 72 65  ?dup-IF  init-re
1910: 70 6c 79 0a 09 20 20 20 20 24 65 72 72 6f 72 2d  ply..    $error-
1920: 69 64 20 24 40 20 64 75 70 20 49 46 20 20 24 2c  id $@ dup IF  $,
1930: 20 65 72 72 6f 72 2d 69 64 20 20 45 4c 53 45 20   error-id  ELSE 
1940: 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 09 20 20   2drop  THEN..  
1950: 20 20 6e 6c 69 74 2c 20 6b 6f 20 20 54 48 45 4e    nlit, ko  THEN
1960: 0a 20 20 20 20 45 4c 53 45 0a 09 65 72 72 6f 72  .    ELSE..error
1970: 2d 69 64 3e 6f 20 3f 64 75 70 2d 49 46 0a 09 20  -id>o ?dup-IF.. 
1980: 20 20 20 3e 6f 20 3c 65 76 65 6e 74 20 65 6c 69     >o <event eli
1990: 74 2c 20 3a 3e 74 68 72 6f 77 20 77 61 69 74 2d  t, :>throw wait-
19a0: 74 61 73 6b 20 40 20 65 76 65 6e 74 3e 20 6f 3e  task @ event> o>
19b0: 0a 09 45 4c 53 45 20 20 74 68 72 6f 77 20 20 54  ..ELSE  throw  T
19c0: 48 45 4e 0a 20 20 20 20 54 48 45 4e 20 3b 20 49  HEN.    THEN ; I
19d0: 53 20 3e 74 68 72 6f 77 0a 0a 61 6c 73 6f 20 7d  S >throw..also }
19e0: 73 63 6f 70 65 0a 0a 3a 20 62 6c 6f 63 6b 73 69  scope..: blocksi
19f0: 7a 65 21 20 28 20 6e 20 2d 2d 20 29 20 20 6d 61  ze! ( n -- )  ma
1a00: 78 2d 62 6c 6f 63 6b 23 20 75 6d 69 6e 20 64 75  x-block# umin du
1a10: 70 20 75 6c 69 74 2c 20 73 65 74 2d 62 6c 6f 63  p ulit, set-bloc
1a20: 6b 73 69 7a 65 0a 20 20 20 20 31 20 73 77 61 70  ksize.    1 swap
1a30: 20 6c 73 68 69 66 74 20 62 6c 6f 63 6b 73 69 7a   lshift blocksiz
1a40: 65 73 21 20 3b 0a 3a 20 62 6c 6f 63 6b 61 6c 69  es! ;.: blockali
1a50: 67 6e 21 20 28 20 6e 20 2d 2d 20 29 20 6d 61 78  gn! ( n -- ) max
1a60: 2d 62 6c 6f 63 6b 23 20 75 6d 69 6e 20 64 75 70  -block# umin dup
1a70: 20 75 6c 69 74 2c 20 73 65 74 2d 62 6c 6f 63 6b   ulit, set-block
1a80: 61 6c 69 67 6e 0a 20 20 20 20 31 20 73 77 61 70  align.    1 swap
1a90: 20 6c 73 68 69 66 74 20 62 6c 6f 63 6b 61 6c 69   lshift blockali
1aa0: 67 6e 20 21 20 3b 0a 0a 3a 20 6f 70 65 6e 2d 73  gn ! ;..: open-s
1ab0: 69 7a 65 64 2d 66 69 6c 65 20 28 20 61 64 64 72  ized-file ( addr
1ac0: 20 75 20 6d 6f 64 65 20 2d 2d 29 0a 20 20 20 20   u mode --).    
1ad0: 6f 70 65 6e 2d 66 69 6c 65 20 67 65 74 2d 73 69  open-file get-si
1ae0: 7a 65 20 3b 0a 3a 20 6f 70 65 6e 2d 74 72 61 63  ze ;.: open-trac
1af0: 6b 65 64 2d 66 69 6c 65 20 28 20 61 64 64 72 20  ked-file ( addr 
1b00: 75 20 6d 6f 64 65 20 2d 2d 29 0a 20 20 20 20 6f  u mode --).    o
1b10: 70 65 6e 2d 73 69 7a 65 64 2d 66 69 6c 65 20 67  pen-sized-file g
1b20: 65 74 2d 73 74 61 74 20 3b 0a 0a 3a 20 6e 32 6f  et-stat ;..: n2o
1b30: 3e 66 69 6c 65 20 28 20 78 74 20 2d 2d 20 29 0a  >file ( xt -- ).
1b40: 20 20 20 20 66 69 6c 65 2d 72 65 67 23 20 40 20      file-reg# @ 
1b50: 75 6c 69 74 2c 20 66 69 6c 65 2d 69 64 20 20 63  ulit, file-id  c
1b60: 61 74 63 68 20 20 65 6e 64 2d 77 69 74 68 0a 20  atch  end-with. 
1b70: 20 20 20 74 68 72 6f 77 20 20 31 20 66 69 6c 65     throw  1 file
1b80: 2d 72 65 67 23 20 2b 21 20 3b 0a 0a 69 6e 20 6e  -reg# +! ;..in n
1b90: 65 74 32 6f 20 3a 20 63 6f 70 79 20 28 20 61 64  et2o : copy ( ad
1ba0: 64 72 73 72 63 20 75 73 20 61 64 64 72 64 65 73  drsrc us addrdes
1bb0: 74 20 75 64 20 2d 2d 20 29 0a 20 20 20 20 5b 3a  t ud -- ).    [:
1bc0: 20 66 69 6c 65 28 20 2e 22 20 63 6f 70 79 20 27   file( ." copy '
1bd0: 22 20 32 6f 76 65 72 20 66 6f 72 74 68 3a 74 79  " 2over forth:ty
1be0: 70 65 20 2e 22 20 27 20 2d 3e 20 27 22 20 32 64  pe ." ' -> '" 2d
1bf0: 75 70 20 66 6f 72 74 68 3a 74 79 70 65 0a 20 20  up forth:type.  
1c00: 20 20 20 20 2e 22 20 27 22 20 66 6f 72 74 68 3a      ." '" forth:
1c10: 63 72 20 29 0a 20 20 20 20 20 20 32 73 77 61 70  cr ).      2swap
1c20: 20 24 2c 20 72 2f 6f 20 75 6c 69 74 2c 20 6f 70   $, r/o ulit, op
1c30: 65 6e 2d 74 72 61 63 6b 65 64 2d 66 69 6c 65 0a  en-tracked-file.
1c40: 20 20 20 20 20 20 66 69 6c 65 2d 72 65 67 23 20        file-reg# 
1c50: 40 20 73 61 76 65 2d 74 6f 20 3b 5d 20 6e 32 6f  @ save-to ;] n2o
1c60: 3e 66 69 6c 65 0a 20 20 20 20 31 20 66 69 6c 65  >file.    1 file
1c70: 2d 63 6f 75 6e 74 20 2b 21 20 3b 0a 0a 69 6e 20  -count +! ;..in 
1c80: 6e 65 74 32 6f 20 3a 20 63 6f 70 79 23 20 28 20  net2o : copy# ( 
1c90: 61 64 64 72 68 61 73 68 20 75 20 2d 2d 20 29 0a  addrhash u -- ).
1ca0: 20 20 20 20 5b 3a 20 66 69 6c 65 28 20 2e 22 20      [: file( ." 
1cb0: 63 6f 70 79 23 20 22 20 32 64 75 70 20 38 35 74  copy# " 2dup 85t
1cc0: 79 70 65 20 66 6f 72 74 68 3a 63 72 20 29 0a 20  ype forth:cr ). 
1cd0: 20 20 20 20 20 31 20 75 6c 69 74 2c 20 66 69 6c       1 ulit, fil
1ce0: 65 2d 74 79 70 65 20 32 64 75 70 20 24 2c 20 72  e-type 2dup $, r
1cf0: 2f 6f 20 75 6c 69 74 2c 20 6f 70 65 6e 2d 74 72  /o ulit, open-tr
1d00: 61 63 6b 65 64 2d 66 69 6c 65 0a 20 20 20 20 20  acked-file.     
1d10: 20 66 69 6c 65 2d 72 65 67 23 20 40 20 73 61 76   file-reg# @ sav
1d20: 65 2d 74 6f 23 20 3b 5d 20 6e 32 6f 3e 66 69 6c  e-to# ;] n2o>fil
1d30: 65 0a 20 20 20 20 31 20 66 69 6c 65 2d 63 6f 75  e.    1 file-cou
1d40: 6e 74 20 2b 21 20 3b 0a 0a 3a 20 73 65 65 6b 21  nt +! ;..: seek!
1d50: 20 28 20 70 6f 73 20 69 64 20 2d 2d 20 29 20 3e   ( pos id -- ) >
1d60: 72 20 64 3e 36 34 0a 20 20 20 20 36 34 64 75 70  r d>64.    64dup
1d70: 20 72 40 20 73 74 61 74 65 2d 61 64 64 72 20 3e   r@ state-addr >
1d80: 6f 20 74 6f 20 66 73 2d 73 65 65 6b 20 6f 3e 0a  o to fs-seek o>.
1d90: 20 20 20 20 72 3e 20 75 6c 69 74 2c 20 66 69 6c      r> ulit, fil
1da0: 65 2d 69 64 20 6c 69 74 2c 20 73 65 74 2d 73 65  e-id lit, set-se
1db0: 65 6b 20 65 6e 64 2d 77 69 74 68 20 3b 0a 0a 3a  ek end-with ;..:
1dc0: 20 6c 69 6d 69 74 21 20 28 20 70 6f 73 20 69 64   limit! ( pos id
1dd0: 20 2d 2d 20 29 20 3e 72 20 64 3e 36 34 0a 20 20   -- ) >r d>64.  
1de0: 20 20 72 40 20 75 6c 69 74 2c 20 66 69 6c 65 2d    r@ ulit, file-
1df0: 69 64 20 36 34 64 75 70 20 6c 69 74 2c 20 73 65  id 64dup lit, se
1e00: 74 2d 6c 69 6d 69 74 20 65 6e 64 2d 77 69 74 68  t-limit end-with
1e10: 0a 20 20 20 20 72 3e 20 69 6e 69 74 2d 6c 69 6d  .    r> init-lim
1e20: 69 74 21 20 3b 0a 0a 70 72 65 76 69 6f 75 73 0a  it! ;..previous.
1e30: 0a 5c 20 63 6c 69 65 6e 74 20 73 69 64 65 20 74  .\ client side t
1e40: 69 6d 69 6e 67 0a 0a 3a 20 61 63 6b 2d 73 69 7a  iming..: ack-siz
1e50: 65 20 28 20 2d 2d 20 29 20 20 31 20 61 63 6b 73  e ( -- )  1 acks
1e60: 20 2b 21 0a 20 20 20 20 61 63 6b 40 20 2e 72 65   +!.    ack@ .re
1e70: 63 76 2d 74 69 63 6b 20 36 34 40 20 36 34 64 75  cv-tick 64@ 64du
1e80: 70 20 6c 61 73 74 62 2d 74 69 63 6b 73 20 36 34  p lastb-ticks 64
1e90: 21 40 20 36 34 2d 20 6d 61 78 2d 64 74 69 63 6b  !@ 64- max-dtick
1ea0: 73 20 36 34 6d 61 78 21 20 3b 0a 3a 20 61 63 6b  s 64max! ;.: ack
1eb0: 2d 66 69 72 73 74 20 28 20 2d 2d 20 29 0a 20 20  -first ( -- ).  
1ec0: 20 20 6c 61 73 74 62 2d 74 69 63 6b 73 20 36 34    lastb-ticks 64
1ed0: 40 20 66 69 72 73 74 62 2d 74 69 63 6b 73 20 36  @ firstb-ticks 6
1ee0: 34 40 20 36 34 2d 20 64 65 6c 74 61 2d 74 69 63  4@ 64- delta-tic
1ef0: 6b 73 20 36 34 2b 21 0a 20 20 20 20 61 63 6b 40  ks 64+!.    ack@
1f00: 20 2e 72 65 63 76 2d 74 69 63 6b 20 36 34 40 20   .recv-tick 64@ 
1f10: 36 34 64 75 70 20 66 69 72 73 74 62 2d 74 69 63  64dup firstb-tic
1f20: 6b 73 20 36 34 21 20 20 36 34 64 75 70 20 6c 61  ks 64!  64dup la
1f30: 73 74 62 2d 74 69 63 6b 73 20 36 34 21 0a 20 20  stb-ticks 64!.  
1f40: 20 20 6c 61 73 74 2d 72 74 69 63 6b 20 36 34 21    last-rtick 64!
1f50: 20 20 72 65 63 76 2d 61 64 64 72 20 36 34 40 20    recv-addr 64@ 
1f60: 6c 61 73 74 2d 72 61 64 64 72 20 36 34 21 20 3b  last-raddr 64! ;
1f70: 0a 0a 3a 20 61 63 6b 2d 74 69 6d 69 6e 67 20 28  ..: ack-timing (
1f80: 20 6e 20 2d 2d 20 29 0a 20 20 20 20 62 32 62 2d   n -- ).    b2b-
1f90: 74 6f 67 67 6c 65 23 20 61 6e 64 20 20 49 46 20  toggle# and  IF 
1fa0: 20 61 63 6b 2d 66 69 72 73 74 20 20 45 4c 53 45   ack-first  ELSE
1fb0: 20 20 61 63 6b 2d 73 69 7a 65 20 20 54 48 45 4e    ack-size  THEN
1fc0: 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d 62   ;..also net2o-b
1fd0: 61 73 65 0a 0a 3a 20 73 65 74 72 61 74 65 2d 6c  ase..: setrate-l
1fe0: 69 6d 69 74 20 28 20 72 61 74 65 20 2d 2d 20 72  imit ( rate -- r
1ff0: 61 74 65 27 20 29 0a 20 20 20 20 5c 20 64 6f 20  ate' ).    \ do 
2000: 6e 6f 74 20 63 68 61 6e 67 65 20 72 65 71 75 65  not change reque
2010: 73 74 65 64 20 72 61 74 65 20 62 79 20 6d 6f 72  sted rate by mor
2020: 65 20 74 68 61 6e 20 61 20 66 61 63 74 6f 72 20  e than a factor 
2030: 32 0a 20 20 20 20 6c 61 73 74 2d 72 61 74 65 20  2.    last-rate 
2040: 36 34 40 0a 20 20 20 20 36 34 64 75 70 20 36 34  64@.    64dup 64
2050: 2d 30 3c 3e 20 49 46 20 20 36 34 74 75 63 6b 20  -0<> IF  64tuck 
2060: 36 34 2d 32 2a 20 36 34 6d 69 6e 20 36 34 73 77  64-2* 64min 64sw
2070: 61 70 20 36 34 2d 32 2f 20 36 34 6d 61 78 20 20  ap 64-2/ 64max  
2080: 45 4c 53 45 20 20 36 34 64 72 6f 70 20 20 54 48  ELSE  64drop  TH
2090: 45 4e 0a 20 20 20 20 36 34 64 75 70 20 6c 61 73  EN.    64dup las
20a0: 74 2d 72 61 74 65 20 36 34 21 20 3b 0a 0a 3a 20  t-rate 64! ;..: 
20b0: 3e 72 61 74 65 20 28 20 2d 2d 20 29 20 20 64 65  >rate ( -- )  de
20c0: 6c 74 61 2d 74 69 63 6b 73 20 36 34 40 20 36 34  lta-ticks 64@ 64
20d0: 2d 30 3d 20 61 63 6b 73 20 40 20 30 3d 20 6f 72  -0= acks @ 0= or
20e0: 20 3f 45 58 49 54 0a 20 20 20 20 61 63 6b 40 20   ?EXIT.    ack@ 
20f0: 2e 72 65 63 76 2d 74 69 63 6b 20 36 34 40 20 36  .recv-tick 64@ 6
2100: 34 64 75 70 20 62 75 72 73 74 2d 74 69 63 6b 73  4dup burst-ticks
2110: 20 36 34 21 40 20 36 34 64 75 70 20 36 34 2d 30   64!@ 64dup 64-0
2120: 3c 3e 20 49 46 0a 09 36 34 2d 20 6d 61 78 2d 64  <> IF..64- max-d
2130: 74 69 63 6b 73 20 36 34 40 20 74 69 63 6b 2d 69  ticks 64@ tick-i
2140: 6e 69 74 20 31 2b 20 6e 3e 36 34 20 36 34 2a 20  nit 1+ n>64 64* 
2150: 36 34 6d 61 78 20 36 34 3e 72 0a 09 64 65 6c 74  64max 64>r..delt
2160: 61 2d 74 69 63 6b 73 20 36 34 40 20 74 69 63 6b  a-ticks 64@ tick
2170: 2d 69 6e 69 74 20 31 2b 20 61 63 6b 73 20 40 20  -init 1+ acks @ 
2180: 36 34 2a 2f 20 73 65 74 72 61 74 65 2d 6c 69 6d  64*/ setrate-lim
2190: 69 74 0a 09 6c 69 74 2c 20 36 34 72 3e 20 6c 69  it..lit, 64r> li
21a0: 74 2c 20 73 65 74 2d 72 61 74 65 0a 20 20 20 20  t, set-rate.    
21b0: 45 4c 53 45 0a 09 36 34 64 72 6f 70 20 36 34 64  ELSE..64drop 64d
21c0: 72 6f 70 0a 20 20 20 20 54 48 45 4e 0a 20 20 20  rop.    THEN.   
21d0: 20 64 65 6c 74 61 2d 74 69 63 6b 73 20 36 34 6f   delta-ticks 64o
21e0: 66 66 20 20 6d 61 78 2d 64 74 69 63 6b 73 20 36  ff  max-dticks 6
21f0: 34 6f 66 66 20 20 61 63 6b 73 20 6f 66 66 20 3b  4off  acks off ;
2200: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 61 63 6b  ..in net2o : ack
2210: 74 69 6d 65 20 28 20 2d 2d 20 29 0a 20 20 20 20  time ( -- ).    
2220: 72 65 63 76 2d 61 64 64 72 20 36 34 40 20 61 63  recv-addr 64@ ac
2230: 6b 40 20 2e 72 65 63 76 2d 74 69 63 6b 20 36 34  k@ .recv-tick 64
2240: 40 20 61 63 6b 40 20 2e 74 69 6d 65 2d 6f 66 66  @ ack@ .time-off
2250: 73 65 74 20 36 34 40 20 36 34 2d 0a 20 20 20 20  set 64@ 64-.    
2260: 74 69 6d 69 6e 67 28 20 36 34 3e 72 20 36 34 64  timing( 64>r 64d
2270: 75 70 20 78 36 34 2e 20 36 34 72 3e 20 36 34 64  up x64. 64r> 64d
2280: 75 70 20 75 36 34 2e 20 2e 22 20 61 63 6b 74 69  up u64. ." ackti
2290: 6d 65 22 20 66 6f 72 74 68 3a 63 72 20 29 0a 20  me" forth:cr ). 
22a0: 20 20 20 6c 69 74 2c 20 6c 69 74 2c 20 61 63 6b     lit, lit, ack
22b0: 2d 61 64 64 72 74 69 6d 65 20 3b 0a 69 6e 20 6e  -addrtime ;.in n
22c0: 65 74 32 6f 20 3a 20 62 32 62 74 69 6d 65 20 28  et2o : b2btime (
22d0: 20 2d 2d 20 29 0a 20 20 20 20 6c 61 73 74 2d 72   -- ).    last-r
22e0: 61 64 64 72 20 36 34 40 20 6c 61 73 74 2d 72 74  addr 64@ last-rt
22f0: 69 63 6b 20 36 34 40 20 36 34 64 75 70 20 36 34  ick 64@ 64dup 64
2300: 2d 30 3d 0a 20 20 20 20 49 46 20 20 36 34 64 72  -0=.    IF  64dr
2310: 6f 70 20 36 34 64 72 6f 70 0a 20 20 20 20 45 4c  op 64drop.    EL
2320: 53 45 20 20 61 63 6b 40 20 2e 74 69 6d 65 2d 6f  SE  ack@ .time-o
2330: 66 66 73 65 74 20 36 34 40 20 36 34 2d 20 6c 69  ffset 64@ 64- li
2340: 74 2c 20 6c 69 74 2c 20 61 63 6b 2d 62 32 62 74  t, lit, ack-b2bt
2350: 69 6d 65 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 61  ime  THEN ;..\ a
2360: 63 6b 20 62 69 74 73 2c 20 6e 65 77 20 63 6f 64  ck bits, new cod
2370: 65 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 61 63  e..in net2o : ac
2380: 6b 2d 72 65 73 65 6e 64 23 20 28 20 2d 2d 20 29  k-resend# ( -- )
2390: 20 20 64 61 74 61 2d 72 6d 61 70 20 7b 20 6d 61    data-rmap { ma
23a0: 70 20 7d 0a 20 20 20 20 6d 61 70 20 2e 6d 61 70  p }.    map .map
23b0: 63 3a 64 61 74 61 2d 72 65 73 65 6e 64 23 2d 62  c:data-resend#-b
23c0: 75 66 20 24 40 0a 20 20 20 20 62 6f 75 6e 64 73  uf $@.    bounds
23d0: 20 3f 44 4f 0a 09 49 20 24 40 20 6f 76 65 72 20   ?DO..I $@ over 
23e0: 40 20 3e 72 20 63 65 6c 6c 20 2f 73 74 72 69 6e  @ >r cell /strin
23f0: 67 20 24 46 46 20 2d 73 6b 69 70 0a 09 64 75 70  g $FF -skip..dup
2400: 20 3e 72 20 24 46 46 20 73 6b 69 70 20 64 75 70   >r $FF skip dup
2410: 20 49 46 0a 09 20 20 20 20 72 3e 20 6f 76 65 72   IF..    r> over
2420: 20 2d 20 72 3e 20 2b 20 75 6c 69 74 2c 20 24 2c   - r> + ulit, $,
2430: 20 61 63 6b 2d 72 65 73 65 6e 64 23 0a 09 45 4c   ack-resend#..EL
2440: 53 45 20 20 32 64 72 6f 70 20 72 64 72 6f 70 20  SE  2drop rdrop 
2450: 72 64 72 6f 70 20 20 54 48 45 4e 0a 20 20 20 20  rdrop  THEN.    
2460: 63 65 6c 6c 20 2b 4c 4f 4f 50 0a 20 20 20 20 6d  cell +LOOP.    m
2470: 61 70 20 2e 6d 61 70 63 3a 64 61 74 61 2d 72 65  ap .mapc:data-re
2480: 73 65 6e 64 23 2d 62 75 66 20 24 5b 5d 6f 66 66  send#-buf $[]off
2490: 20 3b 0a 0a 5c 20 63 6c 69 65 6e 74 20 73 69 64   ;..\ client sid
24a0: 65 20 61 63 6b 6e 6f 77 6c 65 64 67 65 0a 0a 69  e acknowledge..i
24b0: 6e 20 6e 65 74 32 6f 20 3a 20 67 65 6e 61 63 6b  n net2o : genack
24c0: 20 28 20 2d 2d 20 29 0a 20 20 20 20 6e 65 74 32   ( -- ).    net2
24d0: 6f 3a 61 63 6b 2d 72 65 73 65 6e 64 23 20 20 6e  o:ack-resend#  n
24e0: 65 74 32 6f 3a 62 32 62 74 69 6d 65 20 20 6e 65  et2o:b2btime  ne
24f0: 74 32 6f 3a 61 63 6b 74 69 6d 65 20 20 3e 72 61  t2o:acktime  >ra
2500: 74 65 20 3b 0a 0a 3a 20 21 72 64 61 74 61 2d 74  te ;..: !rdata-t
2510: 61 69 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 64  ail ( -- ).    d
2520: 61 74 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61  ata-rmap with ma
2530: 70 63 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 23  pc.    data-ack#
2540: 20 40 20 62 79 74 65 73 3e 61 64 64 72 0a 20 20   @ bytes>addr.  
2550: 20 20 64 65 73 74 2d 68 65 61 64 20 75 6d 69 6e    dest-head umin
2560: 20 64 65 73 74 2d 74 6f 70 20 75 6d 69 6e 0a 20   dest-top umin. 
2570: 20 20 20 64 65 73 74 2d 74 61 69 6c 20 75 6d 61     dest-tail uma
2580: 78 20 64 75 70 20 61 64 64 72 20 64 65 73 74 2d  x dup addr dest-
2590: 74 61 69 6c 20 21 40 20 65 6e 64 77 69 74 68 0a  tail !@ endwith.
25a0: 20 20 20 20 61 63 6b 28 20 2e 22 20 74 61 69 6c      ack( ." tail
25b0: 3a 20 22 20 6f 76 65 72 20 68 65 78 2e 20 64 75  : " over hex. du
25c0: 70 20 68 65 78 2e 20 66 6f 72 74 68 3a 63 72 20  p hex. forth:cr 
25d0: 29 0a 20 20 20 20 75 3e 20 49 46 20 20 6e 65 74  ).    u> IF  net
25e0: 32 6f 3a 73 61 76 65 26 20 36 34 23 30 20 62 75  2o:save& 64#0 bu
25f0: 72 73 74 2d 74 69 63 6b 73 20 36 34 21 20 20 54  rst-ticks 64!  T
2600: 48 45 4e 20 3b 0a 0a 24 32 30 20 56 61 6c 75 65  HEN ;..$20 Value
2610: 20 6d 61 78 2d 72 65 73 65 6e 64 23 0a 0a 3a 20   max-resend#..: 
2620: 70 72 65 70 61 72 65 2d 72 65 73 65 6e 64 20 28  prepare-resend (
2630: 20 66 6c 61 67 20 2d 2d 20 65 6e 64 20 73 74 61   flag -- end sta
2640: 72 74 20 61 63 6b 73 20 61 63 6b 6d 20 74 61 69  rt acks ackm tai
2650: 62 69 74 73 20 62 61 63 6b 62 69 74 73 20 29 0a  bits backbits ).
2660: 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 77 69      data-rmap wi
2670: 74 68 20 6d 61 70 63 0a 20 20 20 20 61 63 6b 28  th mapc.    ack(
2680: 20 2e 22 20 68 65 61 64 2f 74 61 69 6c 3a 20 22   ." head/tail: "
2690: 20 64 75 70 20 66 6f 72 74 68 3a 2e 20 64 65 73   dup forth:. des
26a0: 74 2d 68 65 61 64 20 68 65 78 2e 20 64 65 73 74  t-head hex. dest
26b0: 2d 74 61 69 6c 20 68 65 78 2e 20 66 6f 72 74 68  -tail hex. forth
26c0: 3a 63 72 20 29 0a 20 20 20 20 49 46 20 20 20 20  :cr ).    IF    
26d0: 64 65 73 74 2d 68 65 61 64 20 61 64 64 72 3e 62  dest-head addr>b
26e0: 79 74 65 73 20 2d 34 20 61 6e 64 0a 20 20 20 20  ytes -4 and.    
26f0: 45 4c 53 45 20 20 64 65 73 74 2d 68 65 61 64 20  ELSE  dest-head 
2700: 31 2d 20 61 64 64 72 3e 62 79 74 65 73 20 31 2b  1- addr>bytes 1+
2710: 20 20 54 48 45 4e 20 30 20 6d 61 78 0a 20 20 20    THEN 0 max.   
2720: 20 64 65 73 74 2d 74 61 69 6c 20 61 64 64 72 3e   dest-tail addr>
2730: 62 79 74 65 73 20 2d 34 20 61 6e 64 20 5c 20 64  bytes -4 and \ d
2740: 75 70 20 64 61 74 61 2d 61 63 6b 23 20 75 6d 69  up data-ack# umi
2750: 6e 21 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 62  n!.    data-ackb
2760: 69 74 73 20 40 20 64 65 73 74 2d 73 69 7a 65 20  its @ dest-size 
2770: 61 64 64 72 3e 62 79 74 65 73 20 31 2d 0a 20 20  addr>bytes 1-.  
2780: 20 20 64 65 73 74 2d 74 61 69 6c 20 61 64 64 72    dest-tail addr
2790: 3e 62 69 74 73 20 64 65 73 74 2d 62 61 63 6b 20  >bits dest-back 
27a0: 64 65 73 74 2d 73 69 7a 65 20 2b 20 61 64 64 72  dest-size + addr
27b0: 3e 62 69 74 73 20 65 6e 64 77 69 74 68 20 3b 0a  >bits endwith ;.
27c0: 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 64 6f 2d 72  .in net2o : do-r
27d0: 65 73 65 6e 64 20 28 20 66 6c 61 67 20 2d 2d 20  esend ( flag -- 
27e0: 29 0a 20 20 20 20 6f 20 30 3d 20 49 46 20 20 64  ).    o 0= IF  d
27f0: 72 6f 70 20 45 58 49 54 20 20 54 48 45 4e 20 20  rop EXIT  THEN  
2800: 64 61 74 61 2d 72 6d 61 70 20 30 3d 20 49 46 20  data-rmap 0= IF 
2810: 20 64 72 6f 70 20 45 58 49 54 20 20 54 48 45 4e   drop EXIT  THEN
2820: 0a 20 20 20 20 30 20 73 77 61 70 20 20 70 72 65  .    0 swap  pre
2830: 70 61 72 65 2d 72 65 73 65 6e 64 20 7b 20 61 63  pare-resend { ac
2840: 6b 73 20 61 63 6b 6d 20 74 61 69 6c 62 69 74 73  ks ackm tailbits
2850: 20 62 61 63 6b 62 69 74 73 20 7d 0a 20 20 20 20   backbits }.    
2860: 61 63 6b 28 20 2e 22 20 61 63 6b 20 6c 6f 6f 70  ack( ." ack loop
2870: 3a 20 22 20 6f 76 65 72 20 68 65 78 2e 20 64 75  : " over hex. du
2880: 70 20 68 65 78 2e 20 66 6f 72 74 68 3a 63 72 20  p hex. forth:cr 
2890: 29 0a 20 20 20 20 2b 44 4f 0a 09 61 63 6b 73 20  ).    +DO..acks 
28a0: 49 20 61 63 6b 6d 20 61 6e 64 20 2b 20 6c 40 0a  I ackm and + l@.
28b0: 09 61 63 6b 73 28 20 2e 22 20 61 63 6b 73 5b 22  .acks( ." acks["
28c0: 20 49 20 62 79 74 65 73 3e 62 69 74 73 20 68 65   I bytes>bits he
28d0: 78 2e 0a 09 49 20 64 61 74 61 2d 72 6d 61 70 20  x...I data-rmap 
28e0: 2e 6d 61 70 63 3a 64 61 74 61 2d 61 63 6b 23 20  .mapc:data-ack# 
28f0: 40 20 3d 20 49 46 20 27 2a 27 20 65 6d 69 74 20  @ = IF '*' emit 
2900: 54 48 45 4e 0a 09 2e 22 20 5d 3d 22 20 64 75 70  THEN..." ]=" dup
2910: 20 68 65 78 2e 20 62 61 63 6b 62 69 74 73 20 68   hex. backbits h
2920: 65 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a 09  ex. forth:cr )..
2930: 49 20 62 79 74 65 73 3e 62 69 74 73 20 74 61 69  I bytes>bits tai
2940: 6c 62 69 74 73 20 75 3c 20 49 46 0a 09 20 20 20  lbits u< IF..   
2950: 20 2d 31 20 74 61 69 6c 62 69 74 73 20 49 20 62   -1 tailbits I b
2960: 79 74 65 73 3e 62 69 74 73 20 2d 20 6c 73 68 69  ytes>bits - lshi
2970: 66 74 20 69 6e 76 65 72 74 20 6f 72 0a 09 54 48  ft invert or..TH
2980: 45 4e 0a 09 64 75 70 20 24 46 46 46 46 46 46 46  EN..dup $FFFFFFF
2990: 46 20 3c 3e 20 49 46 0a 09 20 20 20 20 72 65 73  F <> IF..    res
29a0: 65 6e 64 28 20 2e 22 20 72 65 73 65 6e 64 3a 20  end( ." resend: 
29b0: 22 20 64 75 70 20 68 65 78 2e 20 6f 76 65 72 20  " dup hex. over 
29c0: 68 65 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a  hex. forth:cr ).
29d0: 09 20 20 20 20 49 20 61 63 6b 6d 20 61 6e 64 20  .    I ackm and 
29e0: 62 79 74 65 73 3e 61 64 64 72 20 75 6c 69 74 2c  bytes>addr ulit,
29f0: 20 24 46 46 46 46 46 46 46 46 20 78 6f 72 20 75   $FFFFFFFF xor u
2a00: 6c 69 74 2c 20 72 65 73 65 6e 64 2d 6d 61 73 6b  lit, resend-mask
2a10: 20 20 31 2b 0a 09 45 4c 53 45 0a 09 20 20 20 20    1+..ELSE..    
2a20: 64 72 6f 70 20 64 75 70 20 30 3d 20 49 46 20 5c  drop dup 0= IF \
2a30: 20 69 66 20 77 65 20 64 69 64 6e 27 74 20 68 61   if we didn't ha
2a40: 76 65 20 61 20 72 65 73 65 6e 64 20 79 65 74 2c  ve a resend yet,
2a50: 20 69 6e 63 72 65 61 73 65 20 64 61 74 61 2d 61   increase data-a
2a60: 63 6b 23 0a 09 09 49 20 34 20 2b 20 62 79 74 65  ck#...I 4 + byte
2a70: 73 3e 62 69 74 73 20 62 61 63 6b 62 69 74 73 20  s>bits backbits 
2a80: 75 3c 3d 20 49 46 20 5c 20 6e 6f 20 62 61 63 6b  u<= IF \ no back
2a90: 62 69 74 73 2c 20 70 6c 65 61 73 65 0a 09 09 20  bits, please... 
2aa0: 20 20 20 49 20 34 20 2b 20 64 61 74 61 2d 72 6d     I 4 + data-rm
2ab0: 61 70 20 2e 6d 61 70 63 3a 64 61 74 61 2d 61 63  ap .mapc:data-ac
2ac0: 6b 23 20 75 6d 61 78 21 0a 09 09 54 48 45 4e 0a  k# umax!...THEN.
2ad0: 09 20 20 20 20 54 48 45 4e 0a 09 54 48 45 4e 0a  .    THEN..THEN.
2ae0: 09 64 75 70 20 6d 61 78 2d 72 65 73 65 6e 64 23  .dup max-resend#
2af0: 20 3e 3d 20 3f 4c 45 41 56 45 20 5c 20 6e 6f 20   >= ?LEAVE \ no 
2b00: 6d 6f 72 65 20 74 68 61 6e 20 78 20 72 65 73 65  more than x rese
2b10: 6e 64 73 0a 20 20 20 20 34 20 2b 4c 4f 4f 50 20  nds.    4 +LOOP 
2b20: 20 64 72 6f 70 20 21 72 64 61 74 61 2d 74 61 69   drop !rdata-tai
2b30: 6c 20 3b 0a 0a 3a 20 64 6f 2d 65 78 70 65 63 74  l ;..: do-expect
2b40: 2d 72 65 70 6c 79 20 28 20 2d 2d 20 29 0a 20 20  -reply ( -- ).  
2b50: 20 20 63 6d 64 62 75 66 23 20 40 20 30 3e 20 49    cmdbuf# @ 0> I
2b60: 46 20 5c 20 74 68 65 72 65 27 73 20 61 63 74 75  F \ there's actu
2b70: 61 6c 6c 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e  all something in
2b80: 20 74 68 65 20 62 75 66 66 65 72 0a 09 72 65 70   the buffer..rep
2b90: 6c 79 2d 69 6e 64 65 78 20 75 6c 69 74 2c 20 6f  ly-index ulit, o
2ba0: 6b 3f 20 20 65 6e 64 2d 63 6d 64 0a 09 6e 65 74  k?  end-cmd..net
2bb0: 32 6f 3a 65 78 70 65 63 74 2d 72 65 70 6c 79 20  2o:expect-reply 
2bc0: 20 6d 61 78 64 61 74 61 20 63 6f 64 65 2b 20 5c   maxdata code+ \
2bd0: 20 64 6f 6e 27 74 20 72 65 75 73 65 20 74 68 69   don't reuse thi
2be0: 73 20 62 75 66 66 65 72 0a 20 20 20 20 54 48 45  s buffer.    THE
2bf0: 4e 20 20 5b 27 5d 20 65 6e 64 2d 63 6d 64 20 49  N  ['] end-cmd I
2c00: 53 20 65 78 70 65 63 74 2d 72 65 70 6c 79 3f 20  S expect-reply? 
2c10: 3b 0a 0a 3a 20 64 6f 2d 65 78 70 65 63 74 2b 73  ;..: do-expect+s
2c20: 6c 75 72 70 20 28 20 2d 2d 20 29 0a 20 20 20 20  lurp ( -- ).    
2c30: 63 6d 64 62 75 66 23 20 40 20 30 3e 20 49 46 20  cmdbuf# @ 0> IF 
2c40: 5c 20 74 68 65 72 65 27 73 20 61 63 74 75 61 6c  \ there's actual
2c50: 6c 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 20 74  l something in t
2c60: 68 65 20 62 75 66 66 65 72 0a 09 73 6c 75 72 70  he buffer..slurp
2c70: 20 6e 65 78 74 2d 72 65 71 75 65 73 74 20 66 69   next-request fi
2c80: 6c 65 72 65 71 23 20 21 20 20 74 72 75 65 20 64  lereq# !  true d
2c90: 61 74 61 2d 72 6d 61 70 20 3e 6f 20 74 6f 20 6d  ata-rmap >o to m
2ca0: 61 70 63 3a 64 65 73 74 2d 72 65 71 20 6f 3e 0a  apc:dest-req o>.
2cb0: 09 72 65 70 6c 79 2d 69 6e 64 65 78 20 75 6c 69  .reply-index uli
2cc0: 74 2c 20 6f 6b 3f 20 20 65 6e 64 2d 63 6d 64 0a  t, ok?  end-cmd.
2cd0: 09 6e 65 74 32 6f 3a 65 78 70 65 63 74 2d 72 65  .net2o:expect-re
2ce0: 70 6c 79 20 20 6d 61 78 64 61 74 61 20 63 6f 64  ply  maxdata cod
2cf0: 65 2b 20 5c 20 64 6f 6e 27 74 20 72 65 75 73 65  e+ \ don't reuse
2d00: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 20 20   this buffer.   
2d10: 20 54 48 45 4e 20 20 5b 27 5d 20 65 6e 64 2d 63   THEN  ['] end-c
2d20: 6d 64 20 49 53 20 65 78 70 65 63 74 2d 72 65 70  md IS expect-rep
2d30: 6c 79 3f 20 3b 0a 0a 3a 20 65 78 70 65 63 74 2d  ly? ;..: expect-
2d40: 72 65 70 6c 79 2d 78 74 20 28 20 78 74 20 2d 2d  reply-xt ( xt --
2d50: 20 29 20 5c 20 63 6d 64 28 20 2e 22 20 65 78 70   ) \ cmd( ." exp
2d60: 65 63 74 20 72 65 70 6c 79 3a 22 20 66 6f 72 74  ect reply:" fort
2d70: 68 3a 63 72 20 29 0a 20 20 20 20 5b 27 5d 20 64  h:cr ).    ['] d
2d80: 6f 2d 65 78 70 65 63 74 2d 72 65 70 6c 79 20 49  o-expect-reply I
2d90: 53 20 65 78 70 65 63 74 2d 72 65 70 6c 79 3f 0a  S expect-reply?.
2da0: 20 20 20 20 63 6d 64 2d 72 65 70 6c 79 2d 78 74      cmd-reply-xt
2db0: 20 21 20 3b 0a 0a 3a 20 65 78 70 65 63 74 2d 72   ! ;..: expect-r
2dc0: 65 70 6c 79 20 28 20 2d 2d 20 29 0a 20 20 20 20  eply ( -- ).    
2dd0: 5b 27 5d 20 64 72 6f 70 20 65 78 70 65 63 74 2d  ['] drop expect-
2de0: 72 65 70 6c 79 2d 78 74 20 3b 0a 0a 3a 20 65 78  reply-xt ;..: ex
2df0: 70 65 63 74 2b 73 6c 75 72 70 2d 78 74 20 28 20  pect+slurp-xt ( 
2e00: 78 74 20 2d 2d 20 29 20 5c 20 63 6d 64 28 20 2e  xt -- ) \ cmd( .
2e10: 22 20 65 78 70 65 63 74 20 72 65 70 6c 79 3a 22  " expect reply:"
2e20: 20 66 6f 72 74 68 3a 63 72 20 29 0a 20 20 20 20   forth:cr ).    
2e30: 5b 27 5d 20 64 6f 2d 65 78 70 65 63 74 2b 73 6c  ['] do-expect+sl
2e40: 75 72 70 20 49 53 20 65 78 70 65 63 74 2d 72 65  urp IS expect-re
2e50: 70 6c 79 3f 0a 20 20 20 20 63 6d 64 2d 72 65 70  ply?.    cmd-rep
2e60: 6c 79 2d 78 74 20 21 20 3b 0a 0a 3a 20 65 78 70  ly-xt ! ;..: exp
2e70: 65 63 74 2b 73 6c 75 72 70 20 28 20 2d 2d 20 29  ect+slurp ( -- )
2e80: 0a 20 20 20 20 5b 27 5d 20 64 72 6f 70 20 65 78  .    ['] drop ex
2e90: 70 65 63 74 2b 73 6c 75 72 70 2d 78 74 20 3b 0a  pect+slurp-xt ;.
2ea0: 0a 55 56 61 6c 75 65 20 72 65 63 2d 61 63 6b 2d  .UValue rec-ack-
2eb0: 70 6f 73 23 0a 0a 3a 20 73 65 71 23 2c 20 28 20  pos#..: seq#, ( 
2ec0: 2d 2d 20 29 0a 20 20 20 20 63 6d 64 62 75 66 23  -- ).    cmdbuf#
2ed0: 20 40 20 31 20 3d 20 49 46 0a 09 64 61 74 61 2d   @ 1 = IF..data-
2ee0: 72 6d 61 70 20 2e 6d 61 70 63 3a 72 65 63 2d 61  rmap .mapc:rec-a
2ef0: 63 6b 23 20 75 6c 69 74 2c 20 73 65 71 23 0a 09  ck# ulit, seq#..
2f00: 63 6d 64 62 75 66 23 20 40 20 74 6f 20 72 65 63  cmdbuf# @ to rec
2f10: 2d 61 63 6b 2d 70 6f 73 23 0a 20 20 20 20 54 48  -ack-pos#.    TH
2f20: 45 4e 20 3b 0a 0a 3a 20 72 65 73 65 6e 64 2d 61  EN ;..: resend-a
2f30: 6c 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 65  ll ( -- ).    se
2f40: 71 23 2c 0a 20 20 20 20 66 61 6c 73 65 20 6e 65  q#,.    false ne
2f50: 74 32 6f 3a 64 6f 2d 72 65 73 65 6e 64 0a 20 20  t2o:do-resend.  
2f60: 20 20 61 63 6b 40 20 2e 2b 74 69 6d 65 6f 75 74    ack@ .+timeout
2f70: 73 20 72 65 73 65 6e 64 2d 61 6c 6c 2d 74 6f 20  s resend-all-to 
2f80: 36 34 21 20 3b 0a 0a 30 20 56 61 6c 75 65 20 72  64! ;..0 Value r
2f90: 65 71 75 65 73 74 2d 73 74 61 74 73 3f 0a 0a 3a  equest-stats?..:
2fa0: 20 75 70 64 61 74 65 2d 72 74 64 65 6c 61 79 20   update-rtdelay 
2fb0: 28 20 2d 2d 20 29 0a 20 20 20 20 74 69 63 6b 73  ( -- ).    ticks
2fc0: 20 6c 69 74 2c 20 70 75 73 68 2d 6c 69 74 20 70   lit, push-lit p
2fd0: 75 73 68 27 20 73 65 74 2d 72 74 64 65 6c 61 79  ush' set-rtdelay
2fe0: 20 3b 0a 0a 3a 20 64 61 74 61 2d 65 6e 64 3f 20   ;..: data-end? 
2ff0: 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20  ( -- flag ).    
3000: 30 20 64 61 74 61 2d 72 6d 61 70 20 2e 6d 61 70  0 data-rmap .map
3010: 63 3a 64 65 73 74 2d 65 6e 64 20 21 40 20 3b 0a  c:dest-end !@ ;.
3020: 0a 3a 20 65 78 70 65 63 74 65 64 40 20 28 20 2d  .: expected@ ( -
3030: 2d 20 68 65 61 64 20 74 6f 70 20 29 0a 20 20 20  - head top ).   
3040: 20 6f 20 49 46 20 20 64 61 74 61 2d 72 6d 61 70   o IF  data-rmap
3050: 20 77 69 74 68 20 6d 61 70 63 0a 09 6f 20 49 46   with mapc..o IF
3060: 20 20 64 65 73 74 2d 74 61 69 6c 20 64 65 73 74    dest-tail dest
3070: 2d 74 6f 70 0a 09 20 20 20 20 6d 73 67 28 20 2e  -top..    msg( .
3080: 22 20 65 78 70 65 63 74 65 64 3a 20 22 20 6f 76  " expected: " ov
3090: 65 72 20 68 65 78 2e 20 64 75 70 20 68 65 78 2e  er hex. dup hex.
30a0: 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 45 4c 53   forth:cr )..ELS
30b0: 45 20 20 23 30 2e 20 6d 73 67 28 20 2e 22 20 65  E  #0. msg( ." e
30c0: 78 70 65 63 74 65 64 3a 20 6e 6f 20 64 61 74 61  xpected: no data
30d0: 2d 72 6d 61 70 22 20 66 6f 72 74 68 3a 63 72 20  -rmap" forth:cr 
30e0: 29 20 20 54 48 45 4e 20 65 6e 64 77 69 74 68 0a  )  THEN endwith.
30f0: 20 20 20 20 45 4c 53 45 20 20 23 30 2e 20 6d 73      ELSE  #0. ms
3100: 67 28 20 2e 22 20 65 78 70 65 63 74 65 64 3a 20  g( ." expected: 
3110: 6e 6f 20 6f 62 6a 65 63 74 22 20 66 6f 72 74 68  no object" forth
3120: 3a 63 72 20 29 20 20 54 48 45 4e 20 20 3b 0a 0a  :cr )  THEN  ;..
3130: 3a 20 72 65 77 69 6e 64 2d 74 72 61 6e 73 66 65  : rewind-transfe
3140: 72 20 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20  r ( -- flag ).  
3150: 20 20 64 61 74 61 2d 65 6e 64 3f 20 49 46 20 20    data-end? IF  
3160: 66 69 6c 65 72 65 71 23 20 40 20 6e 65 74 32 6f  filereq# @ net2o
3170: 3a 72 65 71 75 65 73 74 2d 64 6f 6e 65 20 20 66  :request-done  f
3180: 61 6c 73 65 0a 09 64 61 74 61 2d 72 6d 61 70 20  alse..data-rmap 
3190: 3e 6f 20 64 75 70 20 74 6f 20 6d 61 70 63 3a 64  >o dup to mapc:d
31a0: 65 73 74 2d 72 65 71 20 6f 3e 0a 20 20 20 20 45  est-req o>.    E
31b0: 4c 53 45 20 20 64 61 74 61 2d 72 6d 61 70 20 2e  LSE  data-rmap .
31c0: 6d 61 70 63 3a 64 65 73 74 2d 72 65 71 20 20 54  mapc:dest-req  T
31d0: 48 45 4e 20 3b 0a 0a 3a 20 72 65 71 75 65 73 74  HEN ;..: request
31e0: 2d 73 74 61 74 73 20 20 20 66 6f 72 74 68 3a 74  -stats   forth:t
31f0: 72 75 65 20 74 6f 20 72 65 71 75 65 73 74 2d 73  rue to request-s
3200: 74 61 74 73 3f 20 20 61 63 6b 20 74 72 61 63 6b  tats?  ack track
3210: 2d 74 69 6d 69 6e 67 20 65 6e 64 2d 77 69 74 68  -timing end-with
3220: 20 3b 0a 0a 3a 20 65 78 70 65 63 74 65 64 3f 20   ;..: expected? 
3230: 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20  ( -- flag ).    
3240: 65 78 70 65 63 74 65 64 40 20 75 3e 3d 20 49 46  expected@ u>= IF
3250: 0a 09 65 78 70 65 63 74 2d 72 65 70 6c 79 0a 09  ..expect-reply..
3260: 6d 73 67 28 20 2e 22 20 63 68 65 63 6b 3a 20 22  msg( ." check: "
3270: 20 64 61 74 61 2d 72 6d 61 70 20 77 69 74 68 20   data-rmap with 
3280: 6d 61 70 63 0a 09 64 65 73 74 2d 62 61 63 6b 20  mapc..dest-back 
3290: 68 65 78 2e 20 64 65 73 74 2d 74 61 69 6c 20 68  hex. dest-tail h
32a0: 65 78 2e 20 64 65 73 74 2d 68 65 61 64 20 68 65  ex. dest-head he
32b0: 78 2e 0a 09 64 61 74 61 2d 61 63 6b 62 69 74 73  x...data-ackbits
32c0: 20 40 20 64 61 74 61 2d 61 63 6b 23 20 40 20 64   @ data-ack# @ d
32d0: 75 70 20 68 65 78 2e 20 2b 20 6c 40 20 68 65 78  up hex. + l@ hex
32e0: 2e 0a 09 65 6e 64 77 69 74 68 0a 09 66 6f 72 74  ...endwith..fort
32f0: 68 3a 63 72 20 2e 22 20 42 6c 6f 63 6b 20 74 72  h:cr ." Block tr
3300: 61 6e 73 66 65 72 20 64 6f 6e 65 3a 20 22 20 65  ansfer done: " e
3310: 78 70 65 63 74 65 64 40 20 68 65 78 2e 20 68 65  xpected@ hex. he
3320: 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 73  x. forth:cr )..s
3330: 65 71 23 2c 0a 09 6e 65 74 32 6f 3a 73 61 76 65  eq#,..net2o:save
3340: 26 64 6f 6e 65 20 20 6e 65 74 32 6f 3a 61 63 6b  &done  net2o:ack
3350: 2d 72 65 73 65 6e 64 23 20 20 72 65 77 69 6e 64  -resend#  rewind
3360: 20 20 72 65 77 69 6e 64 2d 74 72 61 6e 73 66 65    rewind-transfe
3370: 72 0a 09 36 34 23 30 20 62 75 72 73 74 2d 74 69  r..64#0 burst-ti
3380: 63 6b 73 20 36 34 21 0a 20 20 20 20 45 4c 53 45  cks 64!.    ELSE
3390: 20 20 66 61 6c 73 65 20 20 54 48 45 4e 20 3b 0a    false  THEN ;.
33a0: 0a 63 65 6c 6c 20 38 20 3d 20 5b 49 46 5d 20 36  .cell 8 = [IF] 6
33b0: 20 5b 45 4c 53 45 5d 20 35 20 5b 54 48 45 4e 5d   [ELSE] 5 [THEN]
33c0: 20 43 6f 6e 73 74 61 6e 74 20 63 65 6c 6c 3e 3e   Constant cell>>
33d0: 0a 0a 43 72 65 61 74 65 20 6e 6f 2d 72 65 73 65  ..Create no-rese
33e0: 6e 64 23 20 62 75 72 73 74 73 23 20 34 20 2a 20  nd# bursts# 4 * 
33f0: 30 20 5b 44 4f 5d 20 2d 31 20 63 2c 20 5b 4c 4f  0 [DO] -1 c, [LO
3400: 4f 50 5d 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63  OP]..scope{ mapc
3410: 0a 0a 3a 20 2b 72 65 73 65 6e 64 23 20 28 20 62  ..: +resend# ( b
3420: 69 74 20 2d 2d 20 29 20 3e 72 0a 20 20 20 20 64  it -- ) >r.    d
3430: 65 73 74 2d 61 64 64 72 20 36 34 40 20 36 34 3e  est-addr 64@ 64>
3440: 6e 20 5b 20 6d 69 6e 2d 73 69 7a 65 20 31 2d 20  n [ min-size 1- 
3450: 5d 4c 20 61 6e 64 0a 20 20 20 20 72 40 20 5b 20  ]L and.    r@ [ 
3460: 62 75 72 73 74 73 23 20 34 20 2a 20 31 2d 20 5d  bursts# 4 * 1- ]
3470: 4c 20 61 6e 64 0a 20 20 20 20 72 3e 20 5b 20 62  L and.    r> [ b
3480: 75 72 73 74 73 23 20 2d 34 20 2a 20 5d 4c 20 61  ursts# -4 * ]L a
3490: 6e 64 20 5c 20 6f 6e 65 20 62 6c 6f 63 6b 20 70  nd \ one block p
34a0: 65 72 20 62 75 72 73 74 0a 20 20 20 20 64 61 74  er burst.    dat
34b0: 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 20 24 5b  a-resend#-buf $[
34c0: 5d 23 20 30 20 3f 44 4f 0a 09 64 75 70 20 49 20  ]# 0 ?DO..dup I 
34d0: 64 61 74 61 2d 72 65 73 65 6e 64 23 2d 62 75 66  data-resend#-buf
34e0: 20 24 5b 5d 40 20 64 72 6f 70 20 40 20 3d 20 49   $[]@ drop @ = I
34f0: 46 0a 09 20 20 20 20 64 72 6f 70 20 49 20 64 61  F..    drop I da
3500: 74 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 20 24  ta-resend#-buf $
3510: 5b 5d 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 2b  []@ drop cell+ +
3520: 20 63 21 0a 09 20 20 20 20 55 4e 4c 4f 4f 50 20   c!..    UNLOOP 
3530: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20   EXIT  THEN.    
3540: 4c 4f 4f 50 0a 20 20 20 20 64 61 74 61 2d 72 65  LOOP.    data-re
3550: 73 65 6e 64 23 2d 62 75 66 20 24 5b 5d 23 20 7b  send#-buf $[]# {
3560: 20 77 5e 20 62 75 72 73 74 62 6c 6f 63 6b 20 6e   w^ burstblock n
3570: 20 7d 0a 20 20 20 20 62 75 72 73 74 62 6c 6f 63   }.    burstbloc
3580: 6b 20 63 65 6c 6c 20 64 61 74 61 2d 72 65 73 65  k cell data-rese
3590: 6e 64 23 2d 62 75 66 20 24 2b 5b 5d 21 0a 20 20  nd#-buf $+[]!.  
35a0: 20 20 6e 6f 2d 72 65 73 65 6e 64 23 20 5b 20 62    no-resend# [ b
35b0: 75 72 73 74 73 23 20 34 20 2a 20 5d 4c 20 6e 20  ursts# 4 * ]L n 
35c0: 64 61 74 61 2d 72 65 73 65 6e 64 23 2d 62 75 66  data-resend#-buf
35d0: 20 24 5b 5d 2b 21 0a 20 20 20 20 6e 20 64 61 74   $[]+!.    n dat
35e0: 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 20 24 5b  a-resend#-buf $[
35f0: 5d 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 2b 20  ]@ drop cell+ + 
3600: 63 21 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20  c! ;..}scope..: 
3610: 2b 63 6f 6f 6b 69 65 20 28 20 2d 2d 20 29 0a 20  +cookie ( -- ). 
3620: 20 20 20 64 61 74 61 2d 72 6d 61 70 20 77 69 74     data-rmap wit
3630: 68 20 6d 61 70 63 20 20 61 63 6b 2d 62 69 74 23  h mapc  ack-bit#
3640: 20 40 20 3e 72 20 20 72 40 20 2b 72 65 73 65 6e   @ >r  r@ +resen
3650: 64 23 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 62  d#.    data-ackb
3660: 69 74 73 20 40 20 72 3e 20 2b 62 69 74 40 0a 20  its @ r> +bit@. 
3670: 20 20 20 65 6e 64 77 69 74 68 20 6e 65 67 61 74     endwith negat
3680: 65 20 70 61 63 6b 65 74 72 32 20 2b 21 20 3b 0a  e packetr2 +! ;.
3690: 0a 3a 20 72 65 73 65 6e 64 2d 61 6c 6c 3f 20 28  .: resend-all? (
36a0: 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 64   -- flag ).    d
36b0: 61 74 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61  ata-rmap with ma
36c0: 70 63 0a 20 20 20 20 61 63 6b 2d 61 64 76 61 6e  pc.    ack-advan
36d0: 63 65 3f 20 20 64 65 73 74 2d 68 65 61 64 20 64  ce?  dest-head d
36e0: 65 73 74 2d 74 6f 70 20 75 3e 3d 20 20 61 6e 64  est-top u>=  and
36f0: 20 65 6e 64 77 69 74 68 0a 20 20 20 20 74 69 63   endwith.    tic
3700: 6b 65 72 20 36 34 40 20 72 65 73 65 6e 64 2d 61  ker 64@ resend-a
3710: 6c 6c 2d 74 6f 20 36 34 40 20 36 34 75 3e 3d 20  ll-to 64@ 64u>= 
3720: 61 6e 64 0a 20 20 20 20 74 69 6d 65 6f 75 74 28  and.    timeout(
3730: 20 64 75 70 20 49 46 20 20 2e 22 20 72 65 73 65   dup IF  ." rese
3740: 6e 64 20 61 6c 6c 22 20 66 6f 72 74 68 3a 63 72  nd all" forth:cr
3750: 20 20 54 48 45 4e 20 29 20 3b 0a 0a 3a 20 2b 65    THEN ) ;..: +e
3760: 78 70 65 63 74 65 64 20 28 20 2d 2d 20 66 6c 61  xpected ( -- fla
3770: 67 20 29 0a 20 20 20 20 72 65 73 65 6e 64 2d 61  g ).    resend-a
3780: 6c 6c 3f 20 20 49 46 20 20 20 72 65 73 65 6e 64  ll?  IF   resend
3790: 2d 61 6c 6c 20 20 54 48 45 4e 20 20 65 78 70 65  -all  THEN  expe
37a0: 63 74 65 64 3f 20 3b 0a 0a 5c 20 68 69 67 68 65  cted? ;..\ highe
37b0: 72 20 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r level function
37c0: 73 0a 0a 3a 20 6d 61 70 2d 72 65 71 75 65 73 74  s..: map-request
37d0: 2c 20 28 20 75 63 6f 64 65 20 75 64 61 74 61 20  , ( ucode udata 
37e0: 2d 2d 20 29 0a 20 20 20 20 6e 65 74 32 6f 3a 6e  -- ).    net2o:n
37f0: 65 77 2d 6d 61 70 20 6c 69 74 2c 20 73 77 61 70  ew-map lit, swap
3800: 20 75 6c 69 74 2c 20 75 6c 69 74 2c 20 6d 61 70   ulit, ulit, map
3810: 2d 72 65 71 75 65 73 74 20 3b 0a 0a 61 6c 73 6f  -request ;..also
3820: 20 6e 65 74 32 6f 2d 62 61 73 65 0a 3a 20 6e 61   net2o-base.: na
3830: 74 2d 70 75 6e 63 68 20 28 20 6f 3a 63 6f 6e 6e  t-punch ( o:conn
3840: 65 63 74 69 6f 6e 20 2d 2d 20 29 0a 20 20 20 20  ection -- ).    
3850: 70 69 6e 67 73 20 6e 65 77 2d 72 65 71 75 65 73  pings new-reques
3860: 74 20 66 61 6c 73 65 20 67 65 6e 2d 70 75 6e 63  t false gen-punc
3870: 68 6c 6f 61 64 20 67 65 6e 2d 70 75 6e 63 68 20  hload gen-punch 
3880: 3b 0a 70 72 65 76 69 6f 75 73 0a 0a 3a 20 70 75  ;.previous..: pu
3890: 6e 63 68 2d 72 65 70 6c 79 20 28 20 61 64 64 72  nch-reply ( addr
38a0: 20 75 20 2d 2d 20 29 0a 20 20 20 20 6f 75 74 66   u -- ).    outf
38b0: 6c 61 67 20 40 20 3e 72 20 20 63 6d 64 62 75 66  lag @ >r  cmdbuf
38c0: 2d 6f 20 40 20 3e 72 0a 20 20 20 20 5b 3a 20 63  -o @ >r.    [: c
38d0: 6d 64 30 21 20 63 6d 64 72 65 73 65 74 20 69 6e  md0! cmdreset in
38e0: 69 74 2d 72 65 70 6c 79 20 61 6c 73 6f 20 6e 65  it-reply also ne
38f0: 74 32 6f 2d 62 61 73 65 0a 20 20 20 20 20 20 5b  t2o-base.      [
3900: 20 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73 65   also net2o-base
3910: 20 5d 0a 20 20 20 20 20 20 24 2c 20 6e 65 73 74   ].      $, nest
3920: 20 65 6e 64 2d 63 6f 64 65 20 3b 5d 20 63 61 74   end-code ;] cat
3930: 63 68 0a 20 20 20 20 72 3e 20 63 6d 64 62 75 66  ch.    r> cmdbuf
3940: 2d 6f 20 21 20 20 72 3e 20 6f 75 74 66 6c 61 67  -o !  r> outflag
3950: 20 21 20 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 30   !  throw ;..: 0
3960: 2d 72 65 73 65 6e 64 3f 20 28 20 2d 2d 20 6e 20  -resend? ( -- n 
3970: 29 0a 20 20 20 20 72 65 73 65 6e 64 30 20 40 20  ).    resend0 @ 
3980: 49 46 0a 09 5c 20 2e 22 20 52 65 73 65 6e 64 20  IF..\ ." Resend 
3990: 74 6f 20 30 22 20 63 72 0a 09 63 6d 64 30 21 0a  to 0" cr..cmd0!.
39a0: 09 5b 3a 0a 09 20 20 72 65 73 65 6e 64 28 20 2e  .[:..  resend( .
39b0: 22 20 72 65 73 65 6e 64 30 3a 20 22 20 72 65 73  " resend0: " res
39c0: 65 6e 64 30 20 24 40 20 6e 65 74 32 6f 3a 73 65  end0 $@ net2o:se
39d0: 65 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 20 20  e forth:cr )..  
39e0: 6d 73 67 28 20 2e 22 20 72 65 73 65 6e 64 30 3a  msg( ." resend0:
39f0: 20 22 20 72 65 73 65 6e 64 30 20 24 40 20 73 77   " resend0 $@ sw
3a00: 61 70 20 68 65 78 2e 20 68 65 78 2e 20 66 6f 72  ap hex. hex. for
3a10: 74 68 3a 63 72 20 29 0a 09 20 20 63 6d 64 72 65  th:cr )..  cmdre
3a20: 73 65 74 20 69 6e 69 74 2d 72 65 70 6c 79 20 72  set init-reply r
3a30: 65 73 65 6e 64 30 20 24 40 20 2b 63 6d 64 62 75  esend0 $@ +cmdbu
3a40: 66 0a 09 20 20 72 30 2d 61 64 64 72 65 73 73 20  f..  r0-address 
3a50: 72 65 74 75 72 6e 2d 61 64 64 72 20 24 31 30 20  return-addr $10 
3a60: 6d 6f 76 65 0a 09 20 20 63 6d 64 62 75 66 24 20  move..  cmdbuf$ 
3a70: 72 6e 67 36 34 20 73 65 6e 64 2d 63 6d 64 20 64  rng64 send-cmd d
3a80: 72 6f 70 0a 09 20 20 31 20 70 61 63 6b 65 74 73  rop..  1 packets
3a90: 32 20 2b 21 20 3b 5d 0a 09 63 6d 64 6c 6f 63 6b  2 +! ;]..cmdlock
3aa0: 20 63 2d 73 65 63 74 69 6f 6e 20 20 31 0a 20 20   c-section  1.  
3ab0: 20 20 45 4c 53 45 20 20 30 20 20 54 48 45 4e 20    ELSE  0  THEN 
3ac0: 3b 0a 0a 3a 20 6d 61 70 2d 72 65 73 65 6e 64 3f  ;..: map-resend?
3ad0: 20 28 20 2d 2d 20 6e 20 29 0a 20 20 20 20 63 6f   ( -- n ).    co
3ae0: 64 65 2d 6d 61 70 20 3f 64 75 70 2d 49 46 20 20  de-map ?dup-IF  
3af0: 77 69 74 68 20 6d 61 70 63 20 30 20 20 6f 75 74  with mapc 0  out
3b00: 66 6c 61 67 20 6f 66 66 0a 09 64 65 73 74 2d 72  flag off..dest-r
3b10: 65 70 6c 69 65 73 0a 09 64 65 73 74 2d 73 69 7a  eplies..dest-siz
3b20: 65 20 61 64 64 72 3e 72 65 70 6c 69 65 73 20 62  e addr>replies b
3b30: 6f 75 6e 64 73 20 65 6e 64 77 69 74 68 20 55 2b  ounds endwith U+
3b40: 44 4f 0a 09 20 20 20 20 49 20 61 63 74 69 6f 6e  DO..    I action
3b50: 2d 6f 66 20 72 65 70 6c 79 2d 78 74 20 49 46 0a  -of reply-xt IF.
3b60: 09 09 74 69 6d 65 6f 75 74 28 20 2e 22 20 72 65  ..timeout( ." re
3b70: 73 65 6e 64 3a 20 22 20 49 20 61 63 74 69 6f 6e  send: " I action
3b80: 2d 6f 66 20 72 65 70 6c 79 2d 78 74 20 2e 6e 61  -of reply-xt .na
3b90: 6d 65 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 09  me forth:cr )...
3ba0: 72 65 73 65 6e 64 28 20 2e 22 20 72 65 73 65 6e  resend( ." resen
3bb0: 64 3a 20 22 20 49 20 72 65 70 6c 79 2d 64 65 73  d: " I reply-des
3bc0: 74 20 36 34 40 20 78 36 34 2e 20 49 20 32 40 20  t 64@ x64. I 2@ 
3bd0: 6e 65 74 32 6f 3a 73 65 65 20 66 6f 72 74 68 3a  net2o:see forth:
3be0: 63 72 20 29 0a 09 09 6d 73 67 28 20 2e 22 20 72  cr )...msg( ." r
3bf0: 65 73 65 6e 64 3a 20 22 20 49 20 72 65 70 6c 79  esend: " I reply
3c00: 2d 64 65 73 74 20 36 34 40 20 78 36 34 2e 20 49  -dest 64@ x64. I
3c10: 20 32 40 20 73 77 61 70 20 68 65 78 2e 20 68 65   2@ swap hex. he
3c20: 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 09  x. forth:cr )...
3c30: 74 69 63 6b 73 20 49 20 72 65 70 6c 79 2d 74 69  ticks I reply-ti
3c40: 6d 65 20 36 34 21 0a 09 09 49 20 32 40 20 49 20  me 64!...I 2@ I 
3c50: 72 65 70 6c 79 2d 64 65 73 74 20 36 34 40 20 73  reply-dest 64@ s
3c60: 65 6e 64 2d 63 6d 64 20 64 72 6f 70 0a 09 09 31  end-cmd drop...1
3c70: 20 70 61 63 6b 65 74 73 32 20 2b 21 20 31 2b 0a   packets2 +! 1+.
3c80: 09 20 20 20 20 54 48 45 4e 0a 09 72 65 70 6c 79  .    THEN..reply
3c90: 20 2b 4c 4f 4f 50 0a 20 20 20 20 45 4c 53 45 20   +LOOP.    ELSE 
3ca0: 20 30 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 63 6d   0  THEN ;..: cm
3cb0: 64 2d 72 65 73 65 6e 64 3f 20 28 20 2d 2d 20 6e  d-resend? ( -- n
3cc0: 20 29 0a 20 20 20 20 30 2d 72 65 73 65 6e 64 3f   ).    0-resend?
3cd0: 20 6d 61 70 2d 72 65 73 65 6e 64 3f 0a 20 20 20   map-resend?.   
3ce0: 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 72 65 73   timeout( ." res
3cf0: 65 6e 64 20 22 20 6f 76 65 72 20 2e 20 64 75 70  end " over . dup
3d00: 20 2e 20 2e 22 20 63 6f 6d 6d 61 6e 64 73 20 30   . ." commands 0
3d10: 2f 6d 61 70 22 20 63 72 20 29 20 2b 20 3b 0a 0a  /map" cr ) + ;..
3d20: 3a 20 2e 65 78 70 65 63 74 65 64 20 28 20 2d 2d  : .expected ( --
3d30: 20 29 0a 20 20 20 20 66 6f 72 74 68 3a 2e 74 69   ).    forth:.ti
3d40: 6d 65 20 2e 22 20 65 78 70 65 63 74 65 64 2f 72  me ." expected/r
3d50: 65 63 65 69 76 65 64 3a 20 22 20 72 65 63 76 2d  eceived: " recv-
3d60: 61 64 64 72 20 40 20 68 65 78 2e 0a 20 20 20 20  addr @ hex..    
3d70: 64 61 74 61 2d 72 6d 61 70 20 2e 6d 61 70 63 3a  data-rmap .mapc:
3d80: 64 61 74 61 2d 61 63 6b 23 20 40 20 68 65 78 2e  data-ack# @ hex.
3d90: 0a 20 20 20 20 65 78 70 65 63 74 65 64 40 20 68  .    expected@ h
3da0: 65 78 2e 20 68 65 78 2e 20 66 6f 72 74 68 3a 63  ex. hex. forth:c
3db0: 72 20 3b 0a 0a 5c 20 61 63 6b 6e 6f 77 6c 65 64  r ;..\ acknowled
3dc0: 67 65 20 74 6f 70 6c 65 76 65 6c 0a 0a 69 6e 20  ge toplevel..in 
3dd0: 6e 65 74 32 6f 20 3a 20 61 63 6b 2d 63 6f 64 65  net2o : ack-code
3de0: 20 28 20 61 63 6b 66 6c 61 67 20 2d 2d 20 61 63   ( ackflag -- ac
3df0: 6b 66 6c 61 67 20 29 20 20 3e 72 0a 20 20 20 20  kflag )  >r.    
3e00: 66 61 6c 73 65 20 64 75 70 20 7b 20 73 6c 75 72  false dup { slur
3e10: 70 3f 20 73 74 61 74 73 3f 20 7d 0a 20 20 20 20  p? stats? }.    
3e20: 6e 65 74 32 6f 2d 63 6f 64 65 0a 20 20 20 20 61  net2o-code.    a
3e30: 63 6b 20 65 78 70 65 63 74 2d 72 65 70 6c 79 20  ck expect-reply 
3e40: 20 31 20 74 6f 20 72 65 63 2d 61 63 6b 2d 70 6f   1 to rec-ack-po
3e50: 73 23 0a 20 20 20 20 61 63 6b 28 20 2e 22 20 61  s#.    ack( ." a
3e60: 63 6b 3a 20 22 20 72 40 20 68 65 78 2e 20 66 6f  ck: " r@ hex. fo
3e70: 72 74 68 3a 63 72 20 29 0a 20 20 20 20 72 40 20  rth:cr ).    r@ 
3e80: 61 63 6b 2d 74 6f 67 67 6c 65 23 20 61 6e 64 20  ack-toggle# and 
3e90: 49 46 0a 09 73 65 71 23 2c 0a 09 6e 65 74 32 6f  IF..seq#,..net2o
3ea0: 3a 67 65 6e 2d 72 65 73 65 6e 64 20 20 6e 65 74  :gen-resend  net
3eb0: 32 6f 3a 67 65 6e 61 63 6b 0a 09 72 40 20 72 65  2o:genack..r@ re
3ec0: 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20 61 6e 64  send-toggle# and
3ed0: 20 49 46 0a 09 20 20 20 20 61 63 6b 28 20 2e 22   IF..    ack( ."
3ee0: 20 61 63 6b 3a 20 64 6f 2d 72 65 73 65 6e 64 22   ack: do-resend"
3ef0: 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 20 20 20   forth:cr )..   
3f00: 20 74 72 75 65 20 6e 65 74 32 6f 3a 64 6f 2d 72   true net2o:do-r
3f10: 65 73 65 6e 64 0a 09 54 48 45 4e 0a 09 30 20 64  esend..THEN..0 d
3f20: 61 74 61 2d 72 6d 61 70 20 2e 6d 61 70 63 3a 64  ata-rmap .mapc:d
3f30: 6f 2d 73 6c 75 72 70 20 21 40 0a 09 3f 64 75 70  o-slurp !@..?dup
3f40: 2d 49 46 20 20 75 6c 69 74 2c 20 61 63 6b 2d 66  -IF  ulit, ack-f
3f50: 6c 75 73 68 0a 09 20 20 20 20 72 65 71 75 65 73  lush..    reques
3f60: 74 2d 73 74 61 74 73 3f 20 74 6f 20 73 74 61 74  t-stats? to stat
3f70: 73 3f 20 20 74 72 75 65 20 74 6f 20 73 6c 75 72  s?  true to slur
3f80: 70 3f 20 20 54 48 45 4e 0a 20 20 20 20 54 48 45  p?  THEN.    THE
3f90: 4e 20 20 2b 65 78 70 65 63 74 65 64 0a 20 20 20  N  +expected.   
3fa0: 20 73 6c 75 72 70 3f 20 6f 72 20 74 6f 20 73 6c   slurp? or to sl
3fb0: 75 72 70 3f 0a 20 20 20 20 73 74 61 74 73 3f 20  urp?.    stats? 
3fc0: 49 46 20 20 73 65 6e 64 2d 74 69 6d 69 6e 67 20  IF  send-timing 
3fd0: 20 54 48 45 4e 0a 20 20 20 20 65 6e 64 2d 77 69   THEN.    end-wi
3fe0: 74 68 20 20 63 6d 64 62 75 66 23 20 40 20 72 65  th  cmdbuf# @ re
3ff0: 63 2d 61 63 6b 2d 70 6f 73 23 20 31 2b 20 73 74  c-ack-pos# 1+ st
4000: 61 74 73 3f 20 2d 20 3d 20 49 46 20 20 63 6d 64  ats? - = IF  cmd
4010: 62 75 66 23 20 6f 66 66 0a 20 20 20 20 45 4c 53  buf# off.    ELS
4020: 45 20 20 31 20 64 61 74 61 2d 72 6d 61 70 20 77  E  1 data-rmap w
4030: 69 74 68 20 6d 61 70 63 20 2b 74 6f 20 72 65 63  ith mapc +to rec
4040: 2d 61 63 6b 23 20 65 6e 64 77 69 74 68 20 20 54  -ack# endwith  T
4050: 48 45 4e 0a 20 20 20 20 73 6c 75 72 70 3f 20 49  HEN.    slurp? I
4060: 46 20 20 73 6c 75 72 70 20 20 54 48 45 4e 0a 20  F  slurp  THEN. 
4070: 20 20 20 65 6e 64 2d 63 6f 64 65 20 72 3e 20 28     end-code r> (
4080: 20 64 75 70 20 61 63 6b 2d 74 6f 67 67 6c 65 23   dup ack-toggle#
4090: 20 61 6e 64 20 49 46 20 20 6d 61 70 2d 72 65 73   and IF  map-res
40a0: 65 6e 64 3f 20 20 54 48 45 4e 20 29 20 3b 0a 0a  end?  THEN ) ;..
40b0: 69 6e 20 6e 65 74 32 6f 20 3a 20 64 6f 2d 61 63  in net2o : do-ac
40c0: 6b 2d 72 65 73 74 20 28 20 61 63 6b 66 6c 61 67  k-rest ( ackflag
40d0: 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 72 65   -- ).    dup re
40e0: 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20 61 6e 64  send-toggle# and
40f0: 20 49 46 0a 09 63 6d 64 2d 72 65 73 65 6e 64 3f   IF..cmd-resend?
4100: 20 64 72 6f 70 0a 20 20 20 20 54 48 45 4e 0a 20   drop.    THEN. 
4110: 20 20 20 61 63 6b 73 23 20 61 6e 64 20 64 61 74     acks# and dat
4120: 61 2d 72 6d 61 70 20 2e 6d 61 70 63 3a 61 63 6b  a-rmap .mapc:ack
4130: 2d 61 64 76 61 6e 63 65 3f 0a 20 20 20 20 49 46  -advance?.    IF
4140: 20 20 6e 65 74 32 6f 3a 61 63 6b 2d 63 6f 64 65    net2o:ack-code
4150: 20 20 54 48 45 4e 20 20 61 63 6b 2d 74 69 6d 69    THEN  ack-timi
4160: 6e 67 20 3b 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a  ng ;..in net2o :
4170: 20 64 6f 2d 61 63 6b 20 28 20 2d 2d 20 29 0a 20   do-ack ( -- ). 
4180: 20 20 20 64 65 73 74 2d 61 64 64 72 20 36 34 40     dest-addr 64@
4190: 20 72 65 63 76 2d 61 64 64 72 20 36 34 21 20 20   recv-addr 64!  
41a0: 2b 63 6f 6f 6b 69 65 20 5c 20 6c 61 73 74 20 72  +cookie \ last r
41b0: 65 63 65 69 76 65 64 20 70 61 63 6b 65 74 0a 20  eceived packet. 
41c0: 20 20 20 69 6e 62 75 66 20 31 2b 20 63 40 20 61     inbuf 1+ c@ a
41d0: 63 6b 2d 72 65 63 65 69 76 65 20 6f 76 65 72 20  ck-receive over 
41e0: 74 6f 20 61 63 6b 2d 72 65 63 65 69 76 65 20 78  to ack-receive x
41f0: 6f 72 0a 20 20 20 20 2b 74 69 6d 65 6f 75 74 30  or.    +timeout0
4200: 20 72 65 73 65 6e 64 2d 61 6c 6c 2d 74 6f 20 36   resend-all-to 6
4210: 34 21 0a 20 20 20 20 6e 65 74 32 6f 3a 64 6f 2d  4!.    net2o:do-
4220: 61 63 6b 2d 72 65 73 74 20 3b 0a 0a 3a 20 2b 66  ack-rest ;..: +f
4230: 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 20 5b 27 5d 20  low-control ['] 
4240: 6e 65 74 32 6f 3a 64 6f 2d 61 63 6b 20 69 73 20  net2o:do-ack is 
4250: 61 63 6b 2d 78 74 20 3b 0a 0a 5c 20 6b 65 65 70  ack-xt ;..\ keep
4260: 61 6c 69 76 65 0a 0a 61 6c 73 6f 20 6e 65 74 32  alive..also net2
4270: 6f 2d 62 61 73 65 0a 3a 20 2e 6b 65 65 70 61 6c  o-base.: .keepal
4280: 69 76 65 20 28 20 2d 2d 20 29 20 20 2e 22 20 74  ive ( -- )  ." t
4290: 72 61 6e 73 66 65 72 20 6b 65 65 70 61 6c 69 76  ransfer keepaliv
42a0: 65 20 65 2f 65 20 68 20 74 20 62 20 22 20 65 78  e e/e h t b " ex
42b0: 70 65 63 74 65 64 40 20 68 65 78 2e 20 68 65 78  pected@ hex. hex
42c0: 2e 0a 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20  ..    data-rmap 
42d0: 77 69 74 68 20 6d 61 70 63 20 20 64 65 73 74 2d  with mapc  dest-
42e0: 68 65 61 64 20 68 65 78 2e 20 64 65 73 74 2d 74  head hex. dest-t
42f0: 61 69 6c 20 68 65 78 2e 20 64 65 73 74 2d 62 61  ail hex. dest-ba
4300: 63 6b 20 68 65 78 2e 0a 20 20 20 20 64 61 74 61  ck hex..    data
4310: 2d 61 63 6b 62 69 74 73 20 40 20 64 65 73 74 2d  -ackbits @ dest-
4320: 73 69 7a 65 20 61 64 64 72 3e 62 79 74 65 73 20  size addr>bytes 
4330: 64 75 6d 70 0a 20 20 20 20 65 6e 64 77 69 74 68  dump.    endwith
4340: 0a 20 20 20 20 66 6f 72 74 68 3a 63 72 20 3b 0a  .    forth:cr ;.
4350: 3a 20 74 72 61 6e 73 66 65 72 2d 6b 65 65 70 61  : transfer-keepa
4360: 6c 69 76 65 3f 20 28 20 2d 2d 20 66 6c 61 67 20  live? ( -- flag 
4370: 29 0a 20 20 20 20 6f 20 74 6f 20 63 6f 6e 6e 65  ).    o to conne
4380: 63 74 69 6f 6e 0a 20 20 20 20 74 69 6d 65 6f 75  ction.    timeou
4390: 74 28 20 2e 6b 65 65 70 61 6c 69 76 65 20 29 0a  t( .keepalive ).
43a0: 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 77 69      data-rmap wi
43b0: 74 68 20 6d 61 70 63 20 64 65 73 74 2d 72 65 71  th mapc dest-req
43c0: 20 64 75 70 20 61 63 6b 2d 61 64 76 61 6e 63 65   dup ack-advance
43d0: 3f 20 6f 72 20 74 6f 20 61 63 6b 2d 61 64 76 61  ? or to ack-adva
43e0: 6e 63 65 3f 20 65 6e 64 77 69 74 68 0a 20 20 20  nce? endwith.   
43f0: 20 64 75 70 20 49 46 0a 09 21 74 69 63 6b 73 20   dup IF..!ticks 
4400: 74 69 63 6b 65 72 20 36 34 40 20 72 65 73 65 6e  ticker 64@ resen
4410: 64 2d 61 6c 6c 2d 74 6f 20 36 34 21 0a 09 5b 20  d-all-to 64!..[ 
4420: 61 63 6b 2d 74 6f 67 67 6c 65 23 20 72 65 73 65  ack-toggle# rese
4430: 6e 64 2d 74 6f 67 67 6c 65 23 20 6f 72 20 5d 4c  nd-toggle# or ]L
4440: 20 6e 65 74 32 6f 3a 64 6f 2d 61 63 6b 2d 72 65   net2o:do-ack-re
4450: 73 74 20 20 54 48 45 4e 20 3b 0a 70 72 65 76 69  st  THEN ;.previ
4460: 6f 75 73 0a 0a 3a 20 63 6d 64 2d 74 69 6d 65 6f  ous..: cmd-timeo
4470: 75 74 20 28 20 2d 2d 20 29 20 20 3e 6e 65 78 74  ut ( -- )  >next
4480: 2d 74 69 6d 65 6f 75 74 20 63 6d 64 2d 72 65 73  -timeout cmd-res
4490: 65 6e 64 3f 0a 20 20 20 20 49 46 20 20 70 75 73  end?.    IF  pus
44a0: 68 2d 74 69 6d 65 6f 75 74 20 20 45 4c 53 45 20  h-timeout  ELSE 
44b0: 20 61 63 6b 40 20 2e 74 69 6d 65 6f 75 74 73 20   ack@ .timeouts 
44c0: 6f 66 66 20 20 54 48 45 4e 20 3b 0a 3a 20 63 6f  off  THEN ;.: co
44d0: 6e 6e 65 63 74 65 64 2d 74 69 6d 65 6f 75 74 20  nnected-timeout 
44e0: 28 20 2d 2d 20 29 20 74 69 6d 65 6f 75 74 28 20  ( -- ) timeout( 
44f0: 2e 22 20 63 6f 6e 6e 65 63 74 65 64 20 74 69 6d  ." connected tim
4500: 65 6f 75 74 20 22 20 61 63 6b 40 20 3e 6f 20 72  eout " ack@ >o r
4510: 74 64 65 6c 61 79 20 36 34 40 20 75 36 34 2e 20  tdelay 64@ u64. 
4520: 74 69 6d 65 6f 75 74 73 20 3f 20 6f 3e 20 66 6f  timeouts ? o> fo
4530: 72 74 68 3a 63 72 20 29 0a 20 20 20 20 3e 6e 65  rth:cr ).    >ne
4540: 78 74 2d 74 69 6d 65 6f 75 74 20 63 6d 64 2d 72  xt-timeout cmd-r
4550: 65 73 65 6e 64 3f 0a 20 20 20 20 49 46 0a 09 70  esend?.    IF..p
4560: 75 73 68 2d 74 69 6d 65 6f 75 74 0a 20 20 20 20  ush-timeout.    
4570: 45 4c 53 45 0a 09 74 72 61 6e 73 66 65 72 2d 6b  ELSE..transfer-k
4580: 65 65 70 61 6c 69 76 65 3f 20 30 3d 0a 09 49 46  eepalive? 0=..IF
4590: 20 20 61 63 6b 40 20 2e 74 69 6d 65 6f 75 74 73    ack@ .timeouts
45a0: 20 6f 66 66 20 20 45 4c 53 45 20 20 70 75 73 68   off  ELSE  push
45b0: 2d 74 69 6d 65 6f 75 74 20 20 54 48 45 4e 0a 20  -timeout  THEN. 
45c0: 20 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 3a 20 2b     THEN ;..\ : +
45d0: 63 6f 6e 6e 65 63 74 69 6e 67 20 20 20 5b 27 5d  connecting   [']
45e0: 20 63 6f 6e 6e 65 63 74 69 6e 67 2d 74 69 6d 65   connecting-time
45f0: 6f 75 74 20 69 73 20 74 69 6d 65 6f 75 74 2d 78  out is timeout-x
4600: 74 20 3b 0a 3a 20 2b 72 65 73 65 6e 64 20 28 20  t ;.: +resend ( 
4610: 2d 2d 20 29 20 72 65 73 65 6e 64 28 20 2e 22 20  -- ) resend( ." 
4620: 2b 72 65 73 65 6e 64 22 20 63 72 20 29 0a 20 20  +resend" cr ).  
4630: 20 20 5b 27 5d 20 63 6f 6e 6e 65 63 74 65 64 2d    ['] connected-
4640: 74 69 6d 65 6f 75 74 20 20 69 73 20 74 69 6d 65  timeout  is time
4650: 6f 75 74 2d 78 74 20 6f 2b 74 69 6d 65 6f 75 74  out-xt o+timeout
4660: 0a 20 20 20 20 36 34 23 30 20 72 65 73 65 6e 64  .    64#0 resend
4670: 2d 61 6c 6c 2d 74 6f 20 36 34 21 20 3b 0a 3a 20  -all-to 64! ;.: 
4680: 2b 72 65 73 65 6e 64 2d 63 6d 64 20 28 20 2d 2d  +resend-cmd ( --
4690: 20 29 20 72 65 73 65 6e 64 28 20 2e 22 20 2b 72   ) resend( ." +r
46a0: 65 73 65 6e 64 2d 63 6d 64 22 20 63 72 20 29 0a  esend-cmd" cr ).
46b0: 20 20 20 20 5b 27 5d 20 63 6d 64 2d 74 69 6d 65      ['] cmd-time
46c0: 6f 75 74 20 20 20 20 20 20 20 20 69 73 20 74 69  out        is ti
46d0: 6d 65 6f 75 74 2d 78 74 20 6f 2b 74 69 6d 65 6f  meout-xt o+timeo
46e0: 75 74 20 3b 0a 0a 3a 20 2b 67 65 74 2d 74 69 6d  ut ;..: +get-tim
46f0: 65 20 20 20 20 20 5b 27 5d 20 67 65 74 2d 74 69  e     ['] get-ti
4700: 63 6b 20 69 73 20 6f 74 68 65 72 20 3b 0a 0a 3a  ck is other ;..:
4710: 20 72 65 71 73 69 7a 65 21 20 28 20 75 63 6f 64   reqsize! ( ucod
4720: 65 20 75 64 61 74 61 20 2d 2d 20 29 20 20 74 6f  e udata -- )  to
4730: 20 72 65 71 2d 64 61 74 61 73 69 7a 65 20 20 74   req-datasize  t
4740: 6f 20 72 65 71 2d 63 6f 64 65 73 69 7a 65 20 3b  o req-codesize ;
4750: 0a 3a 20 63 6f 6e 6e 65 63 74 2d 72 65 73 74 20  .: connect-rest 
4760: 28 20 6e 20 2d 2d 20 29 0a 20 20 20 20 63 6c 65  ( n -- ).    cle
4770: 61 6e 2d 72 65 71 75 65 73 74 20 2d 74 69 6d 65  an-request -time
4780: 6f 75 74 20 74 73 6b 63 20 4b 45 59 42 59 54 45  out tskc KEYBYTE
4790: 53 20 65 72 61 73 65 20 63 6f 6e 74 65 78 74 21  S erase context!
47a0: 20 3b 0a 0a 3a 20 65 6e 64 2d 63 6f 64 65 7c 20   ;..: end-code| 
47b0: 28 20 2d 2d 20 29 20 20 5d 5d 20 65 6e 64 2d 63  ( -- )  ]] end-c
47c0: 6f 64 65 20 63 6c 69 65 6e 74 2d 6c 6f 6f 70 20  ode client-loop 
47d0: 5b 5b 20 3b 20 69 6d 6d 65 64 69 61 74 65 20 63  [[ ; immediate c
47e0: 6f 6d 70 69 6c 65 2d 6f 6e 6c 79 0a 0a 3a 20 67  ompile-only..: g
47f0: 65 6e 2d 72 65 71 75 65 73 74 20 28 20 2d 2d 20  en-request ( -- 
4800: 29 0a 20 20 20 20 73 65 74 75 70 21 20 20 2b 72  ).    setup!  +r
4810: 65 73 65 6e 64 2d 63 6d 64 20 20 67 65 6e 2d 74  esend-cmd  gen-t
4820: 6d 70 6b 65 79 73 20 20 5b 27 5d 20 63 6f 6e 6e  mpkeys  ['] conn
4830: 65 63 74 2d 72 65 73 74 20 72 71 64 3f 0a 20 20  ect-rest rqd?.  
4840: 20 20 63 6d 64 28 20 69 6e 64 2d 61 64 64 72 20    cmd( ind-addr 
4850: 40 20 49 46 20 20 2e 22 20 69 6e 22 20 54 48 45  @ IF  ." in" THE
4860: 4e 20 2e 22 20 64 69 72 65 63 74 20 63 6f 6e 6e  N ." direct conn
4870: 65 63 74 22 20 66 6f 72 74 68 3a 63 72 20 29 0a  ect" forth:cr ).
4880: 20 20 20 20 69 76 73 28 20 2e 22 20 67 65 6e 20      ivs( ." gen 
4890: 72 65 71 75 65 73 74 22 20 66 6f 72 74 68 3a 63  request" forth:c
48a0: 72 20 29 0a 20 20 20 20 6e 65 74 32 6f 2d 63 6f  r ).    net2o-co
48b0: 64 65 30 0a 20 20 20 20 6e 65 74 32 6f 2d 76 65  de0.    net2o-ve
48c0: 72 73 69 6f 6e 20 24 2c 20 76 65 72 73 69 6f 6e  rsion $, version
48d0: 3f 20 20 30 6b 65 79 2c 0a 20 20 20 20 74 70 6b  ?  0key,.    tpk
48e0: 63 20 6b 65 79 73 69 7a 65 20 24 2c 20 72 65 63  c keysize $, rec
48f0: 65 69 76 65 2d 74 6d 70 6b 65 79 0a 20 20 20 20  eive-tmpkey.    
4900: 6e 65 73 74 5b 20 63 6f 6f 6b 69 65 2c 20 67 65  nest[ cookie, ge
4910: 6e 2d 72 65 70 6c 79 20 72 65 71 75 65 73 74 2c  n-reply request,
4920: 20 5d 6e 65 73 74 20 20 6f 74 68 65 72 0a 20 20   ]nest  other.  
4930: 20 20 74 6d 70 6b 65 79 2d 72 65 71 75 65 73 74    tmpkey-request
4940: 0a 20 20 20 20 69 6e 64 2d 61 64 64 72 20 40 20  .    ind-addr @ 
4950: 20 49 46 20 20 70 75 6e 63 68 3f 20 20 54 48 45   IF  punch?  THE
4960: 4e 0a 20 20 20 20 72 65 71 2d 63 6f 64 65 73 69  N.    req-codesi
4970: 7a 65 20 20 72 65 71 2d 64 61 74 61 73 69 7a 65  ze  req-datasize
4980: 20 20 6d 61 70 2d 72 65 71 75 65 73 74 2c 20 20    map-request,  
4990: 63 6c 6f 73 65 2d 74 6d 70 6e 65 73 74 0a 20 20  close-tmpnest.  
49a0: 20 20 5b 27 5d 20 70 75 73 68 2d 63 6d 64 20 49    ['] push-cmd I
49b0: 53 20 65 78 70 65 63 74 2d 72 65 70 6c 79 3f 0a  S expect-reply?.
49c0: 20 20 20 20 65 6e 64 2d 63 6f 64 65 7c 20 3b 0a      end-code| ;.
49d0: 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 63 6f 6e 6e  .in net2o : conn
49e0: 65 63 74 20 28 20 75 63 6f 64 65 20 75 64 61 74  ect ( ucode udat
49f0: 61 20 2d 2d 20 29 20 20 72 65 71 73 69 7a 65 21  a -- )  reqsize!
4a00: 20 67 65 6e 2d 72 65 71 75 65 73 74 20 3b 0a 0a   gen-request ;..
4a10: 70 72 65 76 69 6f 75 73 0a 0a 30 20 5b 49 46 5d  previous..0 [IF]
4a20: 0a 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73  .Local Variables
4a30: 3a 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c 2d 77 6f  :.forth-local-wo
4a40: 72 64 73 3a 0a 20 20 20 20 28 0a 20 20 20 20 20  rds:.    (.     
4a50: 28 28 22 6e 65 74 32 6f 3a 22 20 22 2b 6e 65 74  (("net2o:" "+net
4a60: 32 6f 3a 22 29 20 64 65 66 69 6e 69 74 69 6f 6e  2o:") definition
4a70: 2d 73 74 61 72 74 65 72 20 28 66 6f 6e 74 2d 6c  -starter (font-l
4a80: 6f 63 6b 2d 6b 65 79 77 6f 72 64 2d 66 61 63 65  ock-keyword-face
4a90: 20 2e 20 31 29 0a 20 20 20 20 20 20 22 5b 20 5c   . 1).      "[ \
4aa0: 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f  t\n]" t name (fo
4ab0: 6e 74 2d 6c 6f 63 6b 2d 66 75 6e 63 74 69 6f 6e  nt-lock-function
4ac0: 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 33 29 29  -name-face . 3))
4ad0: 0a 20 20 20 20 20 28 22 5b 61 2d 7a 5c 2d 30 2d  .     ("[a-z\-0-
4ae0: 39 5d 2b 28 22 20 69 6d 6d 65 64 69 61 74 65 20  9]+(" immediate 
4af0: 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65  (font-lock-comme
4b00: 6e 74 2d 66 61 63 65 20 2e 20 31 29 0a 20 20 20  nt-face . 1).   
4b10: 20 20 20 22 29 22 20 6e 69 6c 20 63 6f 6d 6d 65     ")" nil comme
4b20: 6e 74 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f  nt (font-lock-co
4b30: 6d 6d 65 6e 74 2d 66 61 63 65 20 2e 20 31 29 29  mment-face . 1))
4b40: 0a 20 20 20 20 29 0a 66 6f 72 74 68 2d 6c 6f 63  .    ).forth-loc
4b50: 61 6c 2d 69 6e 64 65 6e 74 2d 77 6f 72 64 73 3a  al-indent-words:
4b60: 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28 22 6e  .    (.     (("n
4b70: 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a 22  et2o:" "+net2o:"
4b80: 29 20 28 30 20 2e 20 32 29 20 28 30 20 2e 20 32  ) (0 . 2) (0 . 2
4b90: 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 29  ) non-immediate)
4ba0: 0a 20 20 20 20 20 28 28 22 5b 3a 22 29 20 28 30  .     (("[:") (0
4bb0: 20 2e 20 31 29 20 28 30 20 2e 20 31 29 20 69 6d   . 1) (0 . 1) im
4bc0: 6d 65 64 69 61 74 65 29 0a 20 20 20 20 20 28 28  mediate).     ((
4bd0: 22 3b 5d 22 29 20 28 2d 31 20 2e 20 30 29 20 28  ";]") (-1 . 0) (
4be0: 30 20 2e 20 2d 31 29 20 69 6d 6d 65 64 69 61 74  0 . -1) immediat
4bf0: 65 29 0a 20 20 20 20 29 0a 45 6e 64 3a 0a 5b 54  e).    ).End:.[T
4c00: 48 45 4e 5d 0a                                   HEN].