TvSpectrumTransmitter classes to create television transmitter(s) that transmit PSD spectrums customized by attributes such as modulation type, power, antenna type, channel frequency, etc.
authorBenjamin Cizdziel <ben.cizdziel@gmail.com>
Wed, 08 Apr 2015 19:45:39 -0700
changeset 11285 90aeba821efe
parent 11284 63c62abdd7ba
child 11286 e8208de811d4
TvSpectrumTransmitter classes to create television transmitter(s) that transmit PSD spectrums customized by attributes such as modulation type, power, antenna type, channel frequency, etc.
doc/models/Makefile
src/spectrum/doc/spectrum-tv-rand-geo-points.eps
src/spectrum/doc/spectrum.rst
src/spectrum/examples/tv-trans-example.cc
src/spectrum/examples/tv-trans-regional-example.cc
src/spectrum/examples/wscript
src/spectrum/helper/tv-spectrum-transmitter-helper.cc
src/spectrum/helper/tv-spectrum-transmitter-helper.h
src/spectrum/model/tv-spectrum-transmitter.cc
src/spectrum/model/tv-spectrum-transmitter.h
src/spectrum/test/tv-helper-distribution-test.cc
src/spectrum/test/tv-spectrum-transmitter-test.cc
src/spectrum/wscript
--- a/doc/models/Makefile	Wed Apr 08 19:42:20 2015 -0700
+++ b/doc/models/Makefile	Wed Apr 08 19:45:39 2015 -0700
@@ -250,6 +250,9 @@
 	$(SRC)/spectrum/doc/spectrum-channel-phy-interface.png \
 	$(SRC)/spectrum/doc/spectrum-channel-phy-interface.pdf \
 	$(SRC)/spectrum/doc/spectrum-analyzer-example.eps \
+	$(SRC)/spectrum/doc/spectrum-tv-rand-geo-points.eps \
+	$(SRC)/spectrum/doc/spectrum-tv-8vsb.png \
+	$(SRC)/spectrum/doc/spectrum-tv-cofdm.png \
 	$(SRC)/lr-wpan/doc/lr-wpan-arch.dia \
 	$(SRC)/lr-wpan/doc/lr-wpan-data-example.dia \
 	$(SRC)/lr-wpan/doc/lr-wpan-primitives.dia \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/doc/spectrum-tv-rand-geo-points.eps	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,5740 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: MATLAB, The MathWorks, Inc. Version 8.3.0.532 (R2014a). Operating System: Microsoft Windows 8.1 Pro.
+%%Title: C:\Users\Ben\Dropbox\FUNLAB\ns-3 TV Transmitter\randGeoPoints_35lat_260long_100pts_2000kmRad.eps
+%%CreationDate: 12/06/2014  19:20:57
+%%DocumentNeededFonts: Helvetica
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox:    96   238   515   553
+%%EndComments
+
+%%BeginProlog
+% MathWorks dictionary
+/MathWorks 160 dict begin
+% definition operators
+/bdef {bind def} bind def
+/ldef {load def} bind def
+/xdef {exch def} bdef
+/xstore {exch store} bdef
+% operator abbreviations
+/c  /clip ldef
+/cc /concat ldef
+/cp /closepath ldef
+/gr /grestore ldef
+/gs /gsave ldef
+/mt /moveto ldef
+/np /newpath ldef
+/cm /currentmatrix ldef
+/sm /setmatrix ldef
+/rm /rmoveto ldef
+/rl /rlineto ldef
+/s {show newpath} bdef
+/sc {setcmykcolor} bdef
+/sr /setrgbcolor ldef
+/sg /setgray ldef
+/w /setlinewidth ldef
+/j /setlinejoin ldef
+/cap /setlinecap ldef
+/rc {rectclip} bdef
+/rf {rectfill} bdef
+% page state control
+/pgsv () def
+/bpage {/pgsv save def} bdef
+/epage {pgsv restore} bdef
+/bplot /gsave ldef
+/eplot {stroke grestore} bdef
+% orientation switch
+/portraitMode 0 def /landscapeMode 1 def /rotateMode 2 def
+% coordinate system mappings
+/dpi2point 0 def
+% font control
+/FontSize 0 def
+/FMS {/FontSize xstore findfont [FontSize 0 0 FontSize neg 0 0]
+  makefont setfont} bdef
+/ISOLatin1Encoding where {pop /WindowsLatin1Encoding 256 array bdef
+ISOLatin1Encoding WindowsLatin1Encoding copy pop
+/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis/dagger
+/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef/.notdef
+/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet
+/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef
+/Ydieresis WindowsLatin1Encoding 128 32 getinterval astore pop}
+{/WindowsLatin1Encoding StandardEncoding bdef} ifelse
+/reencode {exch dup where {pop load} {pop StandardEncoding} ifelse
+  exch dup 3 1 roll findfont dup length dict begin
+  { 1 index /FID ne {def}{pop pop} ifelse } forall
+  /Encoding exch def currentdict end definefont pop} bdef
+/isroman {findfont /CharStrings get /Agrave known} bdef
+/FMSR {3 1 roll 1 index dup isroman {reencode} {pop pop} ifelse
+  exch FMS} bdef
+/csm {1 dpi2point div -1 dpi2point div scale neg translate
+ dup landscapeMode eq {pop -90 rotate}
+  {rotateMode eq {90 rotate} if} ifelse} bdef
+% line types: solid, dotted, dashed, dotdash
+/SO { [] 0 setdash } bdef
+/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+/DA { [6 dpi2point mul] 0 setdash } bdef
+/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4
+  dpi2point mul] 0 setdash } bdef
+% macros for lines and objects
+/L {lineto stroke} bdef
+/MP {3 1 roll moveto 1 sub {rlineto} repeat} bdef
+/AP {{rlineto} repeat} bdef
+/PDlw -1 def
+/W {/PDlw currentlinewidth def setlinewidth} def
+/PP {closepath eofill} bdef
+/DP {closepath stroke} bdef
+/MR {4 -2 roll moveto dup  0 exch rlineto exch 0 rlineto
+  neg 0 exch rlineto closepath} bdef
+/FR {MR stroke} bdef
+/PR {MR fill} bdef
+/L1i {{currentfile picstr readhexstring pop} image} bdef
+/tMatrix matrix def
+/MakeOval {newpath tMatrix currentmatrix pop translate scale
+0 0 1 0 360 arc tMatrix setmatrix} bdef
+/FO {MakeOval stroke} bdef
+/PO {MakeOval fill} bdef
+/PD {currentlinewidth 2 div 0 360 arc fill
+   PDlw -1 eq not {PDlw w /PDlw -1 def} if} def
+/FA {newpath tMatrix currentmatrix pop translate scale
+  0 0 1 5 -2 roll arc tMatrix setmatrix stroke} bdef
+/PA {newpath tMatrix currentmatrix pop	translate 0 0 moveto scale
+  0 0 1 5 -2 roll arc closepath tMatrix setmatrix fill} bdef
+/FAn {newpath tMatrix currentmatrix pop translate scale
+  0 0 1 5 -2 roll arcn tMatrix setmatrix stroke} bdef
+/PAn {newpath tMatrix currentmatrix pop translate 0 0 moveto scale
+  0 0 1 5 -2 roll arcn closepath tMatrix setmatrix fill} bdef
+/vradius 0 def /hradius 0 def /lry 0 def
+/lrx 0 def /uly 0 def /ulx 0 def /rad 0 def
+/MRR {/vradius xdef /hradius xdef /lry xdef /lrx xdef /uly xdef
+  /ulx xdef newpath tMatrix currentmatrix pop ulx hradius add uly
+  vradius add translate hradius vradius scale 0 0 1 180 270 arc 
+  tMatrix setmatrix lrx hradius sub uly vradius add translate
+  hradius vradius scale 0 0 1 270 360 arc tMatrix setmatrix
+  lrx hradius sub lry vradius sub translate hradius vradius scale
+  0 0 1 0 90 arc tMatrix setmatrix ulx hradius add lry vradius sub
+  translate hradius vradius scale 0 0 1 90 180 arc tMatrix setmatrix
+  closepath} bdef
+/FRR {MRR stroke } bdef
+/PRR {MRR fill } bdef
+/MlrRR {/lry xdef /lrx xdef /uly xdef /ulx xdef /rad lry uly sub 2 div def
+  newpath tMatrix currentmatrix pop ulx rad add uly rad add translate
+  rad rad scale 0 0 1 90 270 arc tMatrix setmatrix lrx rad sub lry rad
+  sub translate rad rad scale 0 0 1 270 90 arc tMatrix setmatrix
+  closepath} bdef
+/FlrRR {MlrRR stroke } bdef
+/PlrRR {MlrRR fill } bdef
+/MtbRR {/lry xdef /lrx xdef /uly xdef /ulx xdef /rad lrx ulx sub 2 div def
+  newpath tMatrix currentmatrix pop ulx rad add uly rad add translate
+  rad rad scale 0 0 1 180 360 arc tMatrix setmatrix lrx rad sub lry rad
+  sub translate rad rad scale 0 0 1 0 180 arc tMatrix setmatrix
+  closepath} bdef
+/FtbRR {MtbRR stroke } bdef
+/PtbRR {MtbRR fill } bdef
+/stri 6 array def /dtri 6 array def
+/smat 6 array def /dmat 6 array def
+/tmat1 6 array def /tmat2 6 array def /dif 3 array def
+/asub {/ind2 exch def /ind1 exch def dup dup
+  ind1 get exch ind2 get sub exch } bdef
+/tri_to_matrix {
+  2 0 asub 3 1 asub 4 0 asub 5 1 asub
+  dup 0 get exch 1 get 7 -1 roll astore } bdef
+/compute_transform {
+  dmat dtri tri_to_matrix tmat1 invertmatrix 
+  smat stri tri_to_matrix tmat2 concatmatrix } bdef
+/ds {stri astore pop} bdef
+/dt {dtri astore pop} bdef
+/db {2 copy /cols xdef /rows xdef mul dup 3 mul string
+  currentfile 
+  3 index 0 eq {/ASCIIHexDecode filter}
+  {/ASCII85Decode filter 3 index 2 eq {/RunLengthDecode filter} if }
+  ifelse exch readstring pop
+  dup 0 3 index getinterval /rbmap xdef
+  dup 2 index dup getinterval /gbmap xdef
+  1 index dup 2 mul exch getinterval /bbmap xdef pop pop}bdef
+/it {gs np dtri aload pop moveto lineto lineto cp c
+  cols rows 8 compute_transform 
+  rbmap gbmap bbmap true 3 colorimage gr}bdef
+/il {newpath moveto lineto stroke}bdef
+currentdict end def
+%%EndProlog
+
+%%BeginSetup
+MathWorks begin
+
+0 cap
+
+end
+%%EndSetup
+
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox:    96   238   515   553
+MathWorks begin
+bpage
+%%EndPageSetup
+
+%%BeginObject: obj1
+bplot
+
+/dpi2point 12 def
+portraitMode 1152 6636 csm
+
+    0     0  5039  3780 rc
+85 dict begin %Colortable dictionary
+/c0 { 0.000000 0.000000 0.000000 sr} bdef
+/c1 { 1.000000 1.000000 1.000000 sr} bdef
+/c2 { 0.900000 0.000000 0.000000 sr} bdef
+/c3 { 0.000000 0.820000 0.000000 sr} bdef
+/c4 { 0.000000 0.000000 0.800000 sr} bdef
+/c5 { 0.910000 0.820000 0.320000 sr} bdef
+/c6 { 1.000000 0.260000 0.820000 sr} bdef
+/c7 { 0.000000 0.820000 0.820000 sr} bdef
+c0
+1 j
+1 sg
+   0    0 5040 3781 rf
+6 w
+-818 350 3052 94 817 -350 655 3211 4 MP
+PP
+-3051 -94 -818 350 3052 94 817 -350 655 3211 5 MP stroke
+0 2578 817 -349 0 -2579 655 3211 4 MP
+PP
+-817 350 0 2578 817 -349 0 -2579 655 3211 5 MP stroke
+0 2579 3052 93 0 -2578 1472 2861 4 MP
+PP
+-3052 -94 0 2579 3052 93 0 -2578 1472 2861 5 MP stroke
+4 w
+DO
+SO
+6 w
+0 sg
+ 655 3211 mt 3706 3305 L
+3706 3305 mt 4524 2955 L
+ 655 3211 mt  655  632 L
+ 655 3211 mt  584 3241 L
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 120 FMSR
+
+ 417 3365 mt 
+(-8) s
+1036 3222 mt  966 3252 L
+ 798 3377 mt 
+(-6) s
+1417 3234 mt 1347 3264 L
+1179 3389 mt 
+(-4) s
+1799 3246 mt 1729 3276 L
+1561 3401 mt 
+(-2) s
+2180 3258 mt 2110 3288 L
+2012 3412 mt 
+(0) s
+2562 3269 mt 2491 3299 L
+2394 3424 mt 
+(2) s
+2943 3281 mt 2873 3311 L
+2775 3436 mt 
+(4) s
+3324 3293 mt 3254 3323 L
+3156 3447 mt 
+(6) s
+3706 3305 mt 3636 3335 L
+3538 3459 mt 
+(8) s
+ 935 3748 mt 
+(x 10) s
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 80 FMSR
+
+1161 3674 mt 
+(6) s
+3706 3305 mt 3782 3307 L
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 120 FMSR
+
+3817 3419 mt 
+(-1) s
+4115 3130 mt 4191 3132 L
+4226 3244 mt 
+(0) s
+4524 2955 mt 4600 2957 L
+4634 3069 mt 
+(1) s
+4764 3447 mt 
+(x 10) s
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 80 FMSR
+
+4990 3373 mt 
+(7) s
+ 655 3211 mt  578 3208 L
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 120 FMSR
+
+ 408 3251 mt 
+(-8) s
+ 655 2888 mt  578 2886 L
+ 408 2929 mt 
+(-6) s
+ 655 2566 mt  578 2564 L
+ 408 2607 mt 
+(-4) s
+ 655 2244 mt  578 2242 L
+ 408 2284 mt 
+(-2) s
+ 655 1922 mt  578 1919 L
+ 478 1962 mt 
+(0) s
+ 655 1599 mt  578 1597 L
+ 478 1640 mt 
+(2) s
+ 655 1277 mt  578 1275 L
+ 478 1318 mt 
+(4) s
+ 655  955 mt  578  952 L
+ 478  995 mt 
+(6) s
+ 655  632 mt  578  630 L
+ 478  673 mt 
+(8) s
+ 655  362 mt 
+(x 10) s
+%%IncludeResource: font Helvetica
+/Helvetica /WindowsLatin1Encoding 80 FMSR
+
+ 881  288 mt 
+(6) s
+gs 655 283 3870 3023 rc
+/c8 { 0.562500 1.000000 0.437500 sr} bdef
+c8
+-14 -160 -100 -37 3825 1795 3 MP
+PP
+0 sg
+3825 1795 mt 3725 1758 L
+3725 1758 mt 3711 1598 L
+/c9 { 0.187500 1.000000 0.812500 sr} bdef
+c9
+-100 -37 15 -160 3810 1955 3 MP
+PP
+0 sg
+3810 1955 mt 3825 1795 L
+3825 1795 mt 3725 1758 L
+c8
+-99 -36 -15 -161 3825 1795 3 MP
+PP
+0 sg
+3825 1795 mt 3810 1634 L
+3810 1634 mt 3711 1598 L
+c8
+-15 -161 21 -36 3804 1831 3 MP
+PP
+0 sg
+3804 1831 mt 3825 1795 L
+3825 1795 mt 3810 1634 L
+c9
+14 -161 -99 -36 3810 1955 3 MP
+PP
+0 sg
+3810 1955 mt 3711 1919 L
+3711 1919 mt 3725 1758 L
+/c10 { 0.000000 0.937500 1.000000 sr} bdef
+c10
+-99 -36 45 -157 3765 2112 3 MP
+PP
+0 sg
+3765 2112 mt 3810 1955 L
+3810 1955 mt 3711 1919 L
+c9
+15 -160 21 -36 3789 1991 3 MP
+PP
+0 sg
+3789 1991 mt 3810 1955 L
+3810 1955 mt 3825 1795 L
+c9
+21 -36 15 -160 3789 1991 3 MP
+PP
+0 sg
+3789 1991 mt 3804 1831 L
+3804 1831 mt 3825 1795 L
+/c11 { 0.000000 0.625000 1.000000 sr} bdef
+c11
+-96 -35 75 -149 3690 2261 3 MP
+PP
+0 sg
+3690 2261 mt 3765 2112 L
+3765 2112 mt 3669 2077 L
+c10
+42 -158 -96 -35 3765 2112 3 MP
+PP
+0 sg
+3765 2112 mt 3669 2077 L
+3669 2077 mt 3711 1919 L
+c10
+45 -157 20 -34 3745 2146 3 MP
+PP
+0 sg
+3745 2146 mt 3765 2112 L
+3765 2112 mt 3810 1955 L
+/c12 { 0.875000 1.000000 0.125000 sr} bdef
+c12
+-42 -155 -99 -36 3810 1634 3 MP
+PP
+0 sg
+3810 1634 mt 3711 1598 L
+3711 1598 mt 3669 1443 L
+c10
+21 -36 44 -155 3745 2146 3 MP
+PP
+0 sg
+3745 2146 mt 3789 1991 L
+3789 1991 mt 3810 1955 L
+c8
+21 -36 -15 -161 3804 1831 3 MP
+PP
+0 sg
+3804 1831 mt 3789 1670 L
+3789 1670 mt 3810 1634 L
+c12
+-96 -34 -45 -157 3810 1634 3 MP
+PP
+0 sg
+3810 1634 mt 3765 1477 L
+3765 1477 mt 3669 1443 L
+c12
+-45 -157 21 -36 3789 1670 3 MP
+PP
+0 sg
+3789 1670 mt 3810 1634 L
+3810 1634 mt 3765 1477 L
+c10
+-209 -32 42 -158 3669 2077 3 MP
+PP
+0 sg
+3669 2077 mt 3711 1919 L
+3711 1919 mt 3502 1887 L
+c9
+15 -160 138 -32 3651 2023 3 MP
+PP
+0 sg
+3651 2023 mt 3789 1991 L
+3789 1991 mt 3804 1831 L
+c9
+12 -162 -209 -32 3711 1919 3 MP
+PP
+0 sg
+3711 1919 mt 3502 1887 L
+3502 1887 mt 3514 1725 L
+c9
+-211 -33 14 -161 3711 1919 3 MP
+PP
+0 sg
+3711 1919 mt 3725 1758 L
+3725 1758 mt 3514 1725 L
+c9
+140 -32 13 -160 3651 2023 3 MP
+PP
+0 sg
+3651 2023 mt 3664 1863 L
+3664 1863 mt 3804 1831 L
+c8
+-15 -161 140 -32 3664 1863 3 MP
+PP
+0 sg
+3664 1863 mt 3804 1831 L
+3804 1831 mt 3789 1670 L
+c8
+-209 -33 -14 -160 3725 1758 3 MP
+PP
+0 sg
+3725 1758 mt 3711 1598 L
+3711 1598 mt 3502 1565 L
+c8
+-12 -160 -211 -33 3725 1758 3 MP
+PP
+0 sg
+3725 1758 mt 3514 1725 L
+3514 1725 mt 3502 1565 L
+c8
+138 -32 -13 -161 3664 1863 3 MP
+PP
+0 sg
+3664 1863 mt 3651 1702 L
+3651 1702 mt 3789 1670 L
+c10
+33 -159 -200 -31 3669 2077 3 MP
+PP
+0 sg
+3669 2077 mt 3469 2046 L
+3469 2046 mt 3502 1887 L
+c11
+-200 -31 68 -151 3601 2228 3 MP
+PP
+0 sg
+3601 2228 mt 3669 2077 L
+3669 2077 mt 3469 2046 L
+c11
+68 -151 -89 -33 3690 2261 3 MP
+PP
+0 sg
+3690 2261 mt 3601 2228 L
+3601 2228 mt 3669 2077 L
+c10
+138 -32 40 -154 3611 2177 3 MP
+PP
+0 sg
+3611 2177 mt 3651 2023 L
+3651 2023 mt 3789 1991 L
+c10
+44 -155 134 -31 3611 2177 3 MP
+PP
+0 sg
+3611 2177 mt 3745 2146 L
+3745 2146 mt 3789 1991 L
+c12
+20 -35 -44 -158 3789 1670 3 MP
+PP
+0 sg
+3789 1670 mt 3745 1512 L
+3745 1512 mt 3765 1477 L
+c12
+-200 -32 -42 -155 3711 1598 3 MP
+PP
+0 sg
+3711 1598 mt 3669 1443 L
+3669 1443 mt 3469 1411 L
+c12
+-33 -154 -209 -33 3711 1598 3 MP
+PP
+0 sg
+3711 1598 mt 3502 1565 L
+3502 1565 mt 3469 1411 L
+c12
+-44 -158 138 -32 3651 1702 3 MP
+PP
+0 sg
+3651 1702 mt 3789 1670 L
+3789 1670 mt 3745 1512 L
+/c13 { 1.000000 0.875000 0.000000 sr} bdef
+c13
+-68 -147 -96 -34 3765 1477 3 MP
+PP
+0 sg
+3765 1477 mt 3669 1443 L
+3669 1443 mt 3601 1296 L
+c13
+-89 -32 -75 -149 3765 1477 3 MP
+PP
+0 sg
+3765 1477 mt 3690 1328 L
+3690 1328 mt 3601 1296 L
+/c14 { 0.000000 0.375000 1.000000 sr} bdef
+c14
+-89 -33 101 -137 3589 2398 3 MP
+PP
+0 sg
+3589 2398 mt 3690 2261 L
+3690 2261 mt 3601 2228 L
+c14
+18 -32 100 -134 3572 2427 3 MP
+PP
+0 sg
+3572 2427 mt 3672 2293 L
+3672 2293 mt 3690 2261 L
+c14
+101 -137 17 -29 3572 2427 3 MP
+PP
+0 sg
+3572 2427 mt 3589 2398 L
+3589 2398 mt 3690 2261 L
+c11
+20 -34 73 -147 3672 2293 3 MP
+PP
+0 sg
+3672 2293 mt 3745 2146 L
+3745 2146 mt 3765 2112 L
+c11
+75 -149 18 -32 3672 2293 3 MP
+PP
+0 sg
+3672 2293 mt 3690 2261 L
+3690 2261 mt 3765 2112 L
+c13
+-75 -149 20 -35 3745 1512 3 MP
+PP
+0 sg
+3745 1512 mt 3765 1477 L
+3765 1477 mt 3690 1328 L
+c14
+93 -140 -81 -30 3589 2398 3 MP
+PP
+0 sg
+3589 2398 mt 3508 2368 L
+3508 2368 mt 3601 2228 L
+c11
+73 -147 125 -29 3547 2322 3 MP
+PP
+0 sg
+3547 2322 mt 3672 2293 L
+3672 2293 mt 3745 2146 L
+c13
+18 -33 -73 -151 3745 1512 3 MP
+PP
+0 sg
+3745 1512 mt 3672 1361 L
+3672 1361 mt 3690 1328 L
+c14
+-188 -29 93 -140 3508 2368 3 MP
+PP
+0 sg
+3508 2368 mt 3601 2228 L
+3601 2228 mt 3413 2199 L
+c11
+56 -153 -188 -29 3601 2228 3 MP
+PP
+0 sg
+3601 2228 mt 3413 2199 L
+3413 2199 mt 3469 2046 L
+c11
+134 -31 64 -145 3547 2322 3 MP
+PP
+0 sg
+3547 2322 mt 3611 2177 L
+3611 2177 mt 3745 2146 L
+c12
+134 -31 -40 -159 3651 1702 3 MP
+PP
+0 sg
+3651 1702 mt 3611 1543 L
+3611 1543 mt 3745 1512 L
+c13
+-56 -144 -200 -32 3669 1443 3 MP
+PP
+0 sg
+3669 1443 mt 3469 1411 L
+3469 1411 mt 3413 1267 L
+c13
+-188 -29 -68 -147 3669 1443 3 MP
+PP
+0 sg
+3669 1443 mt 3601 1296 L
+3601 1296 mt 3413 1267 L
+c13
+-73 -151 134 -31 3611 1543 3 MP
+PP
+0 sg
+3611 1543 mt 3745 1512 L
+3745 1512 mt 3672 1361 L
+/c15 { 1.000000 0.562500 0.000000 sr} bdef
+c15
+-81 -30 -101 -137 3690 1328 3 MP
+PP
+0 sg
+3690 1328 mt 3589 1191 L
+3589 1191 mt 3508 1161 L
+c15
+-93 -135 -89 -32 3690 1328 3 MP
+PP
+0 sg
+3690 1328 mt 3601 1296 L
+3601 1296 mt 3508 1161 L
+c15
+-101 -137 18 -33 3672 1361 3 MP
+PP
+0 sg
+3672 1361 mt 3690 1328 L
+3690 1328 mt 3589 1191 L
+/c16 { 0.000000 0.125000 1.000000 sr} bdef
+c16
+116 -126 -71 -26 3463 2520 3 MP
+PP
+0 sg
+3463 2520 mt 3392 2494 L
+3392 2494 mt 3508 2368 L
+c16
+-81 -30 126 -122 3463 2520 3 MP
+PP
+0 sg
+3463 2520 mt 3589 2398 L
+3589 2398 mt 3508 2368 L
+c14
+125 -29 88 -132 3459 2454 3 MP
+PP
+0 sg
+3459 2454 mt 3547 2322 L
+3547 2322 mt 3672 2293 L
+c13
+125 -29 -64 -153 3611 1543 3 MP
+PP
+0 sg
+3611 1543 mt 3547 1390 L
+3547 1390 mt 3672 1361 L
+c15
+-76 -132 -188 -29 3601 1296 3 MP
+PP
+0 sg
+3601 1296 mt 3413 1267 L
+3413 1267 mt 3337 1135 L
+c15
+-171 -26 -93 -135 3601 1296 3 MP
+PP
+0 sg
+3601 1296 mt 3508 1161 L
+3508 1161 mt 3337 1135 L
+c15
+-100 -141 125 -29 3547 1390 3 MP
+PP
+0 sg
+3547 1390 mt 3672 1361 L
+3672 1361 mt 3572 1220 L
+c15
+17 -29 -100 -141 3672 1361 3 MP
+PP
+0 sg
+3672 1361 mt 3572 1220 L
+3572 1220 mt 3589 1191 L
+c16
+126 -122 15 -26 3448 2546 3 MP
+PP
+0 sg
+3448 2546 mt 3463 2520 L
+3463 2520 mt 3589 2398 L
+c16
+17 -29 124 -119 3448 2546 3 MP
+PP
+0 sg
+3448 2546 mt 3572 2427 L
+3572 2427 mt 3589 2398 L
+c14
+100 -134 113 -27 3459 2454 3 MP
+PP
+0 sg
+3459 2454 mt 3572 2427 L
+3572 2427 mt 3672 2293 L
+c11
+-287 -25 56 -153 3413 2199 3 MP
+PP
+0 sg
+3413 2199 mt 3469 2046 L
+3469 2046 mt 3182 2021 L
+c10
+22 -160 -287 -25 3469 2046 3 MP
+PP
+0 sg
+3469 2046 mt 3182 2021 L
+3182 2021 mt 3204 1861 L
+c10
+-298 -26 33 -159 3469 2046 3 MP
+PP
+0 sg
+3469 2046 mt 3502 1887 L
+3502 1887 mt 3204 1861 L
+c9
+13 -160 242 -26 3409 2049 3 MP
+PP
+0 sg
+3409 2049 mt 3651 2023 L
+3651 2023 mt 3664 1863 L
+c9
+8 -162 -298 -26 3502 1887 3 MP
+PP
+0 sg
+3502 1887 mt 3204 1861 L
+3204 1861 mt 3212 1699 L
+c9
+-302 -26 12 -162 3502 1887 3 MP
+PP
+0 sg
+3502 1887 mt 3514 1725 L
+3514 1725 mt 3212 1699 L
+c9
+245 -26 10 -160 3409 2049 3 MP
+PP
+0 sg
+3409 2049 mt 3419 1889 L
+3419 1889 mt 3664 1863 L
+c8
+-13 -161 245 -26 3419 1889 3 MP
+PP
+0 sg
+3419 1889 mt 3664 1863 L
+3664 1863 mt 3651 1702 L
+c14
+-269 -24 76 -143 3337 2342 3 MP
+PP
+0 sg
+3337 2342 mt 3413 2199 L
+3413 2199 mt 3144 2175 L
+c11
+38 -154 -269 -24 3413 2199 3 MP
+PP
+0 sg
+3413 2199 mt 3144 2175 L
+3144 2175 mt 3182 2021 L
+c10
+242 -26 31 -153 3378 2202 3 MP
+PP
+0 sg
+3378 2202 mt 3409 2049 L
+3409 2049 mt 3651 2023 L
+c8
+-298 -25 -12 -160 3514 1725 3 MP
+PP
+0 sg
+3514 1725 mt 3502 1565 L
+3502 1565 mt 3204 1540 L
+c8
+-8 -159 -302 -26 3514 1725 3 MP
+PP
+0 sg
+3514 1725 mt 3212 1699 L
+3212 1699 mt 3204 1540 L
+c8
+242 -25 -10 -162 3419 1889 3 MP
+PP
+0 sg
+3419 1889 mt 3409 1727 L
+3409 1727 mt 3651 1702 L
+c12
+-40 -159 242 -25 3409 1727 3 MP
+PP
+0 sg
+3409 1727 mt 3651 1702 L
+3651 1702 mt 3611 1543 L
+c10
+40 -154 233 -25 3378 2202 3 MP
+PP
+0 sg
+3378 2202 mt 3611 2177 L
+3611 2177 mt 3651 2023 L
+c14
+51 -145 -244 -22 3337 2342 3 MP
+PP
+0 sg
+3337 2342 mt 3093 2320 L
+3093 2320 mt 3144 2175 L
+c16
+-244 -22 94 -129 3243 2471 3 MP
+PP
+0 sg
+3243 2471 mt 3337 2342 L
+3337 2342 mt 3093 2320 L
+c14
+76 -143 -171 -26 3508 2368 3 MP
+PP
+0 sg
+3508 2368 mt 3337 2342 L
+3337 2342 mt 3413 2199 L
+c11
+233 -25 50 -143 3328 2345 3 MP
+PP
+0 sg
+3328 2345 mt 3378 2202 L
+3378 2202 mt 3611 2177 L
+c16
+94 -129 -149 -23 3392 2494 3 MP
+PP
+0 sg
+3392 2494 mt 3243 2471 L
+3243 2471 mt 3337 2342 L
+c16
+-171 -26 116 -126 3392 2494 3 MP
+PP
+0 sg
+3392 2494 mt 3508 2368 L
+3508 2368 mt 3337 2342 L
+c11
+64 -145 219 -23 3328 2345 3 MP
+PP
+0 sg
+3328 2345 mt 3547 2322 L
+3547 2322 mt 3611 2177 L
+c12
+-287 -25 -33 -154 3502 1565 3 MP
+PP
+0 sg
+3502 1565 mt 3469 1411 L
+3469 1411 mt 3182 1386 L
+c12
+-22 -154 -298 -25 3502 1565 3 MP
+PP
+0 sg
+3502 1565 mt 3204 1540 L
+3204 1540 mt 3182 1386 L
+c13
+-64 -153 233 -24 3378 1567 3 MP
+PP
+0 sg
+3378 1567 mt 3611 1543 L
+3611 1543 mt 3547 1390 L
+c12
+233 -24 -31 -160 3409 1727 3 MP
+PP
+0 sg
+3409 1727 mt 3378 1567 L
+3378 1567 mt 3611 1543 L
+/c17 { 1.000000 0.312500 0.000000 sr} bdef
+c17
+-116 -118 -81 -30 3589 1191 3 MP
+PP
+0 sg
+3589 1191 mt 3508 1161 L
+3508 1161 mt 3392 1043 L
+c17
+-71 -25 -126 -123 3589 1191 3 MP
+PP
+0 sg
+3589 1191 mt 3463 1068 L
+3463 1068 mt 3392 1043 L
+c17
+-126 -123 17 -29 3572 1220 3 MP
+PP
+0 sg
+3572 1220 mt 3589 1191 L
+3589 1191 mt 3463 1068 L
+c17
+-94 -116 -171 -26 3508 1161 3 MP
+PP
+0 sg
+3508 1161 mt 3337 1135 L
+3337 1135 mt 3243 1019 L
+c17
+-149 -24 -116 -118 3508 1161 3 MP
+PP
+0 sg
+3508 1161 mt 3392 1043 L
+3392 1043 mt 3243 1019 L
+c17
+-124 -126 113 -27 3459 1247 3 MP
+PP
+0 sg
+3459 1247 mt 3572 1220 L
+3572 1220 mt 3448 1094 L
+c17
+15 -26 -124 -126 3572 1220 3 MP
+PP
+0 sg
+3572 1220 mt 3448 1094 L
+3448 1094 mt 3463 1068 L
+/c18 { 0.000000 0.000000 0.937500 sr} bdef
+c18
+15 -26 145 -100 3303 2646 3 MP
+PP
+0 sg
+3303 2646 mt 3448 2546 L
+3448 2546 mt 3463 2520 L
+c18
+-71 -26 147 -105 3316 2625 3 MP
+PP
+0 sg
+3316 2625 mt 3463 2520 L
+3463 2520 mt 3392 2494 L
+c18
+147 -105 13 -21 3303 2646 3 MP
+PP
+0 sg
+3303 2646 mt 3316 2625 L
+3316 2625 mt 3463 2520 L
+c16
+124 -119 99 -23 3349 2569 3 MP
+PP
+0 sg
+3349 2569 mt 3448 2546 L
+3448 2546 mt 3572 2427 L
+c15
+113 -27 -88 -143 3547 1390 3 MP
+PP
+0 sg
+3547 1390 mt 3459 1247 L
+3459 1247 mt 3572 1220 L
+c16
+113 -27 110 -115 3349 2569 3 MP
+PP
+0 sg
+3349 2569 mt 3459 2454 L
+3459 2454 mt 3572 2427 L
+c18
+-149 -23 135 -109 3257 2603 3 MP
+PP
+0 sg
+3257 2603 mt 3392 2494 L
+3392 2494 mt 3243 2471 L
+c14
+88 -132 199 -20 3260 2474 3 MP
+PP
+0 sg
+3260 2474 mt 3459 2454 L
+3459 2454 mt 3547 2322 L
+c14
+219 -23 68 -129 3260 2474 3 MP
+PP
+0 sg
+3260 2474 mt 3328 2345 L
+3328 2345 mt 3547 2322 L
+c13
+-269 -24 -56 -144 3469 1411 3 MP
+PP
+0 sg
+3469 1411 mt 3413 1267 L
+3413 1267 mt 3144 1243 L
+c13
+-38 -143 -287 -25 3469 1411 3 MP
+PP
+0 sg
+3469 1411 mt 3182 1386 L
+3182 1386 mt 3144 1243 L
+c15
+-88 -143 219 -23 3328 1413 3 MP
+PP
+0 sg
+3328 1413 mt 3547 1390 L
+3547 1390 mt 3459 1247 L
+c13
+219 -23 -50 -154 3378 1567 3 MP
+PP
+0 sg
+3378 1567 mt 3328 1413 L
+3328 1413 mt 3547 1390 L
+/c19 { 1.000000 0.062500 0.000000 sr} bdef
+c19
+-135 -101 -71 -25 3463 1068 3 MP
+PP
+0 sg
+3463 1068 mt 3392 1043 L
+3392 1043 mt 3257  942 L
+c19
+-59 -22 -147 -104 3463 1068 3 MP
+PP
+0 sg
+3463 1068 mt 3316  964 L
+3316  964 mt 3257  942 L
+c19
+-147 -104 15 -26 3448 1094 3 MP
+PP
+0 sg
+3448 1094 mt 3463 1068 L
+3463 1068 mt 3316  964 L
+c18
+110 -113 -124 -19 3257 2603 3 MP
+PP
+0 sg
+3257 2603 mt 3133 2584 L
+3133 2584 mt 3243 2471 L
+c18
+135 -109 -59 -22 3316 2625 3 MP
+PP
+0 sg
+3316 2625 mt 3257 2603 L
+3257 2603 mt 3392 2494 L
+c16
+110 -115 173 -18 3176 2587 3 MP
+PP
+0 sg
+3176 2587 mt 3349 2569 L
+3349 2569 mt 3459 2454 L
+c15
+-244 -21 -76 -132 3413 1267 3 MP
+PP
+0 sg
+3413 1267 mt 3337 1135 L
+3337 1135 mt 3093 1114 L
+c15
+-51 -129 -269 -24 3413 1267 3 MP
+PP
+0 sg
+3413 1267 mt 3144 1243 L
+3144 1243 mt 3093 1114 L
+c15
+199 -21 -68 -145 3328 1413 3 MP
+PP
+0 sg
+3328 1413 mt 3260 1268 L
+3260 1268 mt 3459 1247 L
+c16
+199 -20 84 -113 3176 2587 3 MP
+PP
+0 sg
+3176 2587 mt 3260 2474 L
+3260 2474 mt 3459 2454 L
+c17
+99 -23 -110 -130 3459 1247 3 MP
+PP
+0 sg
+3459 1247 mt 3349 1117 L
+3349 1117 mt 3448 1094 L
+c17
+-110 -130 199 -21 3260 1268 3 MP
+PP
+0 sg
+3260 1268 mt 3459 1247 L
+3459 1247 mt 3349 1117 L
+c19
+-124 -19 -135 -101 3392 1043 3 MP
+PP
+0 sg
+3392 1043 mt 3257  942 L
+3257  942 mt 3133  923 L
+c19
+-110 -96 -149 -24 3392 1043 3 MP
+PP
+0 sg
+3392 1043 mt 3243 1019 L
+3243 1019 mt 3133  923 L
+c19
+-145 -109 99 -23 3349 1117 3 MP
+PP
+0 sg
+3349 1117 mt 3448 1094 L
+3448 1094 mt 3303  985 L
+c19
+13 -21 -145 -109 3448 1094 3 MP
+PP
+0 sg
+3448 1094 mt 3303  985 L
+3303  985 mt 3316  964 L
+/c20 { 0.000000 0.000000 0.750000 sr} bdef
+c20
+-59 -22 166 -84 3150 2709 3 MP
+PP
+0 sg
+3150 2709 mt 3316 2625 L
+3316 2625 mt 3257 2603 L
+c20
+13 -21 162 -79 3141 2725 3 MP
+PP
+0 sg
+3141 2725 mt 3303 2646 L
+3303 2646 mt 3316 2625 L
+c20
+166 -84 9 -16 3141 2725 3 MP
+PP
+0 sg
+3141 2725 mt 3150 2709 L
+3150 2709 mt 3316 2625 L
+c18
+145 -100 82 -19 3221 2665 3 MP
+PP
+0 sg
+3221 2665 mt 3303 2646 L
+3303 2646 mt 3448 2546 L
+c18
+99 -23 128 -96 3221 2665 3 MP
+PP
+0 sg
+3221 2665 mt 3349 2569 L
+3349 2569 mt 3448 2546 L
+c10
+9 -161 -345 -16 3182 2021 3 MP
+PP
+0 sg
+3182 2021 mt 2837 2005 L
+2837 2005 mt 2846 1844 L
+c11
+-345 -16 38 -154 3144 2175 3 MP
+PP
+0 sg
+3144 2175 mt 3182 2021 L
+3182 2021 mt 2837 2005 L
+c10
+-358 -17 22 -160 3182 2021 3 MP
+PP
+0 sg
+3182 2021 mt 3204 1861 L
+3204 1861 mt 2846 1844 L
+c9
+10 -160 323 -16 3086 2065 3 MP
+PP
+0 sg
+3086 2065 mt 3409 2049 L
+3409 2049 mt 3419 1889 L
+c9
+3 -162 -358 -17 3204 1861 3 MP
+PP
+0 sg
+3204 1861 mt 2846 1844 L
+2846 1844 mt 2849 1682 L
+c9
+-363 -17 8 -162 3204 1861 3 MP
+PP
+0 sg
+3204 1861 mt 3212 1699 L
+3212 1699 mt 2849 1682 L
+c8
+-10 -162 327 -17 3092 1906 3 MP
+PP
+0 sg
+3092 1906 mt 3419 1889 L
+3419 1889 mt 3409 1727 L
+c9
+327 -17 6 -159 3086 2065 3 MP
+PP
+0 sg
+3086 2065 mt 3092 1906 L
+3092 1906 mt 3419 1889 L
+c11
+16 -155 -323 -15 3144 2175 3 MP
+PP
+0 sg
+3144 2175 mt 2821 2160 L
+2821 2160 mt 2837 2005 L
+c14
+-323 -15 51 -145 3093 2320 3 MP
+PP
+0 sg
+3093 2320 mt 3144 2175 L
+3144 2175 mt 2821 2160 L
+c10
+323 -16 18 -152 3068 2217 3 MP
+PP
+0 sg
+3068 2217 mt 3086 2065 L
+3086 2065 mt 3409 2049 L
+c10
+31 -153 310 -15 3068 2217 3 MP
+PP
+0 sg
+3068 2217 mt 3378 2202 L
+3378 2202 mt 3409 2049 L
+c8
+323 -17 -6 -162 3092 1906 3 MP
+PP
+0 sg
+3092 1906 mt 3086 1744 L
+3086 1744 mt 3409 1727 L
+c8
+-358 -17 -8 -159 3212 1699 3 MP
+PP
+0 sg
+3212 1699 mt 3204 1540 L
+3204 1540 mt 2846 1523 L
+c8
+-3 -159 -363 -17 3212 1699 3 MP
+PP
+0 sg
+3212 1699 mt 2849 1682 L
+2849 1682 mt 2846 1523 L
+c12
+-31 -160 323 -17 3086 1744 3 MP
+PP
+0 sg
+3086 1744 mt 3409 1727 L
+3409 1727 mt 3378 1567 L
+c14
+21 -147 -293 -13 3093 2320 3 MP
+PP
+0 sg
+3093 2320 mt 2800 2307 L
+2800 2307 mt 2821 2160 L
+c16
+-293 -13 63 -133 3030 2453 3 MP
+PP
+0 sg
+3030 2453 mt 3093 2320 L
+3093 2320 mt 2800 2307 L
+c16
+63 -133 -213 -18 3243 2471 3 MP
+PP
+0 sg
+3243 2471 mt 3030 2453 L
+3030 2453 mt 3093 2320 L
+c11
+310 -15 30 -142 3038 2359 3 MP
+PP
+0 sg
+3038 2359 mt 3068 2217 L
+3068 2217 mt 3378 2202 L
+c12
+-345 -16 -22 -154 3204 1540 3 MP
+PP
+0 sg
+3204 1540 mt 3182 1386 L
+3182 1386 mt 2837 1370 L
+c12
+-9 -153 -358 -17 3204 1540 3 MP
+PP
+0 sg
+3204 1540 mt 2846 1523 L
+2846 1523 mt 2837 1370 L
+c13
+-50 -154 310 -16 3068 1583 3 MP
+PP
+0 sg
+3068 1583 mt 3378 1567 L
+3378 1567 mt 3328 1413 L
+c12
+310 -16 -18 -161 3086 1744 3 MP
+PP
+0 sg
+3086 1744 mt 3068 1583 L
+3068 1583 mt 3378 1567 L
+c11
+50 -143 290 -14 3038 2359 3 MP
+PP
+0 sg
+3038 2359 mt 3328 2345 L
+3328 2345 mt 3378 2202 L
+c20
+124 -93 -96 -15 3105 2692 3 MP
+PP
+0 sg
+3105 2692 mt 3009 2677 L
+3009 2677 mt 3133 2584 L
+c20
+152 -89 -45 -17 3150 2709 3 MP
+PP
+0 sg
+3150 2709 mt 3105 2692 L
+3105 2692 mt 3257 2603 L
+c20
+-124 -19 152 -89 3105 2692 3 MP
+PP
+0 sg
+3105 2692 mt 3257 2603 L
+3257 2603 mt 3133 2584 L
+c18
+173 -18 99 -93 3077 2680 3 MP
+PP
+0 sg
+3077 2680 mt 3176 2587 L
+3176 2587 mt 3349 2569 L
+c18
+128 -96 144 -15 3077 2680 3 MP
+PP
+0 sg
+3077 2680 mt 3221 2665 L
+3221 2665 mt 3349 2569 L
+c17
+-63 -113 -244 -21 3337 1135 3 MP
+PP
+0 sg
+3337 1135 mt 3093 1114 L
+3093 1114 mt 3030 1001 L
+c17
+-213 -18 -94 -116 3337 1135 3 MP
+PP
+0 sg
+3337 1135 mt 3243 1019 L
+3243 1019 mt 3030 1001 L
+c17
+173 -18 -84 -133 3260 1268 3 MP
+PP
+0 sg
+3260 1268 mt 3176 1135 L
+3176 1135 mt 3349 1117 L
+c19
+-75 -94 -213 -18 3243 1019 3 MP
+PP
+0 sg
+3243 1019 mt 3030 1001 L
+3030 1001 mt 2955  907 L
+c19
+-178 -16 -110 -96 3243 1019 3 MP
+PP
+0 sg
+3243 1019 mt 3133  923 L
+3133  923 mt 2955  907 L
+c19
+-128 -113 173 -18 3176 1135 3 MP
+PP
+0 sg
+3176 1135 mt 3349 1117 L
+3349 1117 mt 3221 1004 L
+c19
+82 -19 -128 -113 3349 1117 3 MP
+PP
+0 sg
+3349 1117 mt 3221 1004 L
+3221 1004 mt 3303  985 L
+c18
+-257 -12 75 -116 2955 2569 3 MP
+PP
+0 sg
+2955 2569 mt 3030 2453 L
+3030 2453 mt 2773 2441 L
+c18
+75 -116 -178 -15 3133 2584 3 MP
+PP
+0 sg
+3133 2584 mt 2955 2569 L
+2955 2569 mt 3030 2453 L
+c18
+-213 -18 110 -113 3133 2584 3 MP
+PP
+0 sg
+3133 2584 mt 3243 2471 L
+3243 2471 mt 3030 2453 L
+c14
+68 -129 264 -14 2996 2488 3 MP
+PP
+0 sg
+2996 2488 mt 3260 2474 L
+3260 2474 mt 3328 2345 L
+c13
+-16 -142 -345 -16 3182 1386 3 MP
+PP
+0 sg
+3182 1386 mt 2837 1370 L
+2837 1370 mt 2821 1228 L
+c13
+-323 -15 -38 -143 3182 1386 3 MP
+PP
+0 sg
+3182 1386 mt 3144 1243 L
+3144 1243 mt 2821 1228 L
+c15
+-68 -145 290 -14 3038 1427 3 MP
+PP
+0 sg
+3038 1427 mt 3328 1413 L
+3328 1413 mt 3260 1268 L
+c16
+27 -134 -257 -12 3030 2453 3 MP
+PP
+0 sg
+3030 2453 mt 2773 2441 L
+2773 2441 mt 2800 2307 L
+c14
+290 -14 42 -129 2996 2488 3 MP
+PP
+0 sg
+2996 2488 mt 3038 2359 L
+3038 2359 mt 3328 2345 L
+c13
+290 -14 -30 -156 3068 1583 3 MP
+PP
+0 sg
+3068 1583 mt 3038 1427 L
+3038 1427 mt 3328 1413 L
+/c21 { 0.875000 0.000000 0.000000 sr} bdef
+c21
+-124 -75 -124 -19 3257 942 3 MP
+PP
+0 sg
+3257  942 mt 3133  923 L
+3133  923 mt 3009  848 L
+c21
+-96 -15 -152 -79 3257 942 3 MP
+PP
+0 sg
+3257  942 mt 3105  863 L
+3105  863 mt 3009  848 L
+c21
+-45 -16 -166 -85 3316 964 3 MP
+PP
+0 sg
+3316  964 mt 3150  879 L
+3150  879 mt 3105  863 L
+c21
+-152 -79 -59 -22 3316 964 3 MP
+PP
+0 sg
+3316  964 mt 3257  942 L
+3257  942 mt 3105  863 L
+c21
+-166 -85 13 -21 3303 985 3 MP
+PP
+0 sg
+3303  985 mt 3316  964 L
+3316  964 mt 3150  879 L
+c21
+9 -17 -162 -89 3303 985 3 MP
+PP
+0 sg
+3303  985 mt 3141  896 L
+3141  896 mt 3150  879 L
+c21
+-162 -89 82 -19 3221 1004 3 MP
+PP
+0 sg
+3221 1004 mt 3303  985 L
+3303  985 mt 3141  896 L
+/c22 { 0.000000 0.000000 0.625000 sr} bdef
+c22
+9 -16 177 -56 2964 2781 3 MP
+PP
+0 sg
+2964 2781 mt 3141 2725 L
+3141 2725 mt 3150 2709 L
+c22
+179 -61 7 -11 2964 2781 3 MP
+PP
+0 sg
+2964 2781 mt 2971 2770 L
+2971 2770 mt 3150 2709 L
+c22
+-45 -17 179 -61 2971 2770 3 MP
+PP
+0 sg
+2971 2770 mt 3150 2709 L
+3150 2709 mt 3105 2692 L
+c20
+82 -19 144 -75 3077 2740 3 MP
+PP
+0 sg
+3077 2740 mt 3221 2665 L
+3221 2665 mt 3303 2646 L
+c20
+162 -79 64 -15 3077 2740 3 MP
+PP
+0 sg
+3077 2740 mt 3141 2725 L
+3141 2725 mt 3303 2646 L
+c20
+83 -96 -137 -12 3009 2677 3 MP
+PP
+0 sg
+3009 2677 mt 2872 2665 L
+2872 2665 mt 2955 2569 L
+c20
+-178 -15 124 -93 3009 2677 3 MP
+PP
+0 sg
+3009 2677 mt 3133 2584 L
+3133 2584 mt 2955 2569 L
+c16
+84 -113 231 -12 2945 2599 3 MP
+PP
+0 sg
+2945 2599 mt 3176 2587 L
+3176 2587 mt 3260 2474 L
+c15
+-21 -128 -323 -15 3144 1243 3 MP
+PP
+0 sg
+3144 1243 mt 2821 1228 L
+2821 1228 mt 2800 1100 L
+c15
+-293 -14 -51 -129 3144 1243 3 MP
+PP
+0 sg
+3144 1243 mt 3093 1114 L
+3093 1114 mt 2800 1100 L
+c17
+-84 -133 264 -13 2996 1281 3 MP
+PP
+0 sg
+2996 1281 mt 3260 1268 L
+3260 1268 mt 3176 1135 L
+c15
+264 -13 -42 -146 3038 1427 3 MP
+PP
+0 sg
+3038 1427 mt 2996 1281 L
+2996 1281 mt 3260 1268 L
+c16
+264 -14 51 -111 2945 2599 3 MP
+PP
+0 sg
+2945 2599 mt 2996 2488 L
+2996 2488 mt 3260 2474 L
+c21
+-137 -12 -124 -75 3133 923 3 MP
+PP
+0 sg
+3133  923 mt 3009  848 L
+3009  848 mt 2872  836 L
+c21
+-83 -71 -178 -16 3133 923 3 MP
+PP
+0 sg
+3133  923 mt 2955  907 L
+2955  907 mt 2872  836 L
+c21
+64 -15 -144 -93 3221 1004 3 MP
+PP
+0 sg
+3221 1004 mt 3077  911 L
+3077  911 mt 3141  896 L
+c21
+-144 -93 144 -15 3077 1019 3 MP
+PP
+0 sg
+3077 1019 mt 3221 1004 L
+3221 1004 mt 3077  911 L
+c19
+144 -15 -99 -116 3176 1135 3 MP
+PP
+0 sg
+3176 1135 mt 3077 1019 L
+3077 1019 mt 3221 1004 L
+c22
+165 -67 -31 -11 2971 2770 3 MP
+PP
+0 sg
+2971 2770 mt 2940 2759 L
+2940 2759 mt 3105 2692 L
+c20
+144 -75 111 -12 2966 2752 3 MP
+PP
+0 sg
+2966 2752 mt 3077 2740 L
+3077 2740 mt 3221 2665 L
+c22
+-96 -15 165 -67 2940 2759 3 MP
+PP
+0 sg
+2940 2759 mt 3105 2692 L
+3105 2692 mt 3009 2677 L
+c20
+144 -15 111 -72 2966 2752 3 MP
+PP
+0 sg
+2966 2752 mt 3077 2680 L
+3077 2680 mt 3221 2665 L
+c17
+231 -12 -51 -134 2996 1281 3 MP
+PP
+0 sg
+2996 1281 mt 2945 1147 L
+2945 1147 mt 3176 1135 L
+c17
+-257 -12 -63 -113 3093 1114 3 MP
+PP
+0 sg
+3093 1114 mt 3030 1001 L
+3030 1001 mt 2773  989 L
+c17
+-27 -111 -293 -14 3093 1114 3 MP
+PP
+0 sg
+3093 1114 mt 2800 1100 L
+2800 1100 mt 2773  989 L
+c19
+-99 -116 231 -12 2945 1147 3 MP
+PP
+0 sg
+2945 1147 mt 3176 1135 L
+3176 1135 mt 3077 1019 L
+c22
+-137 -12 134 -72 2875 2749 3 MP
+PP
+0 sg
+2875 2749 mt 3009 2677 L
+3009 2677 mt 2872 2665 L
+c18
+231 -12 60 -91 2885 2690 3 MP
+PP
+0 sg
+2885 2690 mt 2945 2599 L
+2945 2599 mt 3176 2587 L
+c22
+134 -72 -65 -10 2940 2759 3 MP
+PP
+0 sg
+2940 2759 mt 2875 2749 L
+2875 2749 mt 3009 2677 L
+c18
+99 -93 192 -10 2885 2690 3 MP
+PP
+0 sg
+2885 2690 mt 3077 2680 L
+3077 2680 mt 3176 2587 L
+/c23 { 0.687500 0.000000 0.000000 sr} bdef
+c23
+-134 -52 -96 -15 3105 863 3 MP
+PP
+0 sg
+3105  863 mt 3009  848 L
+3009  848 mt 2875  796 L
+c23
+-65 -10 -165 -57 3105 863 3 MP
+PP
+0 sg
+3105  863 mt 2940  806 L
+2940  806 mt 2875  796 L
+c23
+-165 -57 -45 -16 3150 879 3 MP
+PP
+0 sg
+3150  879 mt 3105  863 L
+3105  863 mt 2940  806 L
+c23
+-179 -62 9 -17 3141 896 3 MP
+PP
+0 sg
+3141  896 mt 3150  879 L
+3150  879 mt 2971  817 L
+c23
+-31 -11 -179 -62 3150 879 3 MP
+PP
+0 sg
+3150  879 mt 2971  817 L
+2971  817 mt 2940  806 L
+c23
+7 -12 -177 -67 3141 896 3 MP
+PP
+0 sg
+3141  896 mt 2964  829 L
+2964  829 mt 2971  817 L
+/c24 { 0.000000 0.000000 0.562500 sr} bdef
+c24
+185 -32 22 -5 2757 2818 3 MP
+PP
+0 sg
+2757 2818 mt 2779 2813 L
+2779 2813 mt 2964 2781 L
+c24
+43 -10 164 -27 2757 2818 3 MP
+PP
+0 sg
+2757 2818 mt 2921 2791 L
+2921 2791 mt 2964 2781 L
+c24
+7 -11 185 -32 2779 2813 3 MP
+PP
+0 sg
+2779 2813 mt 2964 2781 L
+2964 2781 mt 2971 2770 L
+c22
+64 -15 156 -51 2921 2791 3 MP
+PP
+0 sg
+2921 2791 mt 3077 2740 L
+3077 2740 mt 3141 2725 L
+c22
+177 -56 43 -10 2921 2791 3 MP
+PP
+0 sg
+2921 2791 mt 2964 2781 L
+2964 2781 mt 3141 2725 L
+c23
+-93 -8 -134 -52 3009 848 3 MP
+PP
+0 sg
+3009  848 mt 2875  796 L
+2875  796 mt 2782  788 L
+c23
+-90 -48 -137 -12 3009 848 3 MP
+PP
+0 sg
+3009  848 mt 2872  836 L
+2872  836 mt 2782  788 L
+c23
+-177 -67 64 -15 3077 911 3 MP
+PP
+0 sg
+3077  911 mt 3141  896 L
+3141  896 mt 2964  829 L
+c10
+-383 -6 9 -161 2837 2005 3 MP
+PP
+0 sg
+2837 2005 mt 2846 1844 L
+2846 1844 mt 2463 1838 L
+c8
+-6 -162 375 -5 2717 1911 3 MP
+PP
+0 sg
+2717 1911 mt 3092 1906 L
+3092 1906 mt 3086 1744 L
+c11
+-370 -6 16 -155 2821 2160 3 MP
+PP
+0 sg
+2821 2160 mt 2837 2005 L
+2837 2005 mt 2467 1999 L
+c9
+6 -159 371 -5 2715 2070 3 MP
+PP
+0 sg
+2715 2070 mt 3086 2065 L
+3086 2065 mt 3092 1906 L
+c10
+-4 -161 -370 -6 2837 2005 3 MP
+PP
+0 sg
+2837 2005 mt 2467 1999 L
+2467 1999 mt 2463 1838 L
+c9
+375 -5 2 -159 2715 2070 3 MP
+PP
+0 sg
+2715 2070 mt 2717 1911 L
+2717 1911 mt 3092 1906 L
+c9
+-388 -6 3 -162 2846 1844 3 MP
+PP
+0 sg
+2846 1844 mt 2849 1682 L
+2849 1682 mt 2461 1676 L
+c12
+-18 -161 371 -5 2715 1749 3 MP
+PP
+0 sg
+2715 1749 mt 3086 1744 L
+3086 1744 mt 3068 1583 L
+c14
+-346 -5 21 -147 2800 2307 3 MP
+PP
+0 sg
+2800 2307 mt 2821 2160 L
+2821 2160 mt 2475 2155 L
+c10
+18 -152 357 -6 2711 2223 3 MP
+PP
+0 sg
+2711 2223 mt 3068 2217 L
+3068 2217 mt 3086 2065 L
+c11
+-8 -156 -346 -5 2821 2160 3 MP
+PP
+0 sg
+2821 2160 mt 2475 2155 L
+2475 2155 mt 2467 1999 L
+c10
+371 -5 4 -153 2711 2223 3 MP
+PP
+0 sg
+2711 2223 mt 2715 2070 L
+2715 2070 mt 3086 2065 L
+c9
+-2 -162 -383 -6 2846 1844 3 MP
+PP
+0 sg
+2846 1844 mt 2463 1838 L
+2463 1838 mt 2461 1676 L
+c8
+371 -5 -2 -162 2717 1911 3 MP
+PP
+0 sg
+2717 1911 mt 2715 1749 L
+2715 1749 mt 3086 1744 L
+c19
+-213 -10 -75 -94 3030 1001 3 MP
+PP
+0 sg
+3030 1001 mt 2955  907 L
+2955  907 mt 2742  897 L
+c21
+111 -11 -111 -97 3077 1019 3 MP
+PP
+0 sg
+3077 1019 mt 2966  922 L
+2966  922 mt 3077  911 L
+c24
+-31 -11 189 -38 2782 2808 3 MP
+PP
+0 sg
+2782 2808 mt 2971 2770 L
+2971 2770 mt 2940 2759 L
+c24
+189 -38 3 -5 2779 2813 3 MP
+PP
+0 sg
+2779 2813 mt 2782 2808 L
+2782 2808 mt 2971 2770 L
+c22
+156 -51 76 -8 2845 2799 3 MP
+PP
+0 sg
+2845 2799 mt 2921 2791 L
+2921 2791 mt 3077 2740 L
+c23
+43 -10 -156 -72 3077 911 3 MP
+PP
+0 sg
+3077  911 mt 2921  839 L
+2921  839 mt 2964  829 L
+c22
+111 -12 121 -47 2845 2799 3 MP
+PP
+0 sg
+2845 2799 mt 2966 2752 L
+2966 2752 mt 3077 2740 L
+c23
+-156 -72 111 -11 2966 922 3 MP
+PP
+0 sg
+2966  922 mt 3077  911 L
+3077  911 mt 2921  839 L
+c19
+192 -10 -60 -118 2945 1147 3 MP
+PP
+0 sg
+2945 1147 mt 2885 1029 L
+2885 1029 mt 3077 1019 L
+c19
+-31 -92 -257 -12 3030 1001 3 MP
+PP
+0 sg
+3030 1001 mt 2773  989 L
+2773  989 mt 2742  897 L
+c21
+-111 -97 192 -10 2885 1029 3 MP
+PP
+0 sg
+2885 1029 mt 3077 1019 L
+3077 1019 mt 2966  922 L
+c22
+90 -76 -93 -8 2875 2749 3 MP
+PP
+0 sg
+2875 2749 mt 2782 2741 L
+2782 2741 mt 2872 2665 L
+c24
+141 -48 -33 -5 2767 2802 3 MP
+PP
+0 sg
+2767 2802 mt 2734 2797 L
+2734 2797 mt 2875 2749 L
+c24
+-93 -8 141 -48 2734 2797 3 MP
+PP
+0 sg
+2734 2797 mt 2875 2749 L
+2875 2749 mt 2782 2741 L
+c24
+-65 -10 173 -43 2767 2802 3 MP
+PP
+0 sg
+2767 2802 mt 2940 2759 L
+2940 2759 mt 2875 2749 L
+c20
+111 -72 148 -7 2818 2759 3 MP
+PP
+0 sg
+2818 2759 mt 2966 2752 L
+2966 2752 mt 3077 2680 L
+c20
+192 -10 67 -69 2818 2759 3 MP
+PP
+0 sg
+2818 2759 mt 2885 2690 L
+2885 2690 mt 3077 2680 L
+c8
+-383 -6 -3 -159 2849 1682 3 MP
+PP
+0 sg
+2849 1682 mt 2846 1523 L
+2846 1523 mt 2463 1517 L
+c8
+2 -159 -388 -6 2849 1682 3 MP
+PP
+0 sg
+2849 1682 mt 2461 1676 L
+2461 1676 mt 2463 1517 L
+c12
+357 -5 -4 -161 2715 1749 3 MP
+PP
+0 sg
+2715 1749 mt 2711 1588 L
+2711 1588 mt 3068 1583 L
+c12
+4 -153 -383 -6 2846 1523 3 MP
+PP
+0 sg
+2846 1523 mt 2463 1517 L
+2463 1517 mt 2467 1364 L
+c12
+-370 -6 -9 -153 2846 1523 3 MP
+PP
+0 sg
+2846 1523 mt 2837 1370 L
+2837 1370 mt 2467 1364 L
+c13
+-30 -156 357 -5 2711 1588 3 MP
+PP
+0 sg
+2711 1588 mt 3068 1583 L
+3068 1583 mt 3038 1427 L
+c14
+-11 -147 -314 -5 2800 2307 3 MP
+PP
+0 sg
+2800 2307 mt 2486 2302 L
+2486 2302 mt 2475 2155 L
+c16
+-314 -5 27 -134 2773 2441 3 MP
+PP
+0 sg
+2773 2441 mt 2800 2307 L
+2800 2307 mt 2486 2302 L
+c11
+357 -6 8 -141 2703 2364 3 MP
+PP
+0 sg
+2703 2364 mt 2711 2223 L
+2711 2223 mt 3068 2217 L
+c11
+30 -142 335 -5 2703 2364 3 MP
+PP
+0 sg
+2703 2364 mt 3038 2359 L
+3038 2359 mt 3068 2217 L
+c13
+335 -5 -8 -156 2711 1588 3 MP
+PP
+0 sg
+2711 1588 mt 2703 1432 L
+2703 1432 mt 3038 1427 L
+c16
+-13 -134 -274 -5 2773 2441 3 MP
+PP
+0 sg
+2773 2441 mt 2499 2436 L
+2499 2436 mt 2486 2302 L
+c18
+-274 -5 31 -118 2742 2559 3 MP
+PP
+0 sg
+2742 2559 mt 2773 2441 L
+2773 2441 mt 2499 2436 L
+c18
+31 -118 -213 -10 2955 2569 3 MP
+PP
+0 sg
+2955 2569 mt 2742 2559 L
+2742 2559 mt 2773 2441 L
+c14
+335 -5 11 -128 2692 2492 3 MP
+PP
+0 sg
+2692 2492 mt 2703 2364 L
+2703 2364 mt 3038 2359 L
+c14
+42 -129 304 -4 2692 2492 3 MP
+PP
+0 sg
+2692 2492 mt 2996 2488 L
+2996 2488 mt 3038 2359 L
+c13
+8 -141 -370 -6 2837 1370 3 MP
+PP
+0 sg
+2837 1370 mt 2467 1364 L
+2467 1364 mt 2475 1223 L
+c13
+-346 -5 -16 -142 2837 1370 3 MP
+PP
+0 sg
+2837 1370 mt 2821 1228 L
+2821 1228 mt 2475 1223 L
+c15
+-42 -146 335 -5 2703 1432 3 MP
+PP
+0 sg
+2703 1432 mt 3038 1427 L
+3038 1427 mt 2996 1281 L
+c20
+-228 -4 35 -99 2707 2658 3 MP
+PP
+0 sg
+2707 2658 mt 2742 2559 L
+2742 2559 mt 2514 2555 L
+c20
+35 -99 -165 -7 2872 2665 3 MP
+PP
+0 sg
+2872 2665 mt 2707 2658 L
+2707 2658 mt 2742 2559 L
+c20
+-213 -10 83 -96 2872 2665 3 MP
+PP
+0 sg
+2872 2665 mt 2955 2569 L
+2955 2569 mt 2742 2559 L
+c16
+51 -111 266 -4 2679 2603 3 MP
+PP
+0 sg
+2679 2603 mt 2945 2599 L
+2945 2599 mt 2996 2488 L
+c15
+-314 -5 -21 -128 2821 1228 3 MP
+PP
+0 sg
+2821 1228 mt 2800 1100 L
+2800 1100 mt 2486 1095 L
+c15
+11 -128 -346 -5 2821 1228 3 MP
+PP
+0 sg
+2821 1228 mt 2475 1223 L
+2475 1223 mt 2486 1095 L
+c17
+-51 -134 304 -4 2692 1285 3 MP
+PP
+0 sg
+2692 1285 mt 2996 1281 L
+2996 1281 mt 2945 1147 L
+c15
+304 -4 -11 -147 2703 1432 3 MP
+PP
+0 sg
+2703 1432 mt 2692 1285 L
+2692 1285 mt 2996 1281 L
+c18
+-15 -119 -228 -4 2742 2559 3 MP
+PP
+0 sg
+2742 2559 mt 2514 2555 L
+2514 2555 mt 2499 2436 L
+c16
+304 -4 13 -111 2679 2603 3 MP
+PP
+0 sg
+2679 2603 mt 2692 2492 L
+2692 2492 mt 2996 2488 L
+/c25 { 0.562500 0.000000 0.000000 sr} bdef
+c25
+-48 -4 -141 -27 2875 796 3 MP
+PP
+0 sg
+2875  796 mt 2734  769 L
+2734  769 mt 2686  765 L
+c25
+-96 -23 -93 -8 2875 796 3 MP
+PP
+0 sg
+2875  796 mt 2782  788 L
+2782  788 mt 2686  765 L
+c25
+-141 -27 -65 -10 2940 806 3 MP
+PP
+0 sg
+2940  806 mt 2875  796 L
+2875  796 mt 2734  769 L
+c25
+-33 -5 -173 -32 2940 806 3 MP
+PP
+0 sg
+2940  806 mt 2767  774 L
+2767  774 mt 2734  769 L
+c25
+-15 -6 -189 -37 2971 817 3 MP
+PP
+0 sg
+2971  817 mt 2782  780 L
+2782  780 mt 2767  774 L
+c25
+-173 -32 -31 -11 2971 817 3 MP
+PP
+0 sg
+2971  817 mt 2940  806 L
+2940  806 mt 2767  774 L
+c25
+-189 -37 7 -12 2964 829 3 MP
+PP
+0 sg
+2964  829 mt 2971  817 L
+2971  817 mt 2782  780 L
+c21
+-165 -8 -83 -71 2955 907 3 MP
+PP
+0 sg
+2955  907 mt 2872  836 L
+2872  836 mt 2707  828 L
+c21
+-35 -69 -213 -10 2955 907 3 MP
+PP
+0 sg
+2955  907 mt 2742  897 L
+2742  897 mt 2707  828 L
+c23
+76 -8 -121 -75 2966 922 3 MP
+PP
+0 sg
+2966  922 mt 2845  847 L
+2845  847 mt 2921  839 L
+c21
+148 -8 -67 -99 2885 1029 3 MP
+PP
+0 sg
+2885 1029 mt 2818  930 L
+2818  930 mt 2966  922 L
+c23
+-121 -75 148 -8 2818 930 3 MP
+PP
+0 sg
+2818  930 mt 2966  922 L
+2966  922 mt 2845  847 L
+c24
+178 -18 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2767 2802 L
+c24
+-33 -5 178 -18 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2767 2802 L
+2767 2802 mt 2734 2797 L
+2734 2797 mt 2589 2820 L
+c24
+-15 -6 193 -12 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2782 2808 L
+2782 2808 mt 2767 2802 L
+2767 2802 mt 2589 2820 L
+c24
+173 -43 -15 -6 2782 2808 3 MP
+PP
+0 sg
+2782 2808 mt 2767 2802 L
+2767 2802 mt 2940 2759 L
+c22
+121 -47 100 -6 2745 2805 3 MP
+PP
+0 sg
+2745 2805 mt 2845 2799 L
+2845 2799 mt 2966 2752 L
+c22
+148 -7 73 -46 2745 2805 3 MP
+PP
+0 sg
+2745 2805 mt 2818 2759 L
+2818 2759 mt 2966 2752 L
+c25
+-185 -44 43 -10 2921 839 3 MP
+PP
+0 sg
+2921  839 mt 2964  829 L
+2964  829 mt 2779  785 L
+c25
+3 -5 -185 -44 2964 829 3 MP
+PP
+0 sg
+2964  829 mt 2779  785 L
+2779  785 mt 2782  780 L
+c17
+13 -111 -314 -5 2800 1100 3 MP
+PP
+0 sg
+2800 1100 mt 2486 1095 L
+2486 1095 mt 2499  984 L
+c17
+-274 -5 -27 -111 2800 1100 3 MP
+PP
+0 sg
+2800 1100 mt 2773  989 L
+2773  989 mt 2499  984 L
+c19
+-60 -118 266 -4 2679 1151 3 MP
+PP
+0 sg
+2679 1151 mt 2945 1147 L
+2945 1147 mt 2885 1029 L
+c20
+-17 -100 -176 -3 2707 2658 3 MP
+PP
+0 sg
+2707 2658 mt 2531 2655 L
+2531 2655 mt 2514 2555 L
+c22
+-176 -3 38 -77 2669 2735 3 MP
+PP
+0 sg
+2669 2735 mt 2707 2658 L
+2707 2658 mt 2531 2655 L
+c22
+38 -77 -113 -6 2782 2741 3 MP
+PP
+0 sg
+2782 2741 mt 2669 2735 L
+2669 2735 mt 2707 2658 L
+c22
+-165 -7 90 -76 2782 2741 3 MP
+PP
+0 sg
+2782 2741 mt 2872 2665 L
+2872 2665 mt 2707 2658 L
+c18
+266 -4 15 -90 2664 2693 3 MP
+PP
+0 sg
+2664 2693 mt 2679 2603 L
+2679 2603 mt 2945 2599 L
+c17
+266 -4 -13 -134 2692 1285 3 MP
+PP
+0 sg
+2692 1285 mt 2679 1151 L
+2679 1151 mt 2945 1147 L
+c18
+60 -91 221 -3 2664 2693 3 MP
+PP
+0 sg
+2664 2693 mt 2885 2690 L
+2885 2690 mt 2945 2599 L
+c24
+168 -2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2757 2818 L
+c24
+38 -4 130 2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2719 2822 L
+2719 2822 mt 2757 2818 L
+2757 2818 mt 2589 2820 L
+c24
+22 -5 168 -2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2757 2818 L
+2757 2818 mt 2779 2813 L
+2779 2813 mt 2589 2820 L
+c24
+190 -7 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2779 2813 L
+c24
+3 -5 190 -7 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2779 2813 L
+2779 2813 mt 2782 2808 L
+2782 2808 mt 2589 2820 L
+c24
+164 -27 38 -4 2719 2822 3 MP
+PP
+0 sg
+2719 2822 mt 2757 2818 L
+2757 2818 mt 2921 2791 L
+c25
+-39 -21 -113 -5 2782 788 3 MP
+PP
+0 sg
+2782  788 mt 2669  783 L
+2669  783 mt 2630  762 L
+c25
+-56 -3 -96 -23 2782 788 3 MP
+PP
+0 sg
+2782  788 mt 2686  765 L
+2686  765 mt 2630  762 L
+c23
+-113 -5 -90 -48 2872 836 3 MP
+PP
+0 sg
+2872  836 mt 2782  788 L
+2782  788 mt 2669  783 L
+c25
+22 -5 -164 -49 2921 839 3 MP
+PP
+0 sg
+2921  839 mt 2757  790 L
+2757  790 mt 2779  785 L
+c24
+76 -8 126 -23 2719 2822 3 MP
+PP
+0 sg
+2719 2822 mt 2845 2799 L
+2845 2799 mt 2921 2791 L
+c23
+-38 -45 -165 -8 2872 836 3 MP
+PP
+0 sg
+2872  836 mt 2707  828 L
+2707  828 mt 2669  783 L
+c25
+-164 -49 76 -8 2845 847 3 MP
+PP
+0 sg
+2845  847 mt 2921  839 L
+2921  839 mt 2757  790 L
+c24
+-119 -1 39 -55 2630 2790 3 MP
+PP
+0 sg
+2630 2790 mt 2669 2735 L
+2669 2735 mt 2550 2734 L
+c22
+-19 -79 -119 -1 2669 2735 3 MP
+PP
+0 sg
+2669 2735 mt 2550 2734 L
+2550 2734 mt 2531 2655 L
+c24
+39 -55 -56 -3 2686 2793 3 MP
+PP
+0 sg
+2686 2793 mt 2630 2790 L
+2630 2790 mt 2669 2735 L
+c24
+-113 -6 96 -52 2686 2793 3 MP
+PP
+0 sg
+2686 2793 mt 2782 2741 L
+2782 2741 mt 2669 2735 L
+c20
+221 -3 17 -69 2647 2762 3 MP
+PP
+0 sg
+2647 2762 mt 2664 2693 L
+2664 2693 mt 2885 2690 L
+c19
+221 -3 -15 -119 2679 1151 3 MP
+PP
+0 sg
+2679 1151 mt 2664 1032 L
+2664 1032 mt 2885 1029 L
+c24
+96 -52 -48 -4 2734 2797 3 MP
+PP
+0 sg
+2734 2797 mt 2686 2793 L
+2686 2793 mt 2782 2741 L
+c20
+67 -69 171 -3 2647 2762 3 MP
+PP
+0 sg
+2647 2762 mt 2818 2759 L
+2818 2759 mt 2885 2690 L
+c19
+15 -90 -274 -5 2773 989 3 MP
+PP
+0 sg
+2773  989 mt 2499  984 L
+2499  984 mt 2514  894 L
+c19
+-228 -3 -31 -92 2773 989 3 MP
+PP
+0 sg
+2773  989 mt 2742  897 L
+2742  897 mt 2514  894 L
+c21
+-67 -99 221 -3 2664 1032 3 MP
+PP
+0 sg
+2664 1032 mt 2885 1029 L
+2885 1029 mt 2818  930 L
+c25
+38 -5 -126 -52 2845 847 3 MP
+PP
+0 sg
+2845  847 mt 2719  795 L
+2719  795 mt 2757  790 L
+c24
+130 2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2719 2822 L
+c24
+51 -3 79 5 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2668 2825 L
+2668 2825 mt 2719 2822 L
+2719 2822 mt 2589 2820 L
+c24
+126 -23 51 -3 2668 2825 3 MP
+PP
+0 sg
+2668 2825 mt 2719 2822 L
+2719 2822 mt 2845 2799 L
+c25
+-126 -52 100 -5 2745 852 3 MP
+PP
+0 sg
+2745  852 mt 2845  847 L
+2845  847 mt 2719  795 L
+c23
+100 -5 -73 -78 2818 930 3 MP
+PP
+0 sg
+2818  930 mt 2745  852 L
+2745  852 mt 2845  847 L
+c24
+193 -12 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2782 2808 L
+c24
+100 -6 77 -20 2668 2825 3 MP
+PP
+0 sg
+2668 2825 mt 2745 2805 L
+2745 2805 mt 2845 2799 L
+c24
+-56 -3 97 -27 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2686 2793 L
+2686 2793 mt 2630 2790 L
+2630 2790 mt 2589 2820 L
+c24
+97 -27 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2686 2793 L
+c24
+145 -23 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2734 2797 L
+c24
+-48 -4 145 -23 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2734 2797 L
+2734 2797 mt 2686 2793 L
+2686 2793 mt 2589 2820 L
+c22
+73 -46 117 -1 2628 2806 3 MP
+PP
+0 sg
+2628 2806 mt 2745 2805 L
+2745 2805 mt 2818 2759 L
+c21
+171 -2 -17 -100 2664 1032 3 MP
+PP
+0 sg
+2664 1032 mt 2647  932 L
+2647  932 mt 2818  930 L
+c21
+17 -69 -228 -3 2742 897 3 MP
+PP
+0 sg
+2742  897 mt 2514  894 L
+2514  894 mt 2531  825 L
+c21
+-176 -3 -35 -69 2742 897 3 MP
+PP
+0 sg
+2742  897 mt 2707  828 L
+2707  828 mt 2531  825 L
+c23
+-73 -78 171 -2 2647 932 3 MP
+PP
+0 sg
+2647  932 mt 2818  930 L
+2818  930 mt 2745  852 L
+c22
+171 -3 19 -44 2628 2806 3 MP
+PP
+0 sg
+2628 2806 mt 2647 2762 L
+2647 2762 mt 2818 2759 L
+c25
+19 -20 -119 -2 2669 783 3 MP
+PP
+0 sg
+2669  783 mt 2550  781 L
+2550  781 mt 2569  761 L
+c25
+-61 -1 -39 -21 2669 783 3 MP
+PP
+0 sg
+2669  783 mt 2630  762 L
+2630  762 mt 2569  761 L
+/c26 { 0.500000 0.000000 0.000000 sr} bdef
+c26
+0 0 -193 -13 2782 780 3 MP
+PP
+0 sg
+2782  780 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-193 -13 3 -5 2779 785 3 MP
+PP
+0 sg
+2779  785 mt 2782  780 L
+2782  780 mt 2589  767 L
+2589  767 mt 2779  785 L
+c26
+-178 -7 -15 -6 2782 780 3 MP
+PP
+0 sg
+2782  780 mt 2767  774 L
+2767  774 mt 2589  767 L
+2589  767 mt 2782  780 L
+c26
+0 0 -190 -18 2779 785 3 MP
+PP
+0 sg
+2779  785 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-190 -18 22 -5 2757 790 3 MP
+PP
+0 sg
+2757  790 mt 2779  785 L
+2779  785 mt 2589  767 L
+2589  767 mt 2757  790 L
+c26
+-145 -2 -33 -5 2767 774 3 MP
+PP
+0 sg
+2767  774 mt 2734  769 L
+2734  769 mt 2589  767 L
+2589  767 mt 2767  774 L
+c26
+0 0 -178 -7 2767 774 3 MP
+PP
+0 sg
+2767  774 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+-119 -2 -38 -45 2707 828 3 MP
+PP
+0 sg
+2707  828 mt 2669  783 L
+2669  783 mt 2550  781 L
+c26
+-168 -23 38 -5 2719 795 3 MP
+PP
+0 sg
+2719  795 mt 2757  790 L
+2757  790 mt 2589  767 L
+2589  767 mt 2719  795 L
+c26
+0 0 -168 -23 2757 790 3 MP
+PP
+0 sg
+2757  790 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+19 -44 -176 -3 2707 828 3 MP
+PP
+0 sg
+2707  828 mt 2531  825 L
+2531  825 mt 2550  781 L
+c25
+-77 -55 117 -1 2628 853 3 MP
+PP
+0 sg
+2628  853 mt 2745  852 L
+2745  852 mt 2668  797 L
+c23
+117 -1 -19 -79 2647 932 3 MP
+PP
+0 sg
+2647  932 mt 2628  853 L
+2628  853 mt 2745  852 L
+c25
+51 -2 -77 -55 2745 852 3 MP
+PP
+0 sg
+2745  852 mt 2668  797 L
+2668  797 mt 2719  795 L
+c24
+59 -1 20 6 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2609 2826 L
+2609 2826 mt 2668 2825 L
+2668 2825 mt 2589 2820 L
+c24
+79 5 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2668 2825 L
+c24
+117 -1 19 -20 2609 2826 3 MP
+PP
+0 sg
+2609 2826 mt 2628 2806 L
+2628 2806 mt 2745 2805 L
+c24
+77 -20 59 -1 2609 2826 3 MP
+PP
+0 sg
+2609 2826 mt 2668 2825 L
+2668 2825 mt 2745 2805 L
+c26
+0 0 -145 -2 2734 769 3 MP
+PP
+0 sg
+2734  769 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-97 2 -48 -4 2734 769 3 MP
+PP
+0 sg
+2734  769 mt 2686  765 L
+2686  765 mt 2589  767 L
+2589  767 mt 2734  769 L
+c26
+0 0 -130 -28 2719 795 3 MP
+PP
+0 sg
+2719  795 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-130 -28 51 -2 2668 797 3 MP
+PP
+0 sg
+2668  797 mt 2719  795 L
+2719  795 mt 2589  767 L
+2589  767 mt 2668  797 L
+c11
+-357 5 -8 -156 2475 2155 3 MP
+PP
+0 sg
+2475 2155 mt 2467 1999 L
+2467 1999 mt 2110 2004 L
+c9
+2 -159 383 6 2332 2064 3 MP
+PP
+0 sg
+2332 2064 mt 2715 2070 L
+2715 2070 mt 2717 1911 L
+c10
+-18 -161 -357 5 2467 1999 3 MP
+PP
+0 sg
+2467 1999 mt 2110 2004 L
+2110 2004 mt 2092 1843 L
+c10
+-371 5 -4 -161 2467 1999 3 MP
+PP
+0 sg
+2467 1999 mt 2463 1838 L
+2463 1838 mt 2092 1843 L
+c9
+388 6 -3 -159 2332 2064 3 MP
+PP
+0 sg
+2332 2064 mt 2329 1905 L
+2329 1905 mt 2717 1911 L
+c8
+-2 -162 388 6 2329 1905 3 MP
+PP
+0 sg
+2329 1905 mt 2717 1911 L
+2717 1911 mt 2715 1749 L
+c11
+-30 -156 -335 5 2475 2155 3 MP
+PP
+0 sg
+2475 2155 mt 2140 2160 L
+2140 2160 mt 2110 2004 L
+c14
+-335 5 -11 -147 2486 2302 3 MP
+PP
+0 sg
+2486 2302 mt 2475 2155 L
+2475 2155 mt 2140 2160 L
+c10
+383 6 -9 -153 2341 2217 3 MP
+PP
+0 sg
+2341 2217 mt 2332 2064 L
+2332 2064 mt 2715 2070 L
+c10
+4 -153 370 6 2341 2217 3 MP
+PP
+0 sg
+2341 2217 mt 2711 2223 L
+2711 2223 mt 2715 2070 L
+c9
+-375 5 -2 -162 2463 1838 3 MP
+PP
+0 sg
+2463 1838 mt 2461 1676 L
+2461 1676 mt 2086 1681 L
+c12
+-4 -161 383 6 2332 1743 3 MP
+PP
+0 sg
+2332 1743 mt 2715 1749 L
+2715 1749 mt 2711 1588 L
+c9
+-6 -162 -371 5 2463 1838 3 MP
+PP
+0 sg
+2463 1838 mt 2092 1843 L
+2092 1843 mt 2086 1681 L
+c8
+383 6 3 -162 2329 1905 3 MP
+PP
+0 sg
+2329 1905 mt 2332 1743 L
+2332 1743 mt 2715 1749 L
+c16
+-304 4 -13 -134 2499 2436 3 MP
+PP
+0 sg
+2499 2436 mt 2486 2302 L
+2486 2302 mt 2182 2306 L
+c11
+8 -141 346 5 2357 2359 3 MP
+PP
+0 sg
+2357 2359 mt 2703 2364 L
+2703 2364 mt 2711 2223 L
+c8
+-371 5 2 -159 2461 1676 3 MP
+PP
+0 sg
+2461 1676 mt 2463 1517 L
+2463 1517 mt 2092 1522 L
+c13
+-8 -156 370 6 2341 1582 3 MP
+PP
+0 sg
+2341 1582 mt 2711 1588 L
+2711 1588 mt 2703 1432 L
+c8
+6 -159 -375 5 2461 1676 3 MP
+PP
+0 sg
+2461 1676 mt 2086 1681 L
+2086 1681 mt 2092 1522 L
+c12
+370 6 9 -161 2332 1743 3 MP
+PP
+0 sg
+2332 1743 mt 2341 1582 L
+2341 1582 mt 2711 1588 L
+c14
+-42 -146 -304 4 2486 2302 3 MP
+PP
+0 sg
+2486 2302 mt 2182 2306 L
+2182 2306 mt 2140 2160 L
+c11
+370 6 -16 -142 2357 2359 3 MP
+PP
+0 sg
+2357 2359 mt 2341 2217 L
+2341 2217 mt 2711 2223 L
+c12
+-357 6 4 -153 2463 1517 3 MP
+PP
+0 sg
+2463 1517 mt 2467 1364 L
+2467 1364 mt 2110 1370 L
+c15
+-11 -147 346 5 2357 1427 3 MP
+PP
+0 sg
+2357 1427 mt 2703 1432 L
+2703 1432 mt 2692 1285 L
+c16
+-51 -134 -266 4 2499 2436 3 MP
+PP
+0 sg
+2499 2436 mt 2233 2440 L
+2233 2440 mt 2182 2306 L
+c18
+-266 4 -15 -119 2514 2555 3 MP
+PP
+0 sg
+2514 2555 mt 2499 2436 L
+2499 2436 mt 2233 2440 L
+c14
+346 5 -21 -128 2378 2487 3 MP
+PP
+0 sg
+2378 2487 mt 2357 2359 L
+2357 2359 mt 2703 2364 L
+c14
+11 -128 314 5 2378 2487 3 MP
+PP
+0 sg
+2378 2487 mt 2692 2492 L
+2692 2492 mt 2703 2364 L
+c12
+18 -152 -371 5 2463 1517 3 MP
+PP
+0 sg
+2463 1517 mt 2092 1522 L
+2092 1522 mt 2110 1370 L
+c13
+346 5 16 -155 2341 1582 3 MP
+PP
+0 sg
+2341 1582 mt 2357 1427 L
+2357 1427 mt 2703 1432 L
+c18
+-60 -118 -221 3 2514 2555 3 MP
+PP
+0 sg
+2514 2555 mt 2293 2558 L
+2293 2558 mt 2233 2440 L
+c20
+-221 3 -17 -100 2531 2655 3 MP
+PP
+0 sg
+2531 2655 mt 2514 2555 L
+2514 2555 mt 2293 2558 L
+c16
+314 5 -27 -111 2405 2598 3 MP
+PP
+0 sg
+2405 2598 mt 2378 2487 L
+2378 2487 mt 2692 2492 L
+c13
+30 -142 -357 6 2467 1364 3 MP
+PP
+0 sg
+2467 1364 mt 2110 1370 L
+2110 1370 mt 2140 1228 L
+c13
+-335 5 8 -141 2467 1364 3 MP
+PP
+0 sg
+2467 1364 mt 2475 1223 L
+2475 1223 mt 2140 1228 L
+c15
+314 5 21 -147 2357 1427 3 MP
+PP
+0 sg
+2357 1427 mt 2378 1280 L
+2378 1280 mt 2692 1285 L
+c17
+-13 -134 314 5 2378 1280 3 MP
+PP
+0 sg
+2378 1280 mt 2692 1285 L
+2692 1285 mt 2679 1151 L
+c16
+13 -111 274 5 2405 2598 3 MP
+PP
+0 sg
+2405 2598 mt 2679 2603 L
+2679 2603 mt 2692 2492 L
+c26
+0 0 -97 2 2686 765 3 MP
+PP
+0 sg
+2686  765 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-41 5 -56 -3 2686 765 3 MP
+PP
+0 sg
+2686  765 mt 2630  762 L
+2630  762 mt 2589  767 L
+2589  767 mt 2686  765 L
+c22
+-73 -78 -117 1 2550 2734 3 MP
+PP
+0 sg
+2550 2734 mt 2433 2735 L
+2433 2735 mt 2360 2657 L
+c22
+-171 2 -19 -79 2550 2734 3 MP
+PP
+0 sg
+2550 2734 mt 2531 2655 L
+2531 2655 mt 2360 2657 L
+c18
+15 -90 228 3 2436 2690 3 MP
+PP
+0 sg
+2436 2690 mt 2664 2693 L
+2664 2693 mt 2679 2603 L
+c20
+-67 -99 -171 2 2531 2655 3 MP
+PP
+0 sg
+2531 2655 mt 2360 2657 L
+2360 2657 mt 2293 2558 L
+c18
+274 5 -31 -92 2436 2690 3 MP
+PP
+0 sg
+2436 2690 mt 2405 2598 L
+2405 2598 mt 2679 2603 L
+c15
+42 -129 -335 5 2475 1223 3 MP
+PP
+0 sg
+2475 1223 mt 2140 1228 L
+2140 1228 mt 2182 1099 L
+c15
+-304 4 11 -128 2475 1223 3 MP
+PP
+0 sg
+2475 1223 mt 2486 1095 L
+2486 1095 mt 2182 1099 L
+c17
+274 5 27 -134 2378 1280 3 MP
+PP
+0 sg
+2378 1280 mt 2405 1146 L
+2405 1146 mt 2679 1151 L
+c19
+-15 -119 274 5 2405 1146 3 MP
+PP
+0 sg
+2405 1146 mt 2679 1151 L
+2679 1151 mt 2664 1032 L
+c26
+0 0 -79 -30 2668 797 3 MP
+PP
+0 sg
+2668  797 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+-79 -30 59 -1 2609 798 3 MP
+PP
+0 sg
+2609  798 mt 2668  797 L
+2668  797 mt 2589  767 L
+2589  767 mt 2609  798 L
+c25
+59 -1 -19 -55 2628 853 3 MP
+PP
+0 sg
+2628  853 mt 2609  798 L
+2609  798 mt 2668  797 L
+c17
+-266 4 13 -111 2486 1095 3 MP
+PP
+0 sg
+2486 1095 mt 2499  984 L
+2499  984 mt 2233  988 L
+c21
+-17 -100 228 4 2436 1028 3 MP
+PP
+0 sg
+2436 1028 mt 2664 1032 L
+2664 1032 mt 2647  932 L
+c17
+51 -111 -304 4 2486 1095 3 MP
+PP
+0 sg
+2486 1095 mt 2182 1099 L
+2182 1099 mt 2233  988 L
+c19
+228 4 31 -118 2405 1146 3 MP
+PP
+0 sg
+2405 1146 mt 2436 1028 L
+2436 1028 mt 2664 1032 L
+c24
+-77 -55 -59 1 2569 2789 3 MP
+PP
+0 sg
+2569 2789 mt 2510 2790 L
+2510 2790 mt 2433 2735 L
+c24
+-117 1 -19 -55 2569 2789 3 MP
+PP
+0 sg
+2569 2789 mt 2550 2734 L
+2550 2734 mt 2433 2735 L
+c20
+228 3 -35 -69 2471 2759 3 MP
+PP
+0 sg
+2471 2759 mt 2436 2690 L
+2436 2690 mt 2664 2693 L
+c24
+-19 -55 -61 -1 2630 2790 3 MP
+PP
+0 sg
+2630 2790 mt 2569 2789 L
+2569 2789 mt 2550 2734 L
+c20
+17 -69 176 3 2471 2759 3 MP
+PP
+0 sg
+2471 2759 mt 2647 2762 L
+2647 2762 mt 2664 2693 L
+c24
+-100 5 -77 -55 2510 2790 3 MP
+PP
+0 sg
+2510 2790 mt 2433 2735 L
+2433 2735 mt 2333 2740 L
+c24
+-126 -52 -51 2 2510 2790 3 MP
+PP
+0 sg
+2510 2790 mt 2459 2792 L
+2459 2792 mt 2333 2740 L
+c24
+-38 5 -130 -28 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2459 2792 L
+2459 2792 mt 2421 2797 L
+2421 2797 mt 2589 2820 L
+c24
+-51 2 -79 -30 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2510 2790 L
+2510 2790 mt 2459 2792 L
+2459 2792 mt 2589 2820 L
+c24
+-130 -28 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2459 2792 L
+c24
+-59 1 -20 -31 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2569 2789 L
+2569 2789 mt 2510 2790 L
+2510 2790 mt 2589 2820 L
+c24
+-79 -30 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2510 2790 L
+c22
+176 3 -38 -45 2509 2804 3 MP
+PP
+0 sg
+2509 2804 mt 2471 2759 L
+2471 2759 mt 2647 2762 L
+c19
+60 -91 -266 4 2499 984 3 MP
+PP
+0 sg
+2499  984 mt 2233  988 L
+2233  988 mt 2293  897 L
+c19
+-221 3 15 -90 2499 984 3 MP
+PP
+0 sg
+2499  984 mt 2514  894 L
+2514  894 mt 2293  897 L
+c21
+176 3 35 -99 2436 1028 3 MP
+PP
+0 sg
+2436 1028 mt 2471  929 L
+2471  929 mt 2647  932 L
+c24
+-20 -31 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2569 2789 L
+c24
+-61 -1 41 -30 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2630 2790 L
+2630 2790 mt 2569 2789 L
+2569 2789 mt 2589 2820 L
+c24
+41 -30 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2630 2790 L
+c22
+19 -44 119 2 2509 2804 3 MP
+PP
+0 sg
+2509 2804 mt 2628 2806 L
+2628 2806 mt 2647 2762 L
+c23
+-19 -79 176 3 2471 929 3 MP
+PP
+0 sg
+2471  929 mt 2647  932 L
+2647  932 mt 2628  853 L
+c26
+0 0 -41 5 2630 762 3 MP
+PP
+0 sg
+2630  762 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+20 6 -61 -1 2630 762 3 MP
+PP
+0 sg
+2630  762 mt 2569  761 L
+2569  761 mt 2589  767 L
+2589  767 mt 2630  762 L
+c21
+-171 3 17 -69 2514 894 3 MP
+PP
+0 sg
+2514  894 mt 2531  825 L
+2531  825 mt 2360  828 L
+c25
+-19 -55 119 1 2509 852 3 MP
+PP
+0 sg
+2509  852 mt 2628  853 L
+2628  853 mt 2609  798 L
+c24
+-3 5 -190 -18 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2399 2802 L
+2399 2802 mt 2396 2807 L
+2396 2807 mt 2589 2820 L
+c24
+-22 5 -168 -23 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2421 2797 L
+2421 2797 mt 2399 2802 L
+2399 2802 mt 2589 2820 L
+c24
+-190 -18 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2399 2802 L
+c24
+-168 -23 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2421 2797 L
+c24
+56 3 -97 2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2492 2822 L
+2492 2822 mt 2548 2825 L
+2548 2825 mt 2589 2820 L
+c24
+-41 5 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2548 2825 L
+c24
+-193 -13 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2396 2807 L
+c24
+48 4 -145 -2 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2444 2818 L
+2444 2818 mt 2492 2822 L
+2492 2822 mt 2589 2820 L
+c24
+-97 2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2492 2822 L
+c24
+33 5 -178 -7 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2411 2813 L
+2411 2813 mt 2444 2818 L
+2444 2818 mt 2589 2820 L
+c24
+-145 -2 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2444 2818 L
+c24
+15 6 -193 -13 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2396 2807 L
+2396 2807 mt 2411 2813 L
+2411 2813 mt 2589 2820 L
+c24
+-178 -7 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2411 2813 L
+c24
+61 1 -41 5 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2548 2825 L
+2548 2825 mt 2609 2826 L
+2609 2826 mt 2589 2820 L
+c24
+20 6 0 0 2589 2820 3 MP
+PP
+0 sg
+2589 2820 mt 2589 2820 L
+2589 2820 mt 2609 2826 L
+c24
+19 -20 61 1 2548 2825 3 MP
+PP
+0 sg
+2548 2825 mt 2609 2826 L
+2609 2826 mt 2628 2806 L
+c24
+119 2 -39 -21 2548 2825 3 MP
+PP
+0 sg
+2548 2825 mt 2509 2804 L
+2509 2804 mt 2628 2806 L
+c21
+67 -69 -221 3 2514 894 3 MP
+PP
+0 sg
+2514  894 mt 2293  897 L
+2293  897 mt 2360  828 L
+c23
+119 1 38 -77 2471 929 3 MP
+PP
+0 sg
+2471  929 mt 2509  852 L
+2509  852 mt 2628  853 L
+c26
+-20 -31 61 1 2548 797 3 MP
+PP
+0 sg
+2548  797 mt 2609  798 L
+2609  798 mt 2589  767 L
+2589  767 mt 2548  797 L
+c26
+0 0 -20 -31 2609 798 3 MP
+PP
+0 sg
+2609  798 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+73 -46 -171 3 2531 825 3 MP
+PP
+0 sg
+2531  825 mt 2360  828 L
+2360  828 mt 2433  782 L
+c23
+-117 1 19 -44 2531 825 3 MP
+PP
+0 sg
+2531  825 mt 2550  781 L
+2550  781 mt 2433  782 L
+c25
+61 1 39 -55 2509 852 3 MP
+PP
+0 sg
+2509  852 mt 2548  797 L
+2548  797 mt 2609  798 L
+c25
+-38 4 126 -23 2333 788 3 MP
+PP
+0 sg
+2333  788 mt 2459  765 L
+2459  765 mt 2421  769 L
+c25
+126 -23 -100 6 2433 782 3 MP
+PP
+0 sg
+2433  782 mt 2333  788 L
+2333  788 mt 2459  765 L
+c25
+-51 3 77 -20 2433 782 3 MP
+PP
+0 sg
+2433  782 mt 2510  762 L
+2510  762 mt 2459  765 L
+c25
+77 -20 -117 1 2550 781 3 MP
+PP
+0 sg
+2550  781 mt 2433  782 L
+2433  782 mt 2510  762 L
+c25
+-59 1 19 -20 2550 781 3 MP
+PP
+0 sg
+2550  781 mt 2569  761 L
+2569  761 mt 2510  762 L
+c26
+193 -12 -3 5 2399 774 3 MP
+PP
+0 sg
+2399  774 mt 2396  779 L
+2396  779 mt 2589  767 L
+2589  767 mt 2399  774 L
+c26
+0 0 190 -7 2399 774 3 MP
+PP
+0 sg
+2399  774 mt 2589  767 L
+2589  767 mt 2589  767 L
+c23
+-100 6 73 -46 2360 828 3 MP
+PP
+0 sg
+2360  828 mt 2433  782 L
+2433  782 mt 2333  788 L
+c26
+178 -18 15 6 2396 779 3 MP
+PP
+0 sg
+2396  779 mt 2411  785 L
+2411  785 mt 2589  767 L
+2589  767 mt 2396  779 L
+c26
+0 0 193 -12 2396 779 3 MP
+PP
+0 sg
+2396  779 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+0 0 178 -18 2411 785 3 MP
+PP
+0 sg
+2411  785 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+97 -27 48 4 2444 790 3 MP
+PP
+0 sg
+2444  790 mt 2492  794 L
+2492  794 mt 2589  767 L
+2589  767 mt 2444  790 L
+c26
+0 0 145 -23 2444 790 3 MP
+PP
+0 sg
+2444  790 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+41 -30 56 3 2492 794 3 MP
+PP
+0 sg
+2492  794 mt 2548  797 L
+2548  797 mt 2589  767 L
+2589  767 mt 2492  794 L
+c26
+0 0 97 -27 2492 794 3 MP
+PP
+0 sg
+2492  794 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+0 0 41 -30 2548 797 3 MP
+PP
+0 sg
+2548  797 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+79 5 -59 1 2569 761 3 MP
+PP
+0 sg
+2569  761 mt 2510  762 L
+2510  762 mt 2589  767 L
+2589  767 mt 2569  761 L
+c26
+0 0 20 6 2569 761 3 MP
+PP
+0 sg
+2569  761 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+130 2 -51 3 2510 762 3 MP
+PP
+0 sg
+2510  762 mt 2459  765 L
+2459  765 mt 2589  767 L
+2589  767 mt 2510  762 L
+c26
+0 0 79 5 2510 762 3 MP
+PP
+0 sg
+2510  762 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+168 -2 -38 4 2459 765 3 MP
+PP
+0 sg
+2459  765 mt 2421  769 L
+2421  769 mt 2589  767 L
+2589  767 mt 2459  765 L
+c26
+0 0 130 2 2459 765 3 MP
+PP
+0 sg
+2459  765 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+190 -7 -22 5 2421 769 3 MP
+PP
+0 sg
+2421  769 mt 2399  774 L
+2399  774 mt 2589  767 L
+2589  767 mt 2421  769 L
+c26
+0 0 168 -2 2421 769 3 MP
+PP
+0 sg
+2421  769 mt 2589  767 L
+2589  767 mt 2589  767 L
+c26
+145 -23 33 5 2411 785 3 MP
+PP
+0 sg
+2411  785 mt 2444  790 L
+2444  790 mt 2589  767 L
+2589  767 mt 2411  785 L
+c25
+39 -55 113 6 2396 846 3 MP
+PP
+0 sg
+2396  846 mt 2509  852 L
+2509  852 mt 2548  797 L
+c25
+56 3 96 -52 2396 846 3 MP
+PP
+0 sg
+2396  846 mt 2492  794 L
+2492  794 mt 2548  797 L
+c24
+-39 -21 56 3 2492 2822 3 MP
+PP
+0 sg
+2492 2822 mt 2548 2825 L
+2548 2825 mt 2509 2804 L
+gr
+
+24 W
+1 sg
+2537 1175 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2536 1368 PD
+gs 655 283 3870 3023 rc
+c24
+-185 -44 -22 5 2421 2797 3 MP
+PP
+0 sg
+2421 2797 mt 2399 2802 L
+2399 2802 mt 2214 2758 L
+c24
+-43 10 -164 -49 2421 2797 3 MP
+PP
+0 sg
+2421 2797 mt 2257 2748 L
+2257 2748 mt 2214 2758 L
+c24
+-76 8 -126 -52 2459 2792 3 MP
+PP
+0 sg
+2459 2792 mt 2333 2740 L
+2333 2740 mt 2257 2748 L
+c24
+-164 -49 -38 5 2459 2792 3 MP
+PP
+0 sg
+2459 2792 mt 2421 2797 L
+2421 2797 mt 2257 2748 L
+c22
+-38 -45 113 5 2396 2799 3 MP
+PP
+0 sg
+2396 2799 mt 2509 2804 L
+2509 2804 mt 2471 2759 L
+c23
+38 -77 165 7 2306 922 3 MP
+PP
+0 sg
+2306  922 mt 2471  929 L
+2471  929 mt 2509  852 L
+c23
+113 6 90 -76 2306 922 3 MP
+PP
+0 sg
+2306  922 mt 2396  846 L
+2396  846 mt 2509  852 L
+c24
+113 5 -96 -23 2492 2822 3 MP
+PP
+0 sg
+2492 2822 mt 2396 2799 L
+2396 2799 mt 2509 2804 L
+gr
+
+0 sg
+24 W
+1 sg
+2499 1242 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2494 1130 PD
+gs 655 283 3870 3023 rc
+c21
+-148 7 67 -69 2293 897 3 MP
+PP
+0 sg
+2293  897 mt 2360  828 L
+2360  828 mt 2212  835 L
+c23
+121 -47 -148 7 2360 828 3 MP
+PP
+0 sg
+2360  828 mt 2212  835 L
+2212  835 mt 2333  788 L
+c25
+96 -52 93 8 2303 838 3 MP
+PP
+0 sg
+2303  838 mt 2396  846 L
+2396  846 mt 2492  794 L
+c25
+48 4 141 -48 2303 838 3 MP
+PP
+0 sg
+2303  838 mt 2444  790 L
+2444  790 mt 2492  794 L
+c24
+-96 -23 48 4 2444 2818 3 MP
+PP
+0 sg
+2444 2818 mt 2492 2822 L
+2492 2822 mt 2396 2799 L
+gr
+
+0 sg
+24 W
+1 sg
+2486 1310 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2473 1335 PD
+gs 655 283 3870 3023 rc
+c21
+35 -99 213 10 2223 1018 3 MP
+PP
+0 sg
+2223 1018 mt 2436 1028 L
+2436 1028 mt 2471  929 L
+c22
+165 8 -90 -48 2396 2799 3 MP
+PP
+0 sg
+2396 2799 mt 2306 2751 L
+2306 2751 mt 2471 2759 L
+c22
+-111 11 -121 -75 2333 2740 3 MP
+PP
+0 sg
+2333 2740 mt 2212 2665 L
+2212 2665 mt 2101 2676 L
+c22
+-156 -72 -76 8 2333 2740 3 MP
+PP
+0 sg
+2333 2740 mt 2257 2748 L
+2257 2748 mt 2101 2676 L
+c22
+-148 8 -73 -78 2433 2735 3 MP
+PP
+0 sg
+2433 2735 mt 2360 2657 L
+2360 2657 mt 2212 2665 L
+c22
+-121 -75 -100 5 2433 2735 3 MP
+PP
+0 sg
+2433 2735 mt 2333 2740 L
+2333 2740 mt 2212 2665 L
+c20
+-35 -69 165 8 2306 2751 3 MP
+PP
+0 sg
+2306 2751 mt 2471 2759 L
+2471 2759 mt 2436 2690 L
+c21
+165 7 83 -96 2223 1018 3 MP
+PP
+0 sg
+2223 1018 mt 2306  922 L
+2306  922 mt 2471  929 L
+gr
+
+0 sg
+24 W
+1 sg
+2469 1460 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2468 1452 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2455 1166 PD
+gs 655 283 3870 3023 rc
+c25
+141 -48 65 10 2238 828 3 MP
+PP
+0 sg
+2238  828 mt 2303  838 L
+2303  838 mt 2444  790 L
+c25
+33 5 173 -43 2238 828 3 MP
+PP
+0 sg
+2238  828 mt 2411  785 L
+2411  785 mt 2444  790 L
+c24
+31 11 -189 -37 2396 2807 3 MP
+PP
+0 sg
+2396 2807 mt 2207 2770 L
+2207 2770 mt 2238 2781 L
+c24
+-173 -32 15 6 2396 2807 3 MP
+PP
+0 sg
+2396 2807 mt 2411 2813 L
+2411 2813 mt 2238 2781 L
+c24
+-141 -27 33 5 2411 2813 3 MP
+PP
+0 sg
+2411 2813 mt 2444 2818 L
+2444 2818 mt 2303 2791 L
+c24
+-189 -37 -3 5 2399 2802 3 MP
+PP
+0 sg
+2399 2802 mt 2396 2807 L
+2396 2807 mt 2207 2770 L
+c24
+-7 12 -185 -44 2399 2802 3 MP
+PP
+0 sg
+2399 2802 mt 2214 2758 L
+2214 2758 mt 2207 2770 L
+c24
+93 8 -141 -27 2444 2818 3 MP
+PP
+0 sg
+2444 2818 mt 2303 2791 L
+2303 2791 mt 2396 2799 L
+c20
+213 10 -83 -71 2306 2751 3 MP
+PP
+0 sg
+2306 2751 mt 2223 2680 L
+2223 2680 mt 2436 2690 L
+c20
+-192 10 -67 -99 2360 2657 3 MP
+PP
+0 sg
+2360 2657 mt 2293 2558 L
+2293 2558 mt 2101 2568 L
+c20
+-111 -97 -148 8 2360 2657 3 MP
+PP
+0 sg
+2360 2657 mt 2212 2665 L
+2212 2665 mt 2101 2568 L
+c18
+-31 -92 213 10 2223 2680 3 MP
+PP
+0 sg
+2223 2680 mt 2436 2690 L
+2436 2690 mt 2405 2598 L
+c15
+-264 14 42 -129 2140 1228 3 MP
+PP
+0 sg
+2140 1228 mt 2182 1099 L
+2182 1099 mt 1918 1113 L
+c19
+31 -118 257 12 2148 1134 3 MP
+PP
+0 sg
+2148 1134 mt 2405 1146 L
+2405 1146 mt 2436 1028 L
+c17
+84 -113 -264 14 2182 1099 3 MP
+PP
+0 sg
+2182 1099 mt 1918 1113 L
+1918 1113 mt 2002 1000 L
+c17
+-231 12 51 -111 2182 1099 3 MP
+PP
+0 sg
+2182 1099 mt 2233  988 L
+2233  988 mt 2002 1000 L
+c19
+213 10 75 -116 2148 1134 3 MP
+PP
+0 sg
+2148 1134 mt 2223 1018 L
+2223 1018 mt 2436 1028 L
+gr
+
+0 sg
+24 W
+1 sg
+2433 1138 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2423 1068 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2422 1192 PD
+gs 655 283 3870 3023 rc
+c25
+164 -27 -76 8 2333 788 3 MP
+PP
+0 sg
+2333  788 mt 2257  796 L
+2257  796 mt 2421  769 L
+c25
+-22 5 164 -27 2257 796 3 MP
+PP
+0 sg
+2257  796 mt 2421  769 L
+2421  769 mt 2399  774 L
+gr
+
+0 sg
+24 W
+1 sg
+2417 1377 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2416 1137 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2412 1295 PD
+gs 655 283 3870 3023 rc
+c23
+156 -51 -111 12 2212 835 3 MP
+PP
+0 sg
+2212  835 mt 2101  847 L
+2101  847 mt 2257  796 L
+c23
+-76 8 121 -47 2212 835 3 MP
+PP
+0 sg
+2212  835 mt 2333  788 L
+2333  788 mt 2257  796 L
+c25
+173 -43 31 11 2207 817 3 MP
+PP
+0 sg
+2207  817 mt 2238  828 L
+2238  828 mt 2411  785 L
+c25
+15 6 189 -38 2207 817 3 MP
+PP
+0 sg
+2207  817 mt 2396  779 L
+2396  779 mt 2411  785 L
+c24
+65 10 -173 -32 2411 2813 3 MP
+PP
+0 sg
+2411 2813 mt 2238 2781 L
+2238 2781 mt 2303 2791 L
+c18
+-99 -116 -192 10 2293 2558 3 MP
+PP
+0 sg
+2293 2558 mt 2101 2568 L
+2101 2568 mt 2002 2452 L
+c18
+-231 12 -60 -118 2293 2558 3 MP
+PP
+0 sg
+2293 2558 mt 2233 2440 L
+2233 2440 mt 2002 2452 L
+c16
+-27 -111 257 12 2148 2586 3 MP
+PP
+0 sg
+2148 2586 mt 2405 2598 L
+2405 2598 mt 2378 2487 L
+c20
+-144 -93 -111 11 2212 2665 3 MP
+PP
+0 sg
+2212 2665 mt 2101 2676 L
+2101 2676 mt 1957 2583 L
+c20
+-144 15 -111 -97 2212 2665 3 MP
+PP
+0 sg
+2212 2665 mt 2101 2568 L
+2101 2568 mt 1957 2583 L
+c18
+257 12 -75 -94 2223 2680 3 MP
+PP
+0 sg
+2223 2680 mt 2148 2586 L
+2148 2586 mt 2405 2598 L
+c13
+-290 14 30 -142 2110 1370 3 MP
+PP
+0 sg
+2110 1370 mt 2140 1228 L
+2140 1228 mt 1850 1242 L
+c15
+68 -129 -290 14 2140 1228 3 MP
+PP
+0 sg
+2140 1228 mt 1850 1242 L
+1850 1242 mt 1918 1113 L
+c17
+257 12 63 -133 2085 1267 3 MP
+PP
+0 sg
+2085 1267 mt 2148 1134 L
+2148 1134 mt 2405 1146 L
+c17
+27 -134 293 13 2085 1267 3 MP
+PP
+0 sg
+2085 1267 mt 2378 1280 L
+2378 1280 mt 2405 1146 L
+gr
+
+0 sg
+24 W
+1 sg
+2402 1483 PD
+gs 655 283 3870 3023 rc
+c23
+-43 10 156 -51 2101 847 3 MP
+PP
+0 sg
+2101  847 mt 2257  796 L
+2257  796 mt 2214  806 L
+c25
+-3 5 185 -32 2214 806 3 MP
+PP
+0 sg
+2214  806 mt 2399  774 L
+2399  774 mt 2396  779 L
+c25
+185 -32 -43 10 2257 796 3 MP
+PP
+0 sg
+2257  796 mt 2214  806 L
+2214  806 mt 2399  774 L
+c21
+111 -72 -192 10 2293 897 3 MP
+PP
+0 sg
+2293  897 mt 2101  907 L
+2101  907 mt 2212  835 L
+c19
+-192 10 60 -91 2233 988 3 MP
+PP
+0 sg
+2233  988 mt 2293  897 L
+2293  897 mt 2101  907 L
+c23
+93 8 134 -72 2169 910 3 MP
+PP
+0 sg
+2169  910 mt 2303  838 L
+2303  838 mt 2396  846 L
+c23
+90 -76 137 12 2169 910 3 MP
+PP
+0 sg
+2169  910 mt 2306  922 L
+2306  922 mt 2396  846 L
+c22
+-90 -48 93 8 2303 2791 3 MP
+PP
+0 sg
+2303 2791 mt 2396 2799 L
+2396 2799 mt 2306 2751 L
+c25
+189 -38 -7 11 2214 806 3 MP
+PP
+0 sg
+2214  806 mt 2207  817 L
+2207  817 mt 2396  779 L
+gr
+
+0 sg
+24 W
+1 sg
+2395 1533 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2380 1458 PD
+gs 655 283 3870 3023 rc
+c12
+-310 15 18 -152 2092 1522 3 MP
+PP
+0 sg
+2092 1522 mt 2110 1370 L
+2110 1370 mt 1800 1385 L
+c13
+50 -143 -310 15 2110 1370 3 MP
+PP
+0 sg
+2110 1370 mt 1800 1385 L
+1800 1385 mt 1850 1242 L
+c15
+293 13 51 -145 2034 1412 3 MP
+PP
+0 sg
+2034 1412 mt 2085 1267 L
+2085 1267 mt 2378 1280 L
+c15
+21 -147 323 15 2034 1412 3 MP
+PP
+0 sg
+2034 1412 mt 2357 1427 L
+2357 1427 mt 2378 1280 L
+c16
+293 14 -63 -113 2148 2586 3 MP
+PP
+0 sg
+2148 2586 mt 2085 2473 L
+2085 2473 mt 2378 2487 L
+c16
+-84 -133 -231 12 2233 2440 3 MP
+PP
+0 sg
+2233 2440 mt 2002 2452 L
+2002 2452 mt 1918 2319 L
+c16
+-264 13 -51 -134 2233 2440 3 MP
+PP
+0 sg
+2233 2440 mt 2182 2306 L
+2182 2306 mt 1918 2319 L
+c14
+-21 -128 293 14 2085 2473 3 MP
+PP
+0 sg
+2085 2473 mt 2378 2487 L
+2378 2487 mt 2357 2359 L
+gr
+
+0 sg
+24 W
+1 sg
+2377 1363 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2371 1171 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2363 1468 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2362 1090 PD
+gs 655 283 3870 3023 rc
+c14
+323 15 -51 -129 2085 2473 3 MP
+PP
+0 sg
+2085 2473 mt 2034 2344 L
+2034 2344 mt 2357 2359 L
+c14
+-290 14 -42 -146 2182 2306 3 MP
+PP
+0 sg
+2182 2306 mt 2140 2160 L
+2140 2160 mt 1850 2174 L
+c14
+-68 -145 -264 13 2182 2306 3 MP
+PP
+0 sg
+2182 2306 mt 1918 2319 L
+1918 2319 mt 1850 2174 L
+c11
+-16 -142 323 15 2034 2344 3 MP
+PP
+0 sg
+2034 2344 mt 2357 2359 L
+2357 2359 mt 2341 2217 L
+c8
+-323 16 6 -159 2086 1681 3 MP
+PP
+0 sg
+2086 1681 mt 2092 1522 L
+2092 1522 mt 1769 1538 L
+c13
+16 -155 345 16 1996 1566 3 MP
+PP
+0 sg
+1996 1566 mt 2341 1582 L
+2341 1582 mt 2357 1427 L
+c12
+31 -153 -323 16 2092 1522 3 MP
+PP
+0 sg
+2092 1522 mt 1769 1538 L
+1769 1538 mt 1800 1385 L
+c13
+323 15 38 -154 1996 1566 3 MP
+PP
+0 sg
+1996 1566 mt 2034 1412 L
+2034 1412 mt 2357 1427 L
+gr
+
+0 sg
+24 W
+1 sg
+2352 1286 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2349 1525 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2343 1285 PD
+gs 655 283 3870 3023 rc
+c8
+10 -160 -327 17 2086 1681 3 MP
+PP
+0 sg
+2086 1681 mt 1759 1698 L
+1759 1698 mt 1769 1538 L
+c9
+-327 17 -6 -162 2092 1843 3 MP
+PP
+0 sg
+2092 1843 mt 2086 1681 L
+2086 1681 mt 1759 1698 L
+c12
+345 16 22 -160 1974 1726 3 MP
+PP
+0 sg
+1974 1726 mt 1996 1566 L
+1996 1566 mt 2341 1582 L
+c11
+345 16 -38 -143 2034 2344 3 MP
+PP
+0 sg
+2034 2344 mt 1996 2201 L
+1996 2201 mt 2341 2217 L
+c12
+9 -161 358 17 1974 1726 3 MP
+PP
+0 sg
+1974 1726 mt 2332 1743 L
+2332 1743 mt 2341 1582 L
+c11
+-310 16 -30 -156 2140 2160 3 MP
+PP
+0 sg
+2140 2160 mt 2110 2004 L
+2110 2004 mt 1800 2020 L
+c11
+-50 -154 -290 14 2140 2160 3 MP
+PP
+0 sg
+2140 2160 mt 1850 2174 L
+1850 2174 mt 1800 2020 L
+c10
+-9 -153 345 16 1996 2201 3 MP
+PP
+0 sg
+1996 2201 mt 2341 2217 L
+2341 2217 mt 2332 2064 L
+gr
+
+0 sg
+24 W
+1 sg
+2336 1394 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2334 1123 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2334 1344 PD
+gs 655 283 3870 3023 rc
+c10
+-323 17 -18 -161 2110 2004 3 MP
+PP
+0 sg
+2110 2004 mt 2092 1843 L
+2092 1843 mt 1769 1860 L
+c10
+-31 -160 -310 16 2110 2004 3 MP
+PP
+0 sg
+2110 2004 mt 1800 2020 L
+1800 2020 mt 1769 1860 L
+c9
+-3 -159 358 17 1974 2047 3 MP
+PP
+0 sg
+1974 2047 mt 2332 2064 L
+2332 2064 mt 2329 1905 L
+c10
+358 17 -22 -154 1996 2201 3 MP
+PP
+0 sg
+1996 2201 mt 1974 2047 L
+1974 2047 mt 2332 2064 L
+c9
+-10 -162 -323 17 2092 1843 3 MP
+PP
+0 sg
+2092 1843 mt 1769 1860 L
+1769 1860 mt 1759 1698 L
+c8
+3 -162 363 17 1966 1888 3 MP
+PP
+0 sg
+1966 1888 mt 2329 1905 L
+2329 1905 mt 2332 1743 L
+c8
+358 17 8 -162 1966 1888 3 MP
+PP
+0 sg
+1966 1888 mt 1974 1726 L
+1974 1726 mt 2332 1743 L
+c9
+363 17 -8 -159 1974 2047 3 MP
+PP
+0 sg
+1974 2047 mt 1966 1888 L
+1966 1888 mt 2329 1905 L
+gr
+
+0 sg
+24 W
+1 sg
+2319 1083 PD
+gs 655 283 3870 3023 rc
+c19
+99 -93 -231 12 2233 988 3 MP
+PP
+0 sg
+2233  988 mt 2002 1000 L
+2002 1000 mt 2101  907 L
+c21
+83 -96 178 15 2045 1003 3 MP
+PP
+0 sg
+2045 1003 mt 2223 1018 L
+2223 1018 mt 2306  922 L
+c21
+137 12 124 -93 2045 1003 3 MP
+PP
+0 sg
+2045 1003 mt 2169  910 L
+2169  910 mt 2306  922 L
+c22
+-64 15 -156 -72 2257 2748 3 MP
+PP
+0 sg
+2257 2748 mt 2101 2676 L
+2101 2676 mt 2037 2691 L
+c22
+-177 -67 -43 10 2257 2748 3 MP
+PP
+0 sg
+2257 2748 mt 2214 2758 L
+2214 2758 mt 2037 2691 L
+c22
+137 12 -134 -52 2303 2791 3 MP
+PP
+0 sg
+2303 2791 mt 2169 2739 L
+2169 2739 mt 2306 2751 L
+c20
+-83 -71 137 12 2169 2739 3 MP
+PP
+0 sg
+2169 2739 mt 2306 2751 L
+2306 2751 mt 2223 2680 L
+c21
+144 -75 -144 15 2101 907 3 MP
+PP
+0 sg
+2101  907 mt 1957  922 L
+1957  922 mt 2101  847 L
+c21
+-111 12 111 -72 2101 907 3 MP
+PP
+0 sg
+2101  907 mt 2212  835 L
+2212  835 mt 2101  847 L
+c23
+134 -72 96 15 2073 895 3 MP
+PP
+0 sg
+2073  895 mt 2169  910 L
+2169  910 mt 2303  838 L
+c22
+-9 17 -177 -67 2214 2758 3 MP
+PP
+0 sg
+2214 2758 mt 2037 2691 L
+2037 2691 mt 2028 2708 L
+c22
+-179 -62 -7 12 2214 2758 3 MP
+PP
+0 sg
+2214 2758 mt 2207 2770 L
+2207 2770 mt 2028 2708 L
+c22
+-134 -52 65 10 2238 2781 3 MP
+PP
+0 sg
+2238 2781 mt 2303 2791 L
+2303 2791 mt 2169 2739 L
+c23
+65 10 165 -67 2073 895 3 MP
+PP
+0 sg
+2073  895 mt 2238  828 L
+2238  828 mt 2303  838 L
+gr
+
+0 sg
+24 W
+1 sg
+2296 1466 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2296 1226 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2283 1362 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2282 1224 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2278 1568 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2277 1304 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2277 1508 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2276 1112 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2275 1509 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2275 1469 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2266 1343 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2255 1272 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2254 1571 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2246 1094 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2240 1103 PD
+gs 655 283 3870 3023 rc
+c21
+-64 15 144 -75 1957 922 3 MP
+PP
+0 sg
+1957  922 mt 2101  847 L
+2101  847 mt 2037  862 L
+c23
+165 -67 45 17 2028 878 3 MP
+PP
+0 sg
+2028  878 mt 2073  895 L
+2073  895 mt 2238  828 L
+c22
+45 16 -179 -62 2207 2770 3 MP
+PP
+0 sg
+2207 2770 mt 2028 2708 L
+2028 2708 mt 2073 2724 L
+c22
+-165 -57 31 11 2207 2770 3 MP
+PP
+0 sg
+2207 2770 mt 2238 2781 L
+2238 2781 mt 2073 2724 L
+c22
+96 15 -165 -57 2238 2781 3 MP
+PP
+0 sg
+2238 2781 mt 2073 2724 L
+2073 2724 mt 2169 2739 L
+c23
+31 11 179 -61 2028 878 3 MP
+PP
+0 sg
+2028  878 mt 2207  817 L
+2207  817 mt 2238  828 L
+gr
+
+0 sg
+24 W
+1 sg
+2236 1229 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2231 1383 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2230 1121 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2229 1442 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2228 1318 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2223 1194 PD
+gs 655 283 3870 3023 rc
+c20
+-82 19 -144 -93 2101 2676 3 MP
+PP
+0 sg
+2101 2676 mt 1957 2583 L
+1957 2583 mt 1875 2602 L
+c20
+-162 -89 -64 15 2101 2676 3 MP
+PP
+0 sg
+2101 2676 mt 2037 2691 L
+2037 2691 mt 1875 2602 L
+c18
+-75 -94 178 16 2045 2664 3 MP
+PP
+0 sg
+2045 2664 mt 2223 2680 L
+2223 2680 mt 2148 2586 L
+c19
+178 15 110 -113 1935 1116 3 MP
+PP
+0 sg
+1935 1116 mt 2045 1003 L
+2045 1003 mt 2223 1018 L
+c19
+75 -116 213 18 1935 1116 3 MP
+PP
+0 sg
+1935 1116 mt 2148 1134 L
+2148 1134 mt 2223 1018 L
+c20
+178 16 -124 -75 2169 2739 3 MP
+PP
+0 sg
+2169 2739 mt 2045 2664 L
+2045 2664 mt 2223 2680 L
+c23
+177 -56 -64 15 2101 847 3 MP
+PP
+0 sg
+2101  847 mt 2037  862 L
+2037  862 mt 2214  806 L
+c23
+-7 11 177 -56 2037 862 3 MP
+PP
+0 sg
+2037  862 mt 2214  806 L
+2214  806 mt 2207  817 L
+gr
+
+0 sg
+24 W
+1 sg
+2208 1555 PD
+gs 655 283 3870 3023 rc
+c23
+179 -61 -9 16 2037 862 3 MP
+PP
+0 sg
+2037  862 mt 2028  878 L
+2028  878 mt 2207  817 L
+gr
+
+0 sg
+24 W
+1 sg
+2198 1227 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2198 1472 PD
+gs 655 283 3870 3023 rc
+c19
+128 -96 -173 18 2002 1000 3 MP
+PP
+0 sg
+2002 1000 mt 1829 1018 L
+1829 1018 mt 1957  922 L
+c19
+-144 15 99 -93 2002 1000 3 MP
+PP
+0 sg
+2002 1000 mt 2101  907 L
+2101  907 mt 1957  922 L
+c21
+124 -93 124 19 1921 984 3 MP
+PP
+0 sg
+1921  984 mt 2045 1003 L
+2045 1003 mt 2169  910 L
+c21
+96 15 152 -89 1921 984 3 MP
+PP
+0 sg
+1921  984 mt 2073  895 L
+2073  895 mt 2169  910 L
+c20
+-124 -75 96 15 2073 2724 3 MP
+PP
+0 sg
+2073 2724 mt 2169 2739 L
+2169 2739 mt 2045 2664 L
+gr
+
+0 sg
+24 W
+1 sg
+2156 1272 PD
+gs 655 283 3870 3023 rc
+c13
+-219 23 50 -143 1800 1385 3 MP
+PP
+0 sg
+1800 1385 mt 1850 1242 L
+1850 1242 mt 1631 1265 L
+c15
+88 -132 -219 23 1850 1242 3 MP
+PP
+0 sg
+1850 1242 mt 1631 1265 L
+1631 1265 mt 1719 1133 L
+c15
+-199 20 68 -129 1850 1242 3 MP
+PP
+0 sg
+1850 1242 mt 1918 1113 L
+1918 1113 mt 1719 1133 L
+c17
+213 18 94 -129 1841 1245 3 MP
+PP
+0 sg
+1841 1245 mt 1935 1116 L
+1935 1116 mt 2148 1134 L
+c17
+63 -133 244 22 1841 1245 3 MP
+PP
+0 sg
+1841 1245 mt 2085 1267 L
+2085 1267 mt 2148 1134 L
+c18
+-99 23 -128 -113 1957 2583 3 MP
+PP
+0 sg
+1957 2583 mt 1829 2470 L
+1829 2470 mt 1730 2493 L
+c18
+-128 -113 -144 15 2101 2568 3 MP
+PP
+0 sg
+2101 2568 mt 1957 2583 L
+1957 2583 mt 1829 2470 L
+c18
+-173 18 -99 -116 2101 2568 3 MP
+PP
+0 sg
+2101 2568 mt 2002 2452 L
+2002 2452 mt 1829 2470 L
+c16
+-63 -113 213 18 1935 2568 3 MP
+PP
+0 sg
+1935 2568 mt 2148 2586 L
+2148 2586 mt 2085 2473 L
+c18
+-145 -109 -82 19 1957 2583 3 MP
+PP
+0 sg
+1957 2583 mt 1875 2602 L
+1875 2602 mt 1730 2493 L
+c18
+213 18 -110 -96 2045 2664 3 MP
+PP
+0 sg
+2045 2664 mt 1935 2568 L
+1935 2568 mt 2148 2586 L
+gr
+
+0 sg
+24 W
+1 sg
+2147 1174 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2145 1460 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2144 1415 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2139 1245 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2133 1357 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2119 1506 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2104 1104 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2088 1296 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2085 1566 PD
+gs 655 283 3870 3023 rc
+c13
+64 -145 -233 25 1800 1385 3 MP
+PP
+0 sg
+1800 1385 mt 1567 1410 L
+1567 1410 mt 1631 1265 L
+c15
+244 22 76 -143 1765 1388 3 MP
+PP
+0 sg
+1765 1388 mt 1841 1245 L
+1841 1245 mt 2085 1267 L
+c16
+-110 -130 -173 18 2002 2452 3 MP
+PP
+0 sg
+2002 2452 mt 1829 2470 L
+1829 2470 mt 1719 2340 L
+c16
+244 21 -94 -116 1935 2568 3 MP
+PP
+0 sg
+1935 2568 mt 1841 2452 L
+1841 2452 mt 2085 2473 L
+c12
+-233 25 31 -153 1769 1538 3 MP
+PP
+0 sg
+1769 1538 mt 1800 1385 L
+1800 1385 mt 1567 1410 L
+c15
+51 -145 269 24 1765 1388 3 MP
+PP
+0 sg
+1765 1388 mt 2034 1412 L
+2034 1412 mt 2085 1267 L
+c16
+-199 21 -84 -133 2002 2452 3 MP
+PP
+0 sg
+2002 2452 mt 1918 2319 L
+1918 2319 mt 1719 2340 L
+c14
+-51 -129 244 21 1841 2452 3 MP
+PP
+0 sg
+1841 2452 mt 2085 2473 L
+2085 2473 mt 2034 2344 L
+gr
+
+0 sg
+24 W
+1 sg
+2084 1577 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2082 1468 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2081 1270 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2080 1114 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2080 1148 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2078 1200 PD
+gs 655 283 3870 3023 rc
+c19
+-82 19 128 -96 1829 1018 3 MP
+PP
+0 sg
+1829 1018 mt 1957  922 L
+1957  922 mt 1875  941 L
+c21
+152 -89 59 22 1862 962 3 MP
+PP
+0 sg
+1862  962 mt 1921  984 L
+1921  984 mt 2073  895 L
+c20
+-166 -85 -9 17 2037 2691 3 MP
+PP
+0 sg
+2037 2691 mt 2028 2708 L
+2028 2708 mt 1862 2623 L
+c20
+-13 21 -162 -89 2037 2691 3 MP
+PP
+0 sg
+2037 2691 mt 1875 2602 L
+1875 2602 mt 1862 2623 L
+c20
+124 19 -152 -79 2073 2724 3 MP
+PP
+0 sg
+2073 2724 mt 1921 2645 L
+1921 2645 mt 2045 2664 L
+c20
+-152 -79 45 16 2028 2708 3 MP
+PP
+0 sg
+2028 2708 mt 2073 2724 L
+2073 2724 mt 1921 2645 L
+c21
+162 -79 -82 19 1957 922 3 MP
+PP
+0 sg
+1957  922 mt 1875  941 L
+1875  941 mt 2037  862 L
+c21
+45 17 166 -84 1862 962 3 MP
+PP
+0 sg
+1862  962 mt 2028  878 L
+2028  878 mt 2073  895 L
+gr
+
+0 sg
+24 W
+1 sg
+2072 1177 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2066 1251 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2063 1542 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2057 1488 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2047 1486 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2046 1220 PD
+gs 655 283 3870 3023 rc
+c17
+110 -115 -199 20 1918 1113 3 MP
+PP
+0 sg
+1918 1113 mt 1719 1133 L
+1719 1133 mt 1829 1018 L
+c17
+-173 18 84 -113 1918 1113 3 MP
+PP
+0 sg
+1918 1113 mt 2002 1000 L
+2002 1000 mt 1829 1018 L
+c19
+110 -113 149 23 1786 1093 3 MP
+PP
+0 sg
+1786 1093 mt 1935 1116 L
+1935 1116 mt 2045 1003 L
+c19
+124 19 135 -109 1786 1093 3 MP
+PP
+0 sg
+1786 1093 mt 1921  984 L
+1921  984 mt 2045 1003 L
+c18
+-110 -96 124 19 1921 2645 3 MP
+PP
+0 sg
+1921 2645 mt 2045 2664 L
+2045 2664 mt 1935 2568 L
+c21
+-9 16 162 -79 1875 941 3 MP
+PP
+0 sg
+1875  941 mt 2037  862 L
+2037  862 mt 2028  878 L
+gr
+
+0 sg
+24 W
+1 sg
+2037 1353 PD
+gs 655 283 3870 3023 rc
+c12
+40 -154 -242 26 1769 1538 3 MP
+PP
+0 sg
+1769 1538 mt 1527 1564 L
+1527 1564 mt 1567 1410 L
+c13
+269 24 56 -153 1709 1541 3 MP
+PP
+0 sg
+1709 1541 mt 1765 1388 L
+1765 1388 mt 2034 1412 L
+c8
+-242 26 10 -160 1759 1698 3 MP
+PP
+0 sg
+1759 1698 mt 1769 1538 L
+1769 1538 mt 1527 1564 L
+c13
+38 -154 287 25 1709 1541 3 MP
+PP
+0 sg
+1709 1541 mt 1996 1566 L
+1996 1566 mt 2034 1412 L
+c14
+-88 -143 -199 21 1918 2319 3 MP
+PP
+0 sg
+1918 2319 mt 1719 2340 L
+1719 2340 mt 1631 2197 L
+c14
+269 24 -76 -132 1841 2452 3 MP
+PP
+0 sg
+1841 2452 mt 1765 2320 L
+1765 2320 mt 2034 2344 L
+c14
+-219 23 -68 -145 1918 2319 3 MP
+PP
+0 sg
+1918 2319 mt 1850 2174 L
+1850 2174 mt 1631 2197 L
+c11
+-38 -143 269 24 1765 2320 3 MP
+PP
+0 sg
+1765 2320 mt 2034 2344 L
+2034 2344 mt 1996 2201 L
+gr
+
+0 sg
+24 W
+1 sg
+2028 1244 PD
+gs 655 283 3870 3023 rc
+c20
+59 22 -166 -85 2028 2708 3 MP
+PP
+0 sg
+2028 2708 mt 1862 2623 L
+1862 2623 mt 1921 2645 L
+c21
+166 -84 -13 21 1875 941 3 MP
+PP
+0 sg
+1875  941 mt 1862  962 L
+1862  962 mt 2028  878 L
+gr
+
+0 sg
+24 W
+1 sg
+2026 1236 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2022 1406 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2015 1452 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+2010 1495 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1997 1384 PD
+gs 655 283 3870 3023 rc
+c8
+13 -160 -245 26 1759 1698 3 MP
+PP
+0 sg
+1759 1698 mt 1514 1724 L
+1514 1724 mt 1527 1564 L
+c12
+287 25 33 -159 1676 1700 3 MP
+PP
+0 sg
+1676 1700 mt 1709 1541 L
+1709 1541 mt 1996 1566 L
+c11
+-64 -153 -219 23 1850 2174 3 MP
+PP
+0 sg
+1850 2174 mt 1631 2197 L
+1631 2197 mt 1567 2044 L
+c11
+-233 24 -50 -154 1850 2174 3 MP
+PP
+0 sg
+1850 2174 mt 1800 2020 L
+1800 2020 mt 1567 2044 L
+c10
+-22 -154 287 25 1709 2176 3 MP
+PP
+0 sg
+1709 2176 mt 1996 2201 L
+1996 2201 mt 1974 2047 L
+c11
+287 25 -56 -144 1765 2320 3 MP
+PP
+0 sg
+1765 2320 mt 1709 2176 L
+1709 2176 mt 1996 2201 L
+c9
+-245 26 -10 -162 1769 1860 3 MP
+PP
+0 sg
+1769 1860 mt 1759 1698 L
+1759 1698 mt 1514 1724 L
+c12
+22 -160 298 26 1676 1700 3 MP
+PP
+0 sg
+1676 1700 mt 1974 1726 L
+1974 1726 mt 1996 1566 L
+gr
+
+0 sg
+24 W
+1 sg
+1994 1140 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1990 1286 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1987 1174 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1984 1190 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1983 1305 PD
+gs 655 283 3870 3023 rc
+c10
+-40 -159 -233 24 1800 2020 3 MP
+PP
+0 sg
+1800 2020 mt 1567 2044 L
+1567 2044 mt 1527 1885 L
+c10
+298 25 -33 -154 1709 2176 3 MP
+PP
+0 sg
+1709 2176 mt 1676 2022 L
+1676 2022 mt 1974 2047 L
+c9
+-13 -161 -242 25 1769 1860 3 MP
+PP
+0 sg
+1769 1860 mt 1527 1885 L
+1527 1885 mt 1514 1724 L
+c10
+-242 25 -31 -160 1800 2020 3 MP
+PP
+0 sg
+1800 2020 mt 1769 1860 L
+1769 1860 mt 1527 1885 L
+c8
+8 -162 302 26 1664 1862 3 MP
+PP
+0 sg
+1664 1862 mt 1966 1888 L
+1966 1888 mt 1974 1726 L
+c9
+-8 -159 298 25 1676 2022 3 MP
+PP
+0 sg
+1676 2022 mt 1974 2047 L
+1974 2047 mt 1966 1888 L
+c8
+298 26 12 -162 1664 1862 3 MP
+PP
+0 sg
+1664 1862 mt 1676 1700 L
+1676 1700 mt 1974 1726 L
+gr
+
+0 sg
+24 W
+1 sg
+1973 1206 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1966 1393 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1966 1276 PD
+gs 655 283 3870 3023 rc
+c9
+302 26 -12 -160 1676 2022 3 MP
+PP
+0 sg
+1676 2022 mt 1664 1862 L
+1664 1862 mt 1966 1888 L
+gr
+
+0 sg
+24 W
+1 sg
+1955 1192 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1948 1369 PD
+gs 655 283 3870 3023 rc
+c18
+-147 -104 -13 21 1875 2602 3 MP
+PP
+0 sg
+1875 2602 mt 1862 2623 L
+1862 2623 mt 1715 2519 L
+c18
+-15 26 -145 -109 1875 2602 3 MP
+PP
+0 sg
+1875 2602 mt 1730 2493 L
+1730 2493 mt 1715 2519 L
+c18
+149 24 -135 -101 1921 2645 3 MP
+PP
+0 sg
+1921 2645 mt 1786 2544 L
+1786 2544 mt 1935 2568 L
+c17
+149 23 116 -126 1670 1219 3 MP
+PP
+0 sg
+1670 1219 mt 1786 1093 L
+1786 1093 mt 1935 1116 L
+c17
+94 -129 171 26 1670 1219 3 MP
+PP
+0 sg
+1670 1219 mt 1841 1245 L
+1841 1245 mt 1935 1116 L
+c16
+-94 -116 149 24 1786 2544 3 MP
+PP
+0 sg
+1786 2544 mt 1935 2568 L
+1935 2568 mt 1841 2452 L
+gr
+
+0 sg
+24 W
+1 sg
+1934 1411 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1930 1469 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1926 1292 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1922 1459 PD
+gs 655 283 3870 3023 rc
+c18
+-135 -101 59 22 1862 2623 3 MP
+PP
+0 sg
+1862 2623 mt 1921 2645 L
+1921 2645 mt 1786 2544 L
+c17
+124 -119 -113 27 1719 1133 3 MP
+PP
+0 sg
+1719 1133 mt 1606 1160 L
+1606 1160 mt 1730 1041 L
+c17
+-99 23 110 -115 1719 1133 3 MP
+PP
+0 sg
+1719 1133 mt 1829 1018 L
+1829 1018 mt 1730 1041 L
+c19
+145 -100 -99 23 1829 1018 3 MP
+PP
+0 sg
+1829 1018 mt 1730 1041 L
+1730 1041 mt 1875  941 L
+c19
+59 22 147 -105 1715 1067 3 MP
+PP
+0 sg
+1715 1067 mt 1862  962 L
+1862  962 mt 1921  984 L
+c19
+135 -109 71 26 1715 1067 3 MP
+PP
+0 sg
+1715 1067 mt 1786 1093 L
+1786 1093 mt 1921  984 L
+gr
+
+0 sg
+24 W
+1 sg
+1914 1488 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1898 1444 PD
+gs 655 283 3870 3023 rc
+gr
+
+24 W
+1894 1426 PD
+gs 655 283 3870 3023 rc
+c19
+-13 21 145 -100 1730 1041 3 MP
+PP
+0 sg
+1730 1041 mt 1875  941 L
+1875  941 mt 1862  962 L
+c19
+147 -105 -15 26 1730 1041 3 MP
+PP
+0 sg
+1730 1041 mt 1715 1067 L
+1715 1067 mt 1862  962 L
+c18
+71 25 -147 -104 1862 2623 3 MP
+PP
+0 sg
+1862 2623 mt 1715 2519 L
+1715 2519 mt 1786 2544 L
+gr
+
+0 sg
+24 W
+1 sg
+1862 1389 PD
+gs 655 283 3870 3023 rc
+c13
+-125 29 64 -145 1567 1410 3 MP
+PP
+0 sg
+1567 1410 mt 1631 1265 L
+1631 1265 mt 1506 1294 L
+c15
+76 -143 188 29 1577 1359 3 MP
+PP
+0 sg
+1577 1359 mt 1765 1388 L
+1765 1388 mt 1841 1245 L
+c15
+171 26 93 -140 1577 1359 3 MP
+PP
+0 sg
+1577 1359 mt 1670 1219 L
+1670 1219 mt 1841 1245 L
+c16
+-113 27 -110 -130 1829 2470 3 MP
+PP
+0 sg
+1829 2470 mt 1719 2340 L
+1719 2340 mt 1606 2367 L
+c16
+-124 -126 -99 23 1829 2470 3 MP
+PP
+0 sg
+1829 2470 mt 1730 2493 L
+1730 2493 mt 1606 2367 L
+c16
+171 26 -116 -118 1786 2544 3 MP
+PP
+0 sg
+1786 2544 mt 1670 2426 L
+1670 2426 mt 1841 2452 L
+c14
+-76 -132 171 26 1670 2426 3 MP
+PP
+0 sg
+1670 2426 mt 1841 2452 L
+1841 2452 mt 1765 2320 L
+c16
+-17 29 -124 -126 1730 2493 3 MP
+PP
+0 sg
+1730 2493 mt 1606 2367 L
+1606 2367 mt 1589 2396 L
+c16
+-126 -123 -15 26 1730 2493 3 MP
+PP
+0 sg
+1730 2493 mt 1715 2519 L
+1715 2519 mt 1589 2396 L
+c16
+-116 -118 71 25 1715 2519 3 MP
+PP
+0 sg
+1715 2519 mt 1786 2544 L
+1786 2544 mt 1670 2426 L
+c15
+100 -134 -125 29 1631 1265 3 MP
+PP
+0 sg
+1631 1265 mt 1506 1294 L
+1506 1294 mt 1606 1160 L
+c15
+-113 27 88 -132 1631 1265 3 MP
+PP
+0 sg
+1631 1265 mt 1719 1133 L
+1719 1133 mt 1606 1160 L
+c17
+71 26 126 -122 1589 1189 3 MP
+PP
+0 sg
+1589 1189 mt 1715 1067 L
+1715 1067 mt 1786 1093 L
+c17
+116 -126 81 30 1589 1189 3 MP
+PP
+0 sg
+1589 1189 mt 1670 1219 L
+1670 1219 mt 1786 1093 L
+c12
+-134 31 40 -154 1527 1564 3 MP
+PP
+0 sg
+1527 1564 mt 1567 1410 L
+1567 1410 mt 1433 1441 L
+c13
+56 -153 200 31 1509 1510 3 MP
+PP
+0 sg
+1509 1510 mt 1709 1541 L
+1709 1541 mt 1765 1388 L
+c13
+73 -147 -134 31 1567 1410 3 MP
+PP
+0 sg
+1567 1410 mt 1433 1441 L
+1433 1441 mt 1506 1294 L
+c13
+188 29 68 -151 1509 1510 3 MP
+PP
+0 sg
+1509 1510 mt 1577 1359 L
+1577 1359 mt 1765 1388 L
+c14
+-100 -141 -113 27 1719 2340 3 MP
+PP
+0 sg
+1719 2340 mt 1606 2367 L
+1606 2367 mt 1506 2226 L
+c14
+-125 29 -88 -143 1719 2340 3 MP
+PP
+0 sg
+1719 2340 mt 1631 2197 L
+1631 2197 mt 1506 2226 L
+c14
+188 29 -93 -135 1670 2426 3 MP
+PP
+0 sg
+1670 2426 mt 1577 2291 L
+1577 2291 mt 1765 2320 L
+c11
+-56 -144 188 29 1577 2291 3 MP
+PP
+0 sg
+1577 2291 mt 1765 2320 L
+1765 2320 mt 1709 2176 L
+c17
+-15 26 124 -119 1606 1160 3 MP
+PP
+0 sg
+1606 1160 mt 1730 1041 L
+1730 1041 mt 1715 1067 L
+c16
+81 30 -126 -123 1715 2519 3 MP
+PP
+0 sg
+1715 2519 mt 1589 2396 L
+1589 2396 mt 1670 2426 L
+c17
+126 -122 -17 29 1606 1160 3 MP
+PP
+0 sg
+1606 1160 mt 1589 1189 L
+1589 1189 mt 1715 1067 L
+c12
+44 -155 -138 32 1527 1564 3 MP
+PP
+0 sg
+1527 1564 mt 1389 1596 L
+1389 1596 mt 1433 1441 L
+c8
+-138 32 13 -160 1514 1724 3 MP
+PP
+0 sg
+1514 1724 mt 1527 1564 L
+1527 1564 mt 1389 1596 L
+c12
+200 31 42 -158 1467 1668 3 MP
+PP
+0 sg
+1467 1668 mt 1509 1510 L
+1509 1510 mt 1709 1541 L
+c12
+33 -159 209 32 1467 1668 3 MP
+PP
+0 sg
+1467 1668 mt 1676 1700 L
+1676 1700 mt 1709 1541 L
+c11
+-73 -151 -125 29 1631 2197 3 MP
+PP
+0 sg
+1631 2197 mt 1506 2226 L
+1506 2226 mt 1433 2075 L
+c11
+-134 31 -64 -153 1631 2197 3 MP
+PP
+0 sg
+1631 2197 mt 1567 2044 L
+1567 2044 mt 1433 2075 L
+c10
+-33 -154 200 32 1509 2144 3 MP
+PP
+0 sg
+1509 2144 mt 1709 2176 L
+1709 2176 mt 1676 2022 L
+c11
+200 32 -68 -147 1577 2291 3 MP
+PP
+0 sg
+1577 2291 mt 1509 2144 L
+1509 2144 mt 1709 2176 L
+c10
+-138 32 -40 -159 1567 2044 3 MP
+PP
+0 sg
+1567 2044 mt 1527 1885 L
+1527 1885 mt 1389 1917 L
+c10
+-44 -158 -134 31 1567 2044 3 MP
+PP
+0 sg
+1567 2044 mt 1433 2075 L
+1433 2075 mt 1389 1917 L
+c9
+-12 -160 209 33 1467 1989 3 MP
+PP
+0 sg
+1467 1989 mt 1676 2022 L
+1676 2022 mt 1664 1862 L
+c8
+15 -160 -140 32 1514 1724 3 MP
+PP
+0 sg
+1514 1724 mt 1374 1756 L
+1374 1756 mt 1389 1596 L
+c9
+-15 -161 -138 32 1527 1885 3 MP
+PP
+0 sg
+1527 1885 mt 1389 1917 L
+1389 1917 mt 1374 1756 L
+c9
+-140 32 -13 -161 1527 1885 3 MP
+PP
+0 sg
+1527 1885 mt 1514 1724 L
+1514 1724 mt 1374 1756 L
+c8
+209 32 14 -161 1453 1829 3 MP
+PP
+0 sg
+1453 1829 mt 1467 1668 L
+1467 1668 mt 1676 1700 L
+c8
+12 -162 211 33 1453 1829 3 MP
+PP
+0 sg
+1453 1829 mt 1664 1862 L
+1664 1862 mt 1676 1700 L
+c10
+209 33 -42 -155 1509 2144 3 MP
+PP
+0 sg
+1509 2144 mt 1467 1989 L
+1467 1989 mt 1676 2022 L
+c14
+-101 -137 -17 29 1606 2367 3 MP
+PP
+0 sg
+1606 2367 mt 1589 2396 L
+1589 2396 mt 1488 2259 L
+c14
+-18 33 -100 -141 1606 2367 3 MP
+PP
+0 sg
+1606 2367 mt 1506 2226 L
+1506 2226 mt 1488 2259 L
+c14
+-93 -135 81 30 1589 2396 3 MP
+PP
+0 sg
+1589 2396 mt 1670 2426 L
+1670 2426 mt 1577 2291 L
+c13
+-18 32 73 -147 1433 1441 3 MP
+PP
+0 sg
+1433 1441 mt 1506 1294 L
+1506 1294 mt 1488 1326 L
+c15
+93 -140 89 33 1488 1326 3 MP
+PP
+0 sg
+1488 1326 mt 1577 1359 L
+1577 1359 mt 1670 1219 L
+c15
+81 30 101 -137 1488 1326 3 MP
+PP
+0 sg
+1488 1326 mt 1589 1189 L
+1589 1189 mt 1670 1219 L
+c9
+211 33 -14 -160 1467 1989 3 MP
+PP
+0 sg
+1467 1989 mt 1453 1829 L
+1453 1829 mt 1664 1862 L
+c15
+-17 29 100 -134 1506 1294 3 MP
+PP
+0 sg
+1506 1294 mt 1606 1160 L
+1606 1160 mt 1589 1189 L
+c15
+101 -137 -18 32 1506 1294 3 MP
+PP
+0 sg
+1506 1294 mt 1488 1326 L
+1488 1326 mt 1589 1189 L
+c14
+89 32 -101 -137 1589 2396 3 MP
+PP
+0 sg
+1589 2396 mt 1488 2259 L
+1488 2259 mt 1577 2291 L
+c12
+-20 34 44 -155 1389 1596 3 MP
+PP
+0 sg
+1389 1596 mt 1433 1441 L
+1433 1441 mt 1413 1475 L
+c13
+68 -151 96 35 1413 1475 3 MP
+PP
+0 sg
+1413 1475 mt 1509 1510 L
+1509 1510 mt 1577 1359 L
+c11
+-75 -149 -18 33 1506 2226 3 MP
+PP
+0 sg
+1506 2226 mt 1488 2259 L
+1488 2259 mt 1413 2110 L
+c11
+-20 35 -73 -151 1506 2226 3 MP
+PP
+0 sg
+1506 2226 mt 1433 2075 L
+1433 2075 mt 1413 2110 L
+c11
+-68 -147 89 32 1488 2259 3 MP
+PP
+0 sg
+1488 2259 mt 1577 2291 L
+1577 2291 mt 1509 2144 L
+c13
+75 -149 -20 34 1433 1441 3 MP
+PP
+0 sg
+1433 1441 mt 1413 1475 L
+1413 1475 mt 1488 1326 L
+c13
+89 33 75 -149 1413 1475 3 MP
+PP
+0 sg
+1413 1475 mt 1488 1326 L
+1488 1326 mt 1577 1359 L
+c8
+-21 36 15 -160 1374 1756 3 MP
+PP
+0 sg
+1374 1756 mt 1389 1596 L
+1389 1596 mt 1368 1632 L
+c12
+45 -157 -21 36 1389 1596 3 MP
+PP
+0 sg
+1389 1596 mt 1368 1632 L
+1368 1632 mt 1413 1475 L
+c12
+96 35 45 -157 1368 1632 3 MP
+PP
+0 sg
+1368 1632 mt 1413 1475 L
+1413 1475 mt 1509 1510 L
+c10
+-21 36 -44 -158 1433 2075 3 MP
+PP
+0 sg
+1433 2075 mt 1389 1917 L
+1389 1917 mt 1368 1953 L
+c10
+-45 -157 -20 35 1433 2075 3 MP
+PP
+0 sg
+1433 2075 mt 1413 2110 L
+1413 2110 mt 1368 1953 L
+c10
+-42 -155 96 34 1413 2110 3 MP
+PP
+0 sg
+1413 2110 mt 1509 2144 L
+1509 2144 mt 1467 1989 L
+c12
+42 -158 99 36 1368 1632 3 MP
+PP
+0 sg
+1368 1632 mt 1467 1668 L
+1467 1668 mt 1509 1510 L
+c11
+96 34 -75 -149 1488 2259 3 MP
+PP
+0 sg
+1488 2259 mt 1413 2110 L
+1413 2110 mt 1509 2144 L
+c9
+-21 36 -15 -161 1389 1917 3 MP
+PP
+0 sg
+1389 1917 mt 1374 1756 L
+1374 1756 mt 1353 1792 L
+c8
+14 -161 100 37 1353 1792 3 MP
+PP
+0 sg
+1353 1792 mt 1453 1829 L
+1453 1829 mt 1467 1668 L
+c8
+15 -160 -21 36 1374 1756 3 MP
+PP
+0 sg
+1374 1756 mt 1353 1792 L
+1353 1792 mt 1368 1632 L
+c8
+99 36 15 -160 1353 1792 3 MP
+PP
+0 sg
+1353 1792 mt 1368 1632 L
+1368 1632 mt 1467 1668 L
+c10
+99 36 -45 -157 1413 2110 3 MP
+PP
+0 sg
+1413 2110 mt 1368 1953 L
+1368 1953 mt 1467 1989 L
+c9
+-14 -160 99 36 1368 1953 3 MP
+PP
+0 sg
+1368 1953 mt 1467 1989 L
+1467 1989 mt 1453 1829 L
+c9
+-15 -161 -21 36 1389 1917 3 MP
+PP
+0 sg
+1389 1917 mt 1368 1953 L
+1368 1953 mt 1353 1792 L
+c9
+100 37 -15 -161 1368 1953 3 MP
+PP
+0 sg
+1368 1953 mt 1353 1792 L
+1353 1792 mt 1453 1829 L
+gr
+
+0 sg
+
+end %%Color Dict
+
+eplot
+%%EndObject
+
+epage
+end
+
+showpage
+
+%%Trailer
+%%EOF
--- a/src/spectrum/doc/spectrum.rst	Wed Apr 08 19:42:20 2015 -0700
+++ b/src/spectrum/doc/spectrum.rst	Wed Apr 08 19:45:39 2015 -0700
@@ -437,3 +437,168 @@
 
 
 
+Additional Models
+*****************
+
+TV Transmitter Model
+====================
+
+A TV Transmitter model is implemented by the ``TvSpectrumTransmitter`` class.
+This model enables transmission of realistic TV signals to be simulated and can 
+be used for interference modeling. It provides a customizable power spectral 
+density (PSD) model, with configurable attributes including the type of 
+modulation (with models for analog, 8-VSB, and COFDM), signal bandwidth, 
+power spectral density level, frequency, and transmission duration. A helper 
+class, ``TvSpectrumTransmitterHelper``, is also provided to assist users in 
+setting up simulations.
+
+Main Model Class
+################
+
+The main TV Transmitter model class, ``TvSpectrumTransmitter``, provides a 
+user-configurable PSD model that can be transmitted on the ``SpectrumChannel``. 
+It inherits from ``SpectrumPhy`` and is comprised of attributes and methods to 
+create and transmit the signal on the channel.
+
+.. _spectrum-tv-cofdm:
+ 
+.. figure:: figures/spectrum-tv-cofdm.*
+   :align: center
+
+   8K COFDM signal spectrum generated from ``TvSpectrumTransmitter`` (Left) and 
+   theoretical COFDM signal spectrum [KoppCOFDM] (Right)
+
+One of the user-configurable attributes is the type of modulation for the TV 
+transmitter to use. The options are 8-VSB (Eight-Level Vestigial Sideband 
+Modulation) which is notably used in the North America ATSC digital television 
+standard, COFDM (Coded Orthogonal Frequency Division Multiplexing) which is 
+notably used in the DVB-T and ISDB-T digital television standards adopted by 
+various countries around the world, and analog modulation which is a legacy 
+technology but is still being used by some countries today. To accomplish 
+realistic PSD models for these modulation types, the signals’ PSDs were 
+approximated from real standards and developed into models that are scalable by 
+frequency and power. The COFDM PSD is approximated from Figure 12 (8k mode) of 
+[KoppCOFDM], the 8-VSB PSD is approximated from Figure 3 of [Baron8VSB], and the 
+analog PSD is approximated from Figure 4 of [QualcommAnalog]. Note that the 
+analog model is approximated from the NTSC standard, but other analog modulation 
+standards such as PAL have similar signals. The approximated COFDM PSD model is 
+in 8K mode. The other configurable attributes are the start frequency, 
+signal/channel bandwidth, channel number, base PSD, antenna type, starting time, 
+and transmit duration.
+
+``TvSpectrumTransmitter`` uses ``IsotropicAntennaModel`` as its antenna model by 
+default, but any model that inherits from ``AntennaModel`` is selectable, so 
+directional antenna models can also be used. The propagation loss models used 
+in simulation are configured in the ``SpectrumChannel`` that the user chooses to 
+use. Terrain and spherical Earth/horizon effects may be supported in future ns-3 
+propagation loss models.
+
+After the attributes are set, along with the ``SpectrumChannel``, 
+``MobilityModel``, and node locations, the PSD of the TV transmitter signal can 
+be created and transmitted on the channel.
+
+.. _sec-tv-helper-class:
+
+Helper Class
+############
+
+The helper class, ``TvSpectrumTransmitterHelper``, consists of features to 
+assist users in setting up TV transmitters for their simulations. Functionality 
+is also provided to easily simulate real-world scenarios. 
+
+.. _spectrum-tv-8vsb:
+ 
+.. figure:: figures/spectrum-tv-8vsb.*
+   :align: center
+
+   North America ATSC channel 19 & 20 signals generated using 
+   ``TvSpectrumTransmitterHelper`` (Left) and theoretical 8-VSB signal 
+   [Baron8VSB] (Right). Note that the theoretical signal is not shown in dB 
+   while the ns-3 generated signals are.
+
+Using this helper class, users can easily set up TV transmitters right after 
+configuring attributes. Multiple transmitters can be created at a time. Also 
+included are real characteristics of specific geographic regions that can be 
+used to run realistic simulations. The regions currently included are 
+North America, Europe, and Japan. The frequencies and bandwidth of each TV 
+channel for each these regions are provided.
+
+.. _spectrum-tv-rand-geo-points:
+ 
+.. figure:: figures/spectrum-tv-rand-geo-points.*
+   :align: center
+
+   Plot from MATLAB implementation of CreateRegionalTvTransmitters method in 
+   ``TvSpectrumTransmitterHelper``. Shows 100 random points on Earth’s surface 
+   (with altitude 0) corresponding to TV transmitter locations within a 2000 km 
+   radius of 35° latitude and -100° longitude.
+
+A method (CreateRegionalTvTransmitters) is provided that enables users to 
+randomly generate multiple TV transmitters from a specified region with a given 
+density within a chosen radius around a point on Earth’s surface. The region, 
+which determines the channel frequencies of the generated TV transmitters, can 
+be specified to be one of the three provided, while the density determines the 
+amount of transmitters generated. The TV transmitters' antenna heights 
+(altitude) above Earth's surface can also be randomly generated to be within a 
+given maximum altitude. This method models Earth as a perfect sphere, and 
+generated location points are referenced accordingly in Earth-Centered 
+Earth-Fixed Cartesian coordinates. Note that bodies of water on Earth are not 
+considered in location point generation--TV transmitters can be generated 
+anywhere on Earth around the origin point within the chosen maximum radius.
+
+Examples
+########
+
+Two example simulations are provided that demonstrate the functionality of the 
+TV transmitter model. ``tv-trans-example`` simulates two 8-VSB TV transmitters 
+with adjacent channel frequencies. ``tv-trans-regional-example`` simulates 
+randomly generated COFDM TV transmitters (modeling the DVB-T standard)  
+located around the Paris, France area with channel frequencies and bandwidths 
+corresponding to the European television channel allocations.
+
+Testing
+#######
+
+The ``tv-spectrum-transmitter`` test suite verifies the accuracy of the 
+spectrum/PSD model in ``TvSpectrumTransmitter`` by testing if the maximum power 
+spectral density, start frequency, and end frequency comply with expected values 
+for various test cases.
+
+The ``tv-helper-distribution`` test suite verifies the functionality of the 
+method in ``TvSpectrumTransmitterHelper`` that generates a random number of TV 
+transmitters based on the given density (low, medium, or high) and maximum 
+number of TV channels. It verifies that the number of TV transmitters generated 
+does not exceed the expected bounds.
+
+The CreateRegionalTvTransmitters method in ``TvSpectrumTransmitterHelper`` 
+described in :ref:`sec-tv-helper-class` uses two methods from the 
+``GeographicPositions`` class in the Mobility module to generate the random 
+Cartesian points on or above earth's surface around an origin point which 
+correspond to TV transmitter positions. The first method converts Earth 
+geographic coordinates to Earth-Centered Earth-Fixed (ECEF) Cartesian 
+coordinates, and is tested in the ``geo-to-cartesian`` test suite by comparing 
+(with 10 meter tolerance) its output with the output of the geographic to ECEF 
+conversion function [MatlabGeo] of the MATLAB Mapping Toolbox for numerous 
+test cases. The other used method generates random ECEF Cartesian points around 
+the given geographic origin point, and is tested in the ``rand-cart-around-geo`` 
+test suite by verifying that the generated points do not exceed the given 
+maximum distance radius from the origin point.
+
+References
+##########
+
+.. [Baron8VSB] Baron, Stanley. "First-Hand:Digital Television: The Digital 
+   Terrestrial Television Broadcasting (DTTB) Standard." IEEE Global History 
+   Network. <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
+
+.. [KoppCOFDM] Kopp, Carlo. "High Definition Television." High Definition 
+   Television. Air Power Australia. <http://www.ausairpower.net/AC-1100.html>.
+
+.. [MatlabGeo] "Geodetic2ecef." Convert Geodetic to Geocentric (ECEF) 
+   Coordinates. The MathWorks, Inc. 
+   <http://www.mathworks.com/help/map/ref/geodetic2ecef.html>.
+
+.. [QualcommAnalog] Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. 
+   "Technical Challenges for Cognitive Radio in the TV White Space Spectrum." 
+   Qualcomm Incorporated.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/examples/tv-trans-example.cc	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <iostream>
+#include <stdlib.h>
+#include <ns3/core-module.h>
+#include <ns3/mobility-module.h>
+#include <ns3/spectrum-helper.h>
+#include <ns3/spectrum-analyzer-helper.h>
+#include <ns3/tv-spectrum-transmitter-helper.h>
+
+using namespace ns3;
+
+/**
+ * This example uses the TvSpectrumTransmitterHelper class to set up two 8-VSB
+ * TV transmitters with adjacent channels. Each transmitter's spectrum has a
+ * bandwidth of 6 MHz. The first TV transmitter has a start frequency of
+ * 524 MHz while the second has a start frequency of 530 MHz. These transmitters
+ * model ATSC (North American digital TV standard) channels 23 and 24.
+ *
+ * A spectrum analyzer is used to measure the transmitted spectra from the
+ * TV transmitters. The file "spectrum-analyzer-tv-sim-2-0.tr" contains its
+ * output post simulation (and can be plotted with Gnuplot or MATLAB).
+ */
+int main (int argc, char** argv)
+{
+  /* nodes and positions */
+  NodeContainer tvTransmitterNodes;
+  NodeContainer spectrumAnalyzerNodes;
+  NodeContainer allNodes;
+  tvTransmitterNodes.Create (2);
+  spectrumAnalyzerNodes.Create (1);
+  allNodes.Add (tvTransmitterNodes);
+  allNodes.Add (spectrumAnalyzerNodes);
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> nodePositionList = CreateObject<ListPositionAllocator> ();
+  nodePositionList->Add (Vector (128000.0, 0.0, 0.0)); // TV Transmitter 1; 128 km away from spectrum analyzer 
+  nodePositionList->Add (Vector (0.0, 24000.0, 0.0)); // TV Transmitter 2; 24 km away from spectrum analyzer
+  nodePositionList->Add (Vector (0.0, 0.0, 0.0));  // Spectrum Analyzer
+  mobility.SetPositionAllocator (nodePositionList);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (allNodes);
+
+  /* channel and propagation */
+  SpectrumChannelHelper channelHelper = SpectrumChannelHelper::Default ();
+  channelHelper.SetChannel ("ns3::MultiModelSpectrumChannel");
+  // constant path loss added just to show capability to set different propagation loss models
+  // FriisSpectrumPropagationLossModel already added by default in SpectrumChannelHelper
+  channelHelper.AddSpectrumPropagationLoss ("ns3::ConstantSpectrumPropagationLossModel");
+  Ptr<SpectrumChannel> channel = channelHelper.Create ();
+  
+  /* TV transmitter setup */
+  TvSpectrumTransmitterHelper tvTransHelper;
+  tvTransHelper.SetChannel (channel);
+  tvTransHelper.SetAttribute ("StartFrequency", DoubleValue (524e6));
+  tvTransHelper.SetAttribute ("ChannelBandwidth", DoubleValue (6e6));
+  // channel number not required in this example but shown for clarity
+  tvTransHelper.SetAttribute ("ChannelNumber", UintegerValue (23));
+  tvTransHelper.SetAttribute ("StartingTime", TimeValue (Seconds (0)));
+  tvTransHelper.SetAttribute ("TransmitDuration", TimeValue (Seconds (0.2)));
+  // 22.22 dBm/Hz from 1000 kW ERP transmit power, flat 6 MHz PSD spectrum assumed for this approximation 
+  tvTransHelper.SetAttribute ("BasePsd", DoubleValue (22.22)); 
+  tvTransHelper.SetAttribute ("TvType", EnumValue (TvSpectrumTransmitter::TVTYPE_8VSB));
+  tvTransHelper.SetAttribute ("Antenna", StringValue ("ns3::IsotropicAntennaModel"));
+  tvTransHelper.InstallAdjacent (tvTransmitterNodes);
+
+  /* frequency range for spectrum analyzer */
+  std::vector<double> freqs;
+  for (int i = 0; i < 200; ++i)
+    {
+      freqs.push_back ((i + 5200) * 1e5);
+    }
+  Ptr<SpectrumModel> spectrumAnalyzerFreqModel = Create<SpectrumModel> (freqs);
+
+  /* spectrum analyzer setup */
+  SpectrumAnalyzerHelper spectrumAnalyzerHelper;
+  spectrumAnalyzerHelper.SetChannel (channel);
+  spectrumAnalyzerHelper.SetRxSpectrumModel (spectrumAnalyzerFreqModel);
+  spectrumAnalyzerHelper.SetPhyAttribute ("NoisePowerSpectralDensity", DoubleValue (1e-15)); // -120 dBm/Hz
+  spectrumAnalyzerHelper.EnableAsciiAll ("spectrum-analyzer-tv-sim");
+  NetDeviceContainer spectrumAnalyzerDevices = spectrumAnalyzerHelper.Install (spectrumAnalyzerNodes);
+
+  Simulator::Stop (Seconds (0.4));
+
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+
+  std::cout << "simulation done!" << std::endl;
+  std::cout << "see spectrum analyzer output file" << std::endl;
+
+  return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/examples/tv-trans-regional-example.cc	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,111 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <iostream>
+#include <stdlib.h>
+#include <ns3/core-module.h>
+#include <ns3/mobility-module.h>
+#include <ns3/spectrum-helper.h>
+#include <ns3/spectrum-analyzer-helper.h>
+#include <ns3/tv-spectrum-transmitter-helper.h>
+
+using namespace ns3;
+
+/**
+ * This example uses the TvSpectrumTransmitterHelper class to generate a random
+ * number of COFDM TV transmitters within a 250 km radius around latitude
+ * 48.86 degrees and longitude 2.35 degrees (Paris, France). The transmitters' 
+ * frequencies and bandwidths correspond to the European TV channel allocations.
+ * These TV transmitters model the digital DVB-T standard.
+ *
+ * A spectrum analyzer is used to measure the transmitted spectra from the
+ * TV transmitters. The file "spectrum-analyzer-tv-sim-regional-0-0.tr" contains
+ * its output post simulation (and can be plotted with Gnuplot or MATLAB).
+ */
+int main (int argc, char** argv)
+{
+  /* random seed and run number; adjust these to change random draws */
+  RngSeedManager::SetSeed(1);
+  RngSeedManager::SetRun(3);
+
+  /* nodes and positions */
+  NodeContainer spectrumAnalyzerNodes;
+  spectrumAnalyzerNodes.Create (1);
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> nodePositionList = CreateObject<ListPositionAllocator> ();
+  Vector coordinates = GeographicPositions::GeographicToCartesianCoordinates (48.86, 
+                                                                              2.35, 
+                                                                              0,
+                                                                              GeographicPositions::SPHERE);
+  nodePositionList->Add (coordinates); // spectrum analyzer
+  mobility.SetPositionAllocator (nodePositionList);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (spectrumAnalyzerNodes);
+
+  /* channel and propagation */
+  SpectrumChannelHelper channelHelper = SpectrumChannelHelper::Default ();
+  channelHelper.SetChannel ("ns3::MultiModelSpectrumChannel");
+  Ptr<SpectrumChannel> channel = channelHelper.Create ();
+  
+  /* TV transmitter setup */
+  TvSpectrumTransmitterHelper tvTransHelper;
+  tvTransHelper.SetChannel (channel);
+  tvTransHelper.SetAttribute ("StartingTime", TimeValue (Seconds (0.1)));
+  tvTransHelper.SetAttribute ("TransmitDuration", TimeValue (Seconds (0.1)));
+  // 7.96 dBm/Hz from 50 kW ERP transmit power, flat 8 MHz PSD spectrum assumed for this approximation 
+  tvTransHelper.SetAttribute ("BasePsd", DoubleValue (7.96));
+  tvTransHelper.SetAttribute ("TvType", EnumValue (TvSpectrumTransmitter::TVTYPE_COFDM));
+  tvTransHelper.SetAttribute ("Antenna", StringValue ("ns3::IsotropicAntennaModel"));
+
+  tvTransHelper.AssignStreams (300);
+  tvTransHelper.CreateRegionalTvTransmitters(TvSpectrumTransmitterHelper::REGION_EUROPE, 
+                                             TvSpectrumTransmitterHelper::DENSITY_MEDIUM, 
+                                             48.86, 
+                                             2.35, 
+                                             0,
+                                             250000);
+
+  /* frequency range for spectrum analyzer */
+  std::vector<double> freqs;
+  for (int i = 0; i < 6860; i = i + 5)
+    {
+      freqs.push_back ((i + 1740) * 1e5);
+    }
+  Ptr<SpectrumModel> spectrumAnalyzerFreqModel = Create<SpectrumModel> (freqs);
+
+  /* spectrum analyzer setup */
+  SpectrumAnalyzerHelper spectrumAnalyzerHelper;
+  spectrumAnalyzerHelper.SetChannel (channel);
+  spectrumAnalyzerHelper.SetRxSpectrumModel (spectrumAnalyzerFreqModel);
+  spectrumAnalyzerHelper.SetPhyAttribute ("NoisePowerSpectralDensity", DoubleValue (4.14e-21)); // approx -174 dBm/Hz
+  spectrumAnalyzerHelper.EnableAsciiAll ("spectrum-analyzer-tv-sim-regional");
+  NetDeviceContainer spectrumAnalyzerDevices = spectrumAnalyzerHelper.Install (spectrumAnalyzerNodes);
+
+  Simulator::Stop (Seconds (0.4));
+
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+
+  std::cout << "simulation done!" << std::endl;
+  std::cout << "see spectrum analyzer output file" << std::endl;
+
+  return 0;
+}
--- a/src/spectrum/examples/wscript	Wed Apr 08 19:42:20 2015 -0700
+++ b/src/spectrum/examples/wscript	Wed Apr 08 19:45:39 2015 -0700
@@ -13,4 +13,10 @@
                                  ['spectrum', 'mobility', 'internet', 'applications'])
     obj.source = 'adhoc-aloha-ideal-phy-with-microwave-oven.cc'
 
+    obj = bld.create_ns3_program('tv-trans-example',
+                                 ['spectrum', 'mobility', 'core'])
+    obj.source = 'tv-trans-example.cc'
 
+    obj = bld.create_ns3_program('tv-trans-regional-example',
+                                 ['spectrum', 'mobility', 'core'])
+    obj.source = 'tv-trans-regional-example.cc'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/helper/tv-spectrum-transmitter-helper.cc	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,448 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/log.h>
+#include <cmath>
+#include <list>
+#include <vector>
+#include <ns3/uinteger.h>
+#include <ns3/double.h>
+#include <ns3/isotropic-antenna-model.h>
+#include <ns3/mobility-helper.h>
+#include <ns3/position-allocator.h>
+#include <ns3/geographic-positions.h>
+#include "tv-spectrum-transmitter-helper.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitterHelper");
+
+// NORTH AMERICA: 84 elements (index 0 - 83); valid channels = 2 - 83
+const int northAmericaArrayLength = 84;
+const double northAmericaStartFrequencies[84] = {0, 0, 54e6, 60e6, 66e6, 76e6, 
+  82e6, 174e6, 180e6, 186e6, 192e6, 198e6, 204e6, 210e6, 470e6, 476e6, 482e6, 
+  488e6, 494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 
+  554e6, 560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 
+  620e6, 626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 
+  686e6, 692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 
+  752e6, 758e6, 764e6, 770e6, 776e6, 782e6, 788e6, 794e6, 800e6, 806e6, 812e6, 
+  818e6, 824e6, 830e6, 836e6, 842e6, 848e6, 854e6, 860e6, 866e6, 872e6, 878e6, 
+  884e6};
+const double northAmericaEndFrequencies[84] = {0, 0, 60e6, 66e6, 72e6, 82e6, 
+  88e6, 180e6, 186e6, 192e6, 198e6, 204e6, 210e6, 216e6, 476e6, 482e6, 488e6, 
+  494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 
+  560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 
+  626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 
+  692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 
+  758e6, 764e6, 770e6, 776e6, 782e6, 788e6, 794e6, 800e6, 806e6, 812e6, 818e6, 
+  824e6, 830e6, 836e6, 842e6, 848e6, 854e6, 860e6, 866e6, 872e6, 878e6, 884e6, 
+  890e6};
+
+// EUROPE: 70 elements (index 0 - 69); valid channels = 5 - 12, 21 - 69
+const int europeArrayLength = 70;
+const double europeStartFrequencies[70] = {0, 0, 0, 0, 0, 174e6, 181e6, 188e6, 
+  195e6, 202e6, 209e6, 216e6, 223e6, 0, 0, 0, 0, 0, 0, 0, 0, 470e6, 478e6, 
+  486e6, 494e6, 502e6, 510e6, 518e6, 526e6, 534e6, 542e6, 550e6, 558e6, 566e6, 
+  574e6, 582e6, 590e6, 598e6, 606e6, 614e6, 622e6, 630e6, 638e6, 646e6, 654e6, 
+  662e6, 670e6, 678e6, 686e6, 694e6, 702e6, 710e6, 718e6, 726e6, 734e6, 742e6, 
+  750e6, 758e6, 766e6, 774e6, 782e6, 790e6, 798e6, 806e6, 814e6, 822e6, 830e6, 
+  838e6, 846e6, 854e6};
+const double europeEndFrequencies[70] = {0, 0, 0, 0, 0, 181e6, 188e6, 195e6, 
+  202e6, 209e6, 216e6, 223e6, 230e6, 0, 0, 0, 0, 0, 0, 0, 0, 478e6, 486e6, 
+  494e6, 502e6, 510e6, 518e6, 526e6, 534e6, 542e6, 550e6, 558e6, 566e6, 574e6, 
+  582e6, 590e6, 598e6, 606e6, 614e6, 622e6, 630e6, 638e6, 646e6, 654e6, 662e6, 
+  670e6, 678e6, 686e6, 694e6, 702e6, 710e6, 718e6, 726e6, 734e6, 742e6, 750e6, 
+  758e6, 766e6, 774e6, 782e6, 790e6, 798e6, 806e6, 814e6, 822e6, 830e6, 838e6, 
+  846e6, 854e6, 862e6};
+
+// JAPAN: 63 elements (index 0 - 62); valid channels = 1 - 62
+const int japanArrayLength = 63;
+const double japanStartFrequencies[63] = {0, 90e6, 96e6, 102e6, 170e6, 176e6, 
+  182e6, 188e6, 192e6, 198e6, 204e6, 210e6, 216e6, 470e6, 476e6, 482e6, 488e6, 
+  494e6, 500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 
+  560e6, 566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 
+  626e6, 632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 
+  692e6, 698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 
+  758e6, 764e6};
+const double japanEndFrequencies[63] = {0, 96e6, 102e6, 108e6, 176e6, 182e6, 
+  188e6, 194e6, 198e6, 204e6, 210e6, 216e6, 222e6, 476e6, 482e6, 488e6, 494e6, 
+  500e6, 506e6, 512e6, 518e6, 524e6, 530e6, 536e6, 542e6, 548e6, 554e6, 560e6, 
+  566e6, 572e6, 578e6, 584e6, 590e6, 596e6, 602e6, 608e6, 614e6, 620e6, 626e6, 
+  632e6, 638e6, 644e6, 650e6, 656e6, 662e6, 668e6, 674e6, 680e6, 686e6, 692e6, 
+  698e6, 704e6, 710e6, 716e6, 722e6, 728e6, 734e6, 740e6, 746e6, 752e6, 758e6, 
+  764e6, 770e6};
+
+TvSpectrumTransmitterHelper::TvSpectrumTransmitterHelper ()
+  : m_channel (0),
+    m_channelNumber (0),
+    m_uniRand (CreateObject<UniformRandomVariable> ())
+{
+  NS_LOG_FUNCTION (this);
+  m_factory.SetTypeId ("ns3::TvSpectrumTransmitter");
+}
+
+TvSpectrumTransmitterHelper::~TvSpectrumTransmitterHelper ()
+{
+  m_channel = 0;
+  m_uniRand = 0;
+  NS_LOG_FUNCTION (this);
+}
+
+void
+TvSpectrumTransmitterHelper::SetChannel (Ptr<SpectrumChannel> c)
+{
+  NS_LOG_FUNCTION (this << c);
+  m_channel = c;
+}
+
+void
+TvSpectrumTransmitterHelper::SetAttribute (std::string name, const AttributeValue &val)
+{
+  m_factory.Set (name, val);
+  if (name.compare ("ChannelNumber") == 0)
+    {
+      const AttributeValue * aval = &val;
+      const UintegerValue * ival;
+      ival = dynamic_cast<const UintegerValue *> (aval);
+      m_channelNumber = (uint16_t) ival->Get (); // store channel number
+    }
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::Install (NodeContainer nodeCont)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+    }
+  return devCont;
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::Install (NodeContainer nodeCont, Region region)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  double startFrequency;
+  double channelBandwidth;
+  if (region == REGION_NORTH_AMERICA)
+    {
+      startFrequency = northAmericaStartFrequencies[m_channelNumber];    
+      channelBandwidth = northAmericaEndFrequencies[m_channelNumber] - 
+                         northAmericaStartFrequencies[m_channelNumber];
+    }
+  else if (region == REGION_EUROPE)
+    {
+      startFrequency = europeStartFrequencies[m_channelNumber];    
+      channelBandwidth = europeEndFrequencies[m_channelNumber] - 
+                         europeStartFrequencies[m_channelNumber];
+    }
+  else if (region == REGION_JAPAN)
+    {
+      startFrequency = japanStartFrequencies[m_channelNumber];    
+      channelBandwidth = japanEndFrequencies[m_channelNumber] - 
+                         japanStartFrequencies[m_channelNumber];
+    }
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->SetAttribute ("StartFrequency", DoubleValue (startFrequency));
+      phy->SetAttribute ("ChannelBandwidth", DoubleValue (channelBandwidth));
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+    }
+  return devCont;
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::InstallAdjacent (NodeContainer nodeCont)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  int index = 0;
+  DoubleValue startFrequency;
+  DoubleValue channelBandwidth;
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->GetAttribute ("StartFrequency", startFrequency);
+      phy->GetAttribute ("ChannelBandwidth", channelBandwidth);
+      phy->SetAttribute ("StartFrequency", DoubleValue (startFrequency.Get () + 
+                         (index * channelBandwidth.Get ())));
+      phy->SetAttribute ("ChannelNumber", UintegerValue (m_channelNumber + index));
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+      index++;
+    }
+  return devCont;
+}
+
+
+NetDeviceContainer
+TvSpectrumTransmitterHelper::InstallAdjacent (NodeContainer nodeCont, Region region)
+{
+  NS_LOG_FUNCTION (this);
+  NetDeviceContainer devCont;
+  double startFrequency;
+  double channelBandwidth;
+  int index = 0;
+  //iterate over node container to make one transmitter for each given node
+  for (NodeContainer::Iterator i = nodeCont.Begin (); i != nodeCont.End (); ++i)
+    {
+      if (region == REGION_NORTH_AMERICA)
+        {
+          startFrequency = northAmericaStartFrequencies[m_channelNumber + index];    
+          channelBandwidth = northAmericaEndFrequencies[m_channelNumber + index] 
+                             - northAmericaStartFrequencies[m_channelNumber + index];
+        }
+      else if (region == REGION_EUROPE)
+        {
+          startFrequency = europeStartFrequencies[m_channelNumber + index];    
+          channelBandwidth = europeEndFrequencies[m_channelNumber + index] - 
+                             europeStartFrequencies[m_channelNumber + index];
+        }
+      else if (region == REGION_JAPAN)
+        {
+          startFrequency = japanStartFrequencies[m_channelNumber + index];    
+          channelBandwidth = japanEndFrequencies[m_channelNumber + index] - 
+                             japanStartFrequencies[m_channelNumber + index];
+        }
+      Ptr<Node> node = *i;
+      Ptr<TvSpectrumTransmitter> phy = m_factory.Create ()->GetObject<TvSpectrumTransmitter> ();
+      phy->SetAttribute ("StartFrequency", DoubleValue (startFrequency));
+      phy->SetAttribute ("ChannelBandwidth", DoubleValue (channelBandwidth));
+      phy->SetAttribute ("ChannelNumber", UintegerValue (m_channelNumber + index));      
+      phy->CreateTvPsd ();
+      Ptr<NonCommunicatingNetDevice> dev = CreateObject<NonCommunicatingNetDevice> ();
+      NS_ASSERT (phy);
+      dev->SetPhy (phy);
+      NS_ASSERT (node);
+      phy->SetMobility (node->GetObject<MobilityModel> ());
+      NS_ASSERT (dev);
+      phy->SetDevice (dev);
+      NS_ASSERT (m_channel);
+      phy->SetChannel (m_channel);
+      dev->SetChannel (m_channel);
+      node->AddDevice (dev);
+      devCont.Add (dev);
+      phy->Start ();
+      index++;
+    }
+  return devCont;
+}
+
+
+int64_t
+TvSpectrumTransmitterHelper::AssignStreams (int64_t streamNum)
+{
+  m_uniRand->SetStream (streamNum);
+  return 1;
+}
+
+
+void
+TvSpectrumTransmitterHelper::CreateRegionalTvTransmitters (Region region, 
+                                                           Density density, 
+                                                           double originLatitude, 
+                                                           double originLongitude,
+                                                           double maxAltitude, 
+                                                           double maxRadius)
+{
+  NS_LOG_FUNCTION (this);
+  std::list<int> transmitterIndicesToCreate;
+  if (region == REGION_NORTH_AMERICA)
+    {
+      transmitterIndicesToCreate = GenerateRegionalTransmitterIndices 
+                                   (northAmericaStartFrequencies, 
+                                    northAmericaArrayLength, 
+                                    density);
+    }
+  else if (region == REGION_EUROPE)
+    {
+      transmitterIndicesToCreate = GenerateRegionalTransmitterIndices 
+                                   (europeStartFrequencies, 
+                                    europeArrayLength, 
+                                    density);
+    }
+  else if (region == REGION_JAPAN)
+    {
+      transmitterIndicesToCreate = GenerateRegionalTransmitterIndices 
+                                   (japanStartFrequencies, 
+                                    japanArrayLength, 
+                                    density);
+    }
+  std::list<Vector> tvTransmitterLocations = 
+    GeographicPositions::RandCartesianPointsAroundGeographicPoint (originLatitude, 
+                                                                   originLongitude, 
+                                                                   maxAltitude,
+                                                                   transmitterIndicesToCreate.size(), 
+                                                                   maxRadius,
+                                                                   m_uniRand);
+  InstallRandomRegionalTransmitters (region, 
+                                     transmitterIndicesToCreate, 
+                                     tvTransmitterLocations);
+}
+
+
+std::list<int>
+TvSpectrumTransmitterHelper::GenerateRegionalTransmitterIndices (const double startFrequencies[], 
+                                                                 const int startFrequenciesLength, 
+                                                                 Density density)
+{
+  std::vector<double> startFreqVector; //stores all non-zero start frequencies
+  for (int i = 0; i < startFrequenciesLength; i++)
+    {
+      double element = startFrequencies[i];
+      //add all non-zero frequencies to vector (0 means unused channel)
+      if (element != 0) startFreqVector.push_back(element);
+    }
+
+  //randomly generate number of transmitters to create based on density
+  uint32_t freqVectorSize = startFreqVector.size();
+  int randNumTransmitters = GetRandomNumTransmitters (density, freqVectorSize);
+ 
+  //stores start frequencies that transmitters will be created to transmit
+  std::vector<double> transmitterStartFreqsToCreate; 
+  for (int i = 0; i < randNumTransmitters; i++)
+    {
+      //get random index from start frequency vector
+      uint32_t randIndex = m_uniRand->GetInteger (0, startFreqVector.size () - 1);
+      //add start frequency corresponding to random index to vector 
+      transmitterStartFreqsToCreate.push_back(startFreqVector[randIndex]); 
+      //remove selected start frequency from vector so it is not selected again
+      startFreqVector.erase(startFreqVector.begin() + randIndex); 
+    }
+
+  //find indices on startFrequencies[] containing each start frequency that is 
+  //selected to be transmitted and add to list
+  std::list<int> transmitterIndicesToCreate;
+  for (int i = 0; i < (int)transmitterStartFreqsToCreate.size(); i++)
+    {
+      for (int channelNumberIndex = 0; 
+           channelNumberIndex < startFrequenciesLength; channelNumberIndex++)
+        {
+          if (startFrequencies[channelNumberIndex] == transmitterStartFreqsToCreate[i])
+            {
+              transmitterIndicesToCreate.push_back(channelNumberIndex);
+              break;
+            }
+        }
+    }
+  return transmitterIndicesToCreate;
+}
+
+
+int
+TvSpectrumTransmitterHelper::GetRandomNumTransmitters (Density density,
+                                                       uint32_t numChannels)
+{
+  int numTransmitters;
+  if (density == DENSITY_LOW)
+    {
+      numTransmitters = m_uniRand->GetInteger (1, ceil (0.33 * numChannels));
+    }
+  else if (density == DENSITY_MEDIUM)
+    {
+      numTransmitters = m_uniRand->GetInteger (ceil (0.33 * numChannels) + 1, ceil (0.66 * numChannels));
+    }  
+  else
+    {
+      numTransmitters = m_uniRand->GetInteger (ceil (0.66 * numChannels) + 1, numChannels);
+    }  
+  return numTransmitters;
+}
+
+
+void
+TvSpectrumTransmitterHelper::InstallRandomRegionalTransmitters (Region region, 
+                                                                std::list<int> transmitterIndicesToCreate, 
+                                                                std::list<Vector> transmitterLocations)
+{
+  int numTransmitters = (int)transmitterIndicesToCreate.size();
+  for (int transNum = 0; transNum < numTransmitters; transNum++)
+    {
+      Ptr<ListPositionAllocator> nodePosition = CreateObject<ListPositionAllocator> ();
+      // add generated coordinate point to node position
+      nodePosition->Add (transmitterLocations.front()); 
+      MobilityHelper mobility;
+      mobility.SetPositionAllocator (nodePosition);
+      mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+      NodeContainer tvNode; // contains position of transmitter to be created
+      tvNode.Create (1);
+      mobility.Install (tvNode);
+      // set channel number for this transmitter
+      m_channelNumber = (uint16_t) transmitterIndicesToCreate.front(); 
+      Install (tvNode, region); //install tv transmitter
+      transmitterLocations.pop_front(); // remove created transmitter location
+      transmitterIndicesToCreate.pop_front(); // remove created transmitter index
+    }
+}
+
+} // namespace ns3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/helper/tv-spectrum-transmitter-helper.h	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,328 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#ifndef TV_SPECTRUM_TRANSMITTER_HELPER_H
+#define TV_SPECTRUM_TRANSMITTER_HELPER_H
+
+#include <ns3/spectrum-value.h>
+#include <ns3/spectrum-phy.h>
+#include <ns3/spectrum-channel.h>
+#include <ns3/antenna-model.h>
+#include <ns3/spectrum-signal-parameters.h>
+#include <ns3/mobility-model.h>
+#include <ns3/net-device.h>
+#include <ns3/net-device-container.h>
+#include <ns3/node-container.h>
+#include <ns3/non-communicating-net-device.h>
+#include <ns3/random-variable-stream.h>
+#include <ns3/tv-spectrum-transmitter.h>
+#include "ns3/object-factory.h"
+
+namespace ns3
+{
+
+/**
+ * \ingroup spectrum
+ *
+ * Helper class which uses TvSpectrumTransmitter class to create customizable 
+ * TV transmitter(s) that transmit PSD spectrum specified by user-set attributes.
+ * Has functionality to create TV transmitter(s) with actual frequencies of 
+ * specific geographic regions.
+ * Provides method to create a random set of transmitters within a given region 
+ * and location.
+ *
+ * Here is an example of how to use this class:
+ *
+ * TvSpectrumTransmitterHelper tvTransHelper;
+ * tvTransHelper.SetChannel (channel); // provided that user has a Ptr<SpectrumChannel> ready.
+ * tvTransHelper.SetAttribute ("StartFrequency", DoubleValue (524e6));
+ * tvTransHelper.SetAttribute ("ChannelBandwidth", DoubleValue (6e6));
+ * tvTransHelper.SetAttribute ("StartingTime", TimeValue (Seconds (0)));
+ * tvTransHelper.SetAttribute ("TransmitDuration", TimeValue (Seconds (0.2)));
+ * tvTransHelper.SetAttribute ("BasePsd", DoubleValue (22.22)); 
+ * tvTransHelper.SetAttribute ("TvType", EnumValue (TvSpectrumTransmitter::TVTYPE_8VSB));
+ * tvTransHelper.SetAttribute ("Antenna", StringValue ("ns3::IsotropicAntennaModel"));
+ * tvTransHelper.Install (tvTransmitterNode); //provided that user has a NodeContainer ready.
+ */
+class TvSpectrumTransmitterHelper
+{
+
+public:
+  /**
+   * geographical region that TV transmitters are being set up in
+   */
+  enum Region
+  {
+    REGION_NORTH_AMERICA,
+    REGION_JAPAN,
+    REGION_EUROPE
+  };
+
+  /**
+   * density of location that TV transmitters are being set up in
+   */
+  enum Density
+  {
+    DENSITY_LOW,
+    DENSITY_MEDIUM,
+    DENSITY_HIGH
+  };
+  
+  TvSpectrumTransmitterHelper (); //!< Default constructor
+  virtual ~TvSpectrumTransmitterHelper (); //!< Destructor
+
+  /** 
+   * Set the spectrum channel for the device(s) to transmit on
+   * 
+   * @param c a pointer to the spectrum channel
+   */
+  void SetChannel (Ptr<SpectrumChannel> c);
+
+  /** 
+   * Set attribute for each TvSpectrumTransmitter instance to be created 
+   * 
+   * @param name the name of the attribute to set
+   * @param val the value of the attribute to set
+   */
+  void SetAttribute (std::string name, const AttributeValue &val);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * If multiple transmitters created, all will have same settings (frequency, 
+   * PSD, etc.) except for position/location, which depends on the positions 
+   * in the input NodeContainer.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer Install (NodeContainer nodes);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * Must set ChannelNumber attribute to select the TV channel in the 
+   * user-selected region that the transmitter(s) will be modeled after.
+   * If ChannelNumber attribute is not set by the user, it defaults to 5.
+   * If multiple transmitters created, all will have same settings (frequency, 
+   * PSD, etc.) except for position/location, which depends on the positions 
+   * in the input NodeContainer.
+   * Transmitter(s) will be created with the frequencies corresponding to the 
+   * channel numbers of the user-selected region.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   * @param region the region of which the transmitter(s) will be characterized
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer Install (NodeContainer nodes, Region region);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Consecutively created transmitters (consecutive in input NodeContainer) 
+   * will have adjacent channels, i.e. a transmitter's frequency spectrum will 
+   * border (but not overlap) the frequency spectrum of the transmitter created 
+   * directly before it and the transmitter created directly after it.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * If multiple transmitters created, they will have same settings except for 
+   * frequency, channel number, and position/location.
+   * Channel number will be incremented by 1 for each node, and start frequency 
+   * will be incremented by the channel bandwidth that is set.
+   * For example, if two nodes are given as inputs to InstallAdjacent with 
+   * start frequency set to 500 MHz, channel bandwidth set to 6 MHz, and 
+   * channel number set to 19, the first node will be a transmitter set as 
+   * channel 19 ranging from 500 MHz to 506 MHz and the second node will be a 
+   * transmitter set as channel 20 ranging from 506 MHz to 512 MHz.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer InstallAdjacent (NodeContainer nodes);
+
+  /** 
+   * Set up and start the TV Transmitter's transmission on the spectrum channel.
+   * Consecutively created transmitters (consecutive in input NodeContainer) 
+   * will have adjacent channels, with the frequency spectrum and bandwidth of 
+   * each channel determined by the user-selected region.
+   * Creates one TV Transmitter for each node given as an input, with settings 
+   * selected from attributes.
+   * Use SetAttribute() to select settings for the TV Transmitter(s).
+   * Must set ChannelNumber attribute to select the TV channel in the 
+   * user-selected region that the first created transmitter will be modeled 
+   * after.
+   * Each subsequently created transmitter will be modeled after the channel 
+   * number following the previous one, for example if the first created 
+   * transmitter is modeled after channel 1, the next one created will be 
+   * modeled after channel 2.
+   * If ChannelNumber attribute is not set by the user, it defaults to 5.
+   * If multiple transmitters created, they will have same settings except for 
+   * frequency, channel number, and position/location.
+   * Channel number will be incremented by 1 for each node, and start frequency 
+   * will be incremented by the channel bandwidth according to the 
+   * user-selected region.
+   * Transmitter(s) will be created with the frequencies corresponding to the 
+   * channel numbers of the user-selected region.
+   *
+   * @param nodes a container containing the node(s) which the TV 
+   * transmitter(s) will be attached to
+   * @param region the region of which the transmitter(s) will be characterized
+   *
+   * @return a device container which contains all the devices created by this 
+   * method
+   */
+  NetDeviceContainer InstallAdjacent (NodeContainer nodes, Region region);
+
+  /**
+   * Assigns the stream number for the uniform random number generator to use
+   *
+   * @param stream first stream index to use
+   * @return the number of stream indices assigned by this helper
+   */
+  int64_t AssignStreams (int64_t streamNum);
+
+  /**
+   * Generates and installs (starts transmission on the spectrum channel) a 
+   * random number of TV transmitters with channel frequencies corresponding 
+   * to the given region at random locations on or above earth. 
+   * The generated transmitters are located at randomly selected points within a 
+   * given altitude above earth's surface centered around a given origin point 
+   * (on earth's surface) within a given distance radius, corresponding to a 
+   * uniform distribution.
+   * Distance radius is measured as if all points are on earth's surface
+   * (with altitude = 0).
+   * Assumes earth is a perfect sphere.
+   * The given region's channel numbers that the generated TV transmitters' 
+   * frequency spectra are modeled after are uniformly selected at random.
+   * These channel numbers are never repeated.
+   * The number of transmitters generated is uniformly random based on given 
+   * density.
+   * Each transmitter has BasePsd and TvType set from SetAttribute(), which 
+   * should be set before calling this method.
+   * 
+   * @param region the region that the transmitters are in
+   * @param density the density (high, medium, or low) of the location being 
+   * simulated, which determines how many transmitters are created and how many 
+   * channels are occupied. Low density will generate between one and one third 
+   * of the number of TV channels in the given region, medium density will 
+   * generate between one third and two thirds, and high density will generate 
+   * between two thirds and all of the channels.
+   * @param originLatitude origin point latitude in degrees
+   * @param originLongitude origin point longitude in degrees
+   * @param maxAltitude maximum altitude in meters above earth's surface with
+   * which random points can be generated
+   * @param maxRadius max distance in meters from origin with which random 
+   * transmitters can be generated (all transmitters are less than or equal to 
+   * this distance from the origin, relative to points being on earth's surface)
+   */
+  void CreateRegionalTvTransmitters (Region region, 
+                                     Density density, 
+                                     double originLatitude, 
+                                     double originLongitude, 
+                                     double maxAltitude,
+                                     double maxRadius);
+
+
+private:
+  Ptr<SpectrumChannel> m_channel; //!< Pointer to spectrum channel object
+
+  /**
+   * Generates random indices of given region frequency array (ignoring indices 
+   * referring to invalid channels).
+   * Number of indices generated (which is number of TV transmitters to be 
+   * created) is random based on given density.
+   * Indices generated refer to frequencies that TV transmitters will be 
+   * created with.
+   * 
+   * @param startFrequencies array containing all channel start frequencies for 
+   * a particular region
+   * @param startFrequenciesLength number of elements in startFrequencies array
+   * @param density the density (high, medium, or low) of the location being 
+   * simulated, which determines how many transmitters are created
+   *
+   * @return a list contaning the indices in startFrequencies that transmitters 
+   * will be created for
+   */
+  std::list<int> GenerateRegionalTransmitterIndices (const double startFrequencies[], 
+                                                     const int startFrequenciesLength, 
+                                                     Density density);
+  
+  /**
+   * Randomly generates the number of TV transmitters to be created based on 
+   * given density and number of possible TV channels. 
+   * Low density will generate a transmitter for between one (a single 
+   * transmitter) and one third of the number of possible channels, medium 
+   * density will generate a transmitter for between one third and two thirds, 
+   * and high density will generate a transmitter for between two thirds and all 
+   * of the possible channels. 
+   * These ratios are approximated in the implementation, but there is no 
+   * overlap possible in the number of transmitters generated between adjacent 
+   * densities. 
+   * For example, given 60 possible channels, for low density between 1 and 20 
+   * transmitters can be created, for medium density between 21 and 40 
+   * transmitters can be created, and for high density between 41 and 60 
+   * transmitters can be created (all inclusive).
+   * 
+   * @param density the density (high, medium, or low) of the location being 
+   * simulated
+   * @param numChannels the number of possible TV channels in the region being 
+   * simulated
+   *
+   * @return the number of TV transmitters that will be created
+   */
+  int GetRandomNumTransmitters (Density density, uint32_t numChannels);
+
+  /**
+   * Installs each randomly generated regional TV transmitter
+   * 
+   * @param region the region that the transmitters are in
+   * @param transmitterIndicesToCreate a list contaning the channel number 
+   * indices (for region's start frequencies array) that transmitters will be 
+   * created for; this is returned from GenerateRegionalTransmitterIndices()
+   * @param transmitterLocations a list containing the vectors 
+   * (x, y, z location) of each TV transmitter to be generated; this is 
+   * returned from RandGeographicCoordsAroundPoint()
+   */
+  void InstallRandomRegionalTransmitters (Region region, 
+                                          std::list<int> transmitterIndicesToCreate, 
+                                          std::list<Vector> transmitterLocations);
+
+  ObjectFactory m_factory; //!< Object factory for attribute setting
+  uint16_t m_channelNumber; //!< Channel number of TV transmitter to be created
+  Ptr<UniformRandomVariable> m_uniRand; //!< Object to generate uniform random numbers
+
+};
+
+} // namespace ns3
+
+#endif /* TV_SPECTRUM_TRANSMITTER_HELPER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/model/tv-spectrum-transmitter.cc	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,591 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/log.h>
+#include <ns3/simulator.h>
+#include <ns3/enum.h>
+#include <ns3/uinteger.h>
+#include <ns3/double.h>
+#include <ns3/integer.h>
+#include <ns3/string.h>
+#include <ns3/pointer.h>
+#include <ns3/isotropic-antenna-model.h>
+#include <ns3/antenna-model.h>
+#include <cmath>
+#include "tv-spectrum-transmitter.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitter");
+
+NS_OBJECT_ENSURE_REGISTERED (TvSpectrumTransmitter);
+
+TvSpectrumTransmitter::TvSpectrumTransmitter ()
+  : m_mobility (0),
+    m_antenna (CreateObject<IsotropicAntennaModel> ()),
+    m_netDevice (0),
+    m_channel (0),
+    m_tvType (TVTYPE_8VSB),
+    m_startFrequency (500e6),
+    m_channelBandwidth (6e6),
+    m_channelNumber (0),
+    m_basePsd (20),
+    m_txPsd (0),
+    m_startingTime (Seconds (0)),
+    m_transmitDuration (Seconds (0.2)),
+    m_active (false)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TvSpectrumTransmitter::~TvSpectrumTransmitter ()
+{
+  m_mobility = 0;
+  m_antenna = 0;
+  m_netDevice = 0;
+  m_channel = 0;
+  m_txPsd = 0;
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+TvSpectrumTransmitter::GetTypeId(void)
+{
+  static TypeId tid = TypeId("ns3::TvSpectrumTransmitter")
+    .SetParent<SpectrumPhy> ()
+    .AddConstructor<TvSpectrumTransmitter> ()
+    .AddAttribute ("TvType",
+                   "The type of TV transmitter/modulation to be used.",
+                   EnumValue (TvSpectrumTransmitter::TVTYPE_8VSB),
+                   MakeEnumAccessor (&TvSpectrumTransmitter::m_tvType),
+                   MakeEnumChecker (TvSpectrumTransmitter::TVTYPE_8VSB, "8vsb",
+                                    TvSpectrumTransmitter::TVTYPE_COFDM, "cofdm",
+                                    TvSpectrumTransmitter::TVTYPE_ANALOG, "analog"))
+    .AddAttribute ("StartFrequency",
+                   "The lower end frequency (in Hz) of the TV transmitter's "
+                   "signal. Must be greater than or equal to 0.",
+                   DoubleValue (500e6),
+                   MakeDoubleAccessor (&TvSpectrumTransmitter::m_startFrequency),
+                   MakeDoubleChecker<double> (0, std::numeric_limits<double>::max ()))
+    .AddAttribute ("ChannelBandwidth",
+                   "The bandwidth (in Hz) of the TV transmitter's signal. Must "
+                   "be greater than or equal to 0.",
+                   DoubleValue (6e6),
+                   MakeDoubleAccessor (&TvSpectrumTransmitter::m_channelBandwidth),
+                   MakeDoubleChecker<double> (0, std::numeric_limits<double>::max ()))
+    .AddAttribute ("ChannelNumber",
+                   "The channel number to name the TV transmitter (channel 0, "
+                   "1, 2, 3, etc.). Must be greater than or equal to 0. This "
+                   "is only required to be set when setting up regional "
+                   "transmitters from TvSpectrumTransmitterHelper class using "
+                   "methods that take Region as an argument (i.e. the "
+                   "TvSpectrumTransmitterHelper::CreateRegionalTvTransmitters method).",
+                   UintegerValue (5),
+                   MakeUintegerAccessor (&TvSpectrumTransmitter::m_channelNumber),
+                   MakeUintegerChecker<uint16_t> (0, std::numeric_limits<uint16_t>::max ()))
+    .AddAttribute ("BasePsd",
+                   "The base power spectral density (in dBm/Hz) of the TV "
+                   "transmitter's transmitted spectrum. Base PSD is the "
+                   "maximum PSD of the spectrum excluding pilots. For analog "
+                   "and COFDM transmitters this is the maximum PSD, but for "
+                   "8-VSB transmitters this is the maximum PSD of the main "
+                   "signal spectrum (flat-top segment) since the pilot "
+                   "actually has the maximum PSD overall.",
+                   DoubleValue (20),
+                   MakeDoubleAccessor (&TvSpectrumTransmitter::m_basePsd),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("Antenna",
+                   "The AntennaModel to be used. Allows classes inherited "
+                   "from ns3::AntennaModel. Defaults to ns3::IsotropicAntennaModel.",
+                   StringValue ("ns3::IsotropicAntennaModel"),
+                   MakePointerAccessor (&TvSpectrumTransmitter::m_antenna),
+                   MakePointerChecker<AntennaModel> ())
+    .AddAttribute ("StartingTime",
+                   "The time point after the simulation begins in which the TV "
+                   "transmitter will begin transmitting.",
+                   TimeValue (Seconds (0)),
+                   MakeTimeAccessor (&TvSpectrumTransmitter::m_startingTime),
+                   MakeTimeChecker ())
+    .AddAttribute ("TransmitDuration",
+                   "The duration of time that the TV transmitter will transmit for.",
+                   TimeValue (Seconds (0.2)),
+                   MakeTimeAccessor (&TvSpectrumTransmitter::m_transmitDuration),
+                   MakeTimeChecker ())
+  ;
+  return tid;
+}
+
+void
+TvSpectrumTransmitter::SetChannel (Ptr<SpectrumChannel> c)
+{
+  NS_LOG_FUNCTION (this << c);
+  m_channel = c;
+}
+
+void
+TvSpectrumTransmitter::SetMobility (Ptr<MobilityModel> m)
+{
+  NS_LOG_FUNCTION (this << m);
+  m_mobility = m;
+}
+
+void
+TvSpectrumTransmitter::SetDevice (Ptr<NetDevice> d)
+{
+  NS_LOG_FUNCTION (this << d);
+  m_netDevice = d;
+}
+
+Ptr<MobilityModel>
+TvSpectrumTransmitter::GetMobility ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_mobility;
+}
+
+Ptr<NetDevice>
+TvSpectrumTransmitter::GetDevice ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_netDevice;
+}
+
+Ptr<const SpectrumModel>
+TvSpectrumTransmitter::GetRxSpectrumModel () const
+{
+  NS_LOG_FUNCTION (this);
+  return 0;
+}
+
+Ptr<AntennaModel>
+TvSpectrumTransmitter::GetRxAntenna ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_antenna;
+}
+
+void
+TvSpectrumTransmitter::StartRx (Ptr<SpectrumSignalParameters> params)
+{
+  NS_LOG_FUNCTION (this << params);
+}
+
+
+Ptr<SpectrumChannel>
+TvSpectrumTransmitter::GetChannel () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_channel;
+}
+
+// Used as key for map containing created spectrum models
+struct TvSpectrumModelId
+{
+  TvSpectrumModelId (double stFreq, double bwidth);
+  double startFrequency;
+  double bandwidth;
+};
+
+TvSpectrumModelId::TvSpectrumModelId (double stFreq, double bwidth)
+  : startFrequency (stFreq), 
+    bandwidth (bwidth)
+{
+}
+
+bool
+operator < (const TvSpectrumModelId& a, const TvSpectrumModelId& b)
+{
+  return ( (a.startFrequency < b.startFrequency) || 
+           ( (a.startFrequency == b.startFrequency) && (a.bandwidth < b.bandwidth) ) );
+}
+
+// Stores created spectrum models
+static std::map<TvSpectrumModelId, Ptr<SpectrumModel> > g_tvSpectrumModelMap;
+
+/** 
+ * 8-VSB PSD approximated from Figure 3 of the following article:
+ * Baron, Stanley. "First-Hand:Digital Television: The Digital Terrestrial 
+ * Television Broadcasting (DTTB) Standard." IEEE Global History Network.
+ * <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_
+ * Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
+ *
+ * COFDM PSD approximated from Figure 12 (8k mode) of the following article:
+ * Kopp, Carlo. "High Definition Television." High Definition Television. Air 
+ * Power Australia. <http://www.ausairpower.net/AC-1100.html>.
+ *
+ * Analog PSD approximated from Figure 4 of the following paper:
+ * Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. "Technical Challenges for 
+ * Cognitive Radio in the TV White Space Spectrum." Qualcomm Incorporated.
+ */
+void
+TvSpectrumTransmitter::CreateTvPsd ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_channelBandwidth != 0);
+  Ptr<SpectrumModel> model;
+  TvSpectrumModelId key (m_startFrequency, m_channelBandwidth);
+  std::map<TvSpectrumModelId, Ptr<SpectrumModel> >::iterator iter = g_tvSpectrumModelMap.find (key);
+  if (iter != g_tvSpectrumModelMap.end ())
+    {
+      model = iter->second; //set SpectrumModel to previously created one
+    }
+  else // no previously created SpectrumModel with same frequency and bandwidth
+    {
+      Bands bands;
+      double halfSubBand = 0.5 * (m_channelBandwidth / 100);
+      for (double fl = m_startFrequency - halfSubBand; fl <= (m_startFrequency - 
+           halfSubBand) + m_channelBandwidth; fl += m_channelBandwidth / 100)
+        {
+          BandInfo bi;
+          bi.fl = fl;
+          bi.fc = fl + halfSubBand;
+          bi.fh = fl + (2 * halfSubBand);
+          bands.push_back (bi);
+        }
+      model = Create<SpectrumModel> (bands);
+      g_tvSpectrumModelMap.insert (std::pair<TvSpectrumModelId, Ptr<SpectrumModel> > (key, model));
+    }
+  Ptr<SpectrumValue> psd = Create<SpectrumValue> (model);
+  double basePsdWattsHz = pow (10.0, (m_basePsd - 30) / 10.0); //convert dBm to W/Hz
+  switch (m_tvType)
+    {
+      case TVTYPE_8VSB:
+        {
+          for (int i = 0; i <= 100; i++)
+            {     
+              switch (i)
+                {  
+                  case 0: 
+                  case 100: 
+                    (*psd) [i] = 0.015 * basePsdWattsHz;
+                    break;
+                  case 1: 
+                  case 99: 
+                    (*psd) [i] = 0.019 * basePsdWattsHz;
+                    break;
+                  case 2: 
+                  case 98: 
+                    (*psd) [i] = 0.034 * basePsdWattsHz;
+                    break;
+                  case 3: 
+                  case 97: 
+                    (*psd) [i] = 0.116 * basePsdWattsHz;
+                    break;
+                  case 4: 
+                  case 96: 
+                    (*psd) [i] = 0.309 * basePsdWattsHz;
+                    break;
+                  case 5: 
+                    (*psd) [i] = (0.502 * basePsdWattsHz) + (21.577 * basePsdWattsHz); //pilot
+                    break;
+                  case 6: 
+                  case 94: 
+                    (*psd) [i] = 0.696 * basePsdWattsHz;
+                    break;
+                  case 7: 
+                  case 93: 
+                    (*psd) [i] = 0.913 * basePsdWattsHz;
+                    break;
+                  case 8: 
+                  case 92: 
+                    (*psd) [i] = 0.978 * basePsdWattsHz;
+                    break;
+                  case 9:
+                  case 91:  
+                    (*psd) [i] = 0.990 * basePsdWattsHz;
+                    break;
+                  case 95: 
+                    (*psd) [i] = 0.502 * basePsdWattsHz;
+                    break;
+                  default: 
+                    (*psd) [i] = basePsdWattsHz;
+                    break;
+                }  
+            }
+          break;
+        }
+      case TVTYPE_COFDM:
+        {
+          for (int i = 0; i <= 100; i++)
+            {
+              switch (i)
+                {
+                  case 0: 
+                  case 100: 
+                    (*psd) [i] = 1.52e-4 * basePsdWattsHz;
+                    break;
+                  case 1: 
+                  case 99: 
+                    (*psd) [i] = 2.93e-4 * basePsdWattsHz;
+                    break;
+                  case 2: 
+                  case 98: 
+                    (*psd) [i] = 8.26e-4 * basePsdWattsHz;
+                    break;
+                  case 3:
+                  case 97:  
+                    (*psd) [i] = 0.0927 * basePsdWattsHz;
+                    break;
+                  default: 
+                    (*psd) [i] = basePsdWattsHz;
+                    break;
+                }
+            }
+          break;
+        }
+      case TVTYPE_ANALOG:
+        {
+          for (int i = 0; i <= 100; i++)
+            {
+              switch (i)
+                {
+                  case 0:
+                  case 1:
+                  case 2:
+                  case 3:
+                    (*psd) [i] = 27.07946e-08 * basePsdWattsHz;
+                    break;
+                  case 4:
+                  case 5:
+                  case 6:
+                    (*psd) [i] = 2.51189e-07 * basePsdWattsHz;
+                    break;
+                  case 7:
+                  case 8:
+                  case 9:
+                    (*psd) [i] = 1e-06 * basePsdWattsHz;
+                    break;
+                  case 10:
+                  case 11:
+                  case 12:
+                    (*psd) [i] = 2.39883e-06 * basePsdWattsHz;
+                    break;
+                  case 13:
+                  case 14:
+                  case 15:
+                    (*psd) [i] = 5.62341e-06 * basePsdWattsHz;
+                    break;
+                  case 16:
+                  case 17:
+                  case 18:
+                    (*psd) [i] = 6.68344e-06 * basePsdWattsHz;
+                    break;
+                  case 19:
+                  case 20:
+                  case 21:
+                    (*psd) [i] = 1.25893e-05 * basePsdWattsHz;
+                    break;
+                  case 22:
+                  case 23:
+                  case 24:
+                    (*psd) [i] = 3.16228e-05 * basePsdWattsHz;
+                    break;
+                  case 25:
+                    (*psd) [i] = 0.000158489 * basePsdWattsHz;
+                    break;
+                  case 26:
+                    (*psd) [i] = basePsdWattsHz;
+                    break;
+                  case 27:
+                    (*psd) [i] = 7.49894e-05 * basePsdWattsHz;
+                    break;
+                  case 28:
+                  case 29:
+                  case 30:
+                    (*psd) [i] = 2.37137e-05 * basePsdWattsHz;
+                    break;
+                  case 31:
+                  case 32:
+                  case 33:
+                    (*psd) [i] = 1.14815e-05 * basePsdWattsHz;
+                    break;
+                  case 34:
+                  case 35:
+                  case 36:
+                    (*psd) [i] = 7.49894e-06 * basePsdWattsHz;
+                    break;
+                  case 37:
+                  case 38:
+                  case 39:
+                    (*psd) [i] = 5.62341e-06 * basePsdWattsHz;
+                    break;
+                  case 40:
+                  case 41:
+                  case 42:
+                    (*psd) [i] = 4.21697e-06 * basePsdWattsHz;
+                    break;
+                  case 43:
+                  case 44:
+                  case 45:
+                    (*psd) [i] = 3.16228e-06 * basePsdWattsHz;
+                    break;
+                  case 46:
+                  case 47:
+                  case 48:
+                    (*psd) [i] = 1.99526e-06 * basePsdWattsHz;
+                    break;
+                  case 49:
+                  case 50:
+                  case 51:
+                    (*psd) [i] = 1.25893e-06 * basePsdWattsHz;
+                    break;
+                  case 52:
+                  case 53:
+                  case 54:
+                    (*psd) [i] = 8.41395e-07 * basePsdWattsHz;
+                    break;
+                  case 55:
+                  case 56:
+                  case 57:
+                    (*psd) [i] = 6.30957e-07 * basePsdWattsHz;
+                    break;
+                  case 58:
+                  case 59:
+                  case 60:
+                    (*psd) [i] = 5.88844e-07 * basePsdWattsHz;
+                    break;
+                  case 61:
+                  case 62:
+                  case 63:
+                    (*psd) [i] = 5.62341e-07 * basePsdWattsHz;
+                    break;
+                  case 64:
+                  case 65:
+                  case 66:
+                    (*psd) [i] = 5.30884e-07 * basePsdWattsHz;
+                    break;
+                  case 67:
+                  case 68:
+                  case 69:
+                    (*psd) [i] = 5.01187e-07 * basePsdWattsHz;
+                    break;
+                  case 70:
+                  case 71:
+                  case 72:
+                    (*psd) [i] = 5.30884e-07 * basePsdWattsHz;
+                    break;
+                  case 73:
+                  case 74:
+                  case 75:
+                    (*psd) [i] = 7.49894e-07 * basePsdWattsHz;
+                    break;
+                  case 76:
+                  case 77:
+                  case 78:
+                    (*psd) [i] = 1.77828e-06 * basePsdWattsHz;
+                    break;
+                  case 79:
+                    (*psd) [i] = 5.62341e-06 * basePsdWattsHz;
+                    break;
+                  case 80:
+                    (*psd) [i] = 0.000177828 * basePsdWattsHz;
+                    break;
+                  case 81:
+                    (*psd) [i] = 4.21697e-06 * basePsdWattsHz;
+                    break;
+                  case 82:
+                  case 83:
+                  case 84:
+                    (*psd) [i] = 3.16228e-06 * basePsdWattsHz;
+                    break;
+                  case 85:
+                  case 86:
+                  case 87:
+                    (*psd) [i] = 3.16228e-06 * basePsdWattsHz;
+                    break;
+                  case 88:
+                  case 89:
+                  case 90:
+                    (*psd) [i] = 4.73151e-06 * basePsdWattsHz;
+                    break;
+                  case 91:
+                  case 92:
+                  case 93:
+                    (*psd) [i] = 7.49894e-06 * basePsdWattsHz;
+                    break;
+                  case 94:
+                    (*psd) [i] = 7.49894e-05 * basePsdWattsHz;
+                    break;
+                  case 95:
+                    (*psd) [i] = 0.1 * basePsdWattsHz;
+                    break;
+                  case 96:
+                    (*psd) [i] = 7.49894e-05 * basePsdWattsHz;
+                    break;
+                  case 97:
+                  case 98:
+                  case 99:
+                  case 100:
+                    (*psd) [i] = 1.77828e-06 * basePsdWattsHz;
+                    break;
+                }
+            }
+          break;
+        }
+      default:
+        {
+          NS_LOG_ERROR ("no valid TvType selected");
+          break;
+        }
+    }
+  m_txPsd = psd;
+}
+
+Ptr<SpectrumValue>
+TvSpectrumTransmitter::GetTxPsd () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_txPsd;
+}
+
+void
+TvSpectrumTransmitter::SetupTx ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_txPsd);
+  Ptr<SpectrumSignalParameters> signal = Create<SpectrumSignalParameters> ();
+  signal->duration = m_transmitDuration;
+  signal->psd = m_txPsd;
+  signal->txPhy = GetObject<SpectrumPhy> ();
+  signal->txAntenna = m_antenna;
+  m_channel->StartTx (signal);
+}
+
+void
+TvSpectrumTransmitter::Start ()
+{
+  NS_LOG_FUNCTION (this);
+  if (!m_active)
+    {
+      NS_LOG_LOGIC ("starting TV transmitter");
+      m_active = true;
+      Simulator::Schedule (m_startingTime, &TvSpectrumTransmitter::SetupTx, this);
+    }
+}
+
+void
+TvSpectrumTransmitter::Stop ()
+{
+  NS_LOG_FUNCTION (this);
+  m_active = false;
+}
+
+} // namespace ns3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/model/tv-spectrum-transmitter.h	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,153 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#ifndef TV_SPECTRUM_TRANSMITTER_H
+#define TV_SPECTRUM_TRANSMITTER_H
+
+#include <ns3/spectrum-value.h>
+#include <ns3/spectrum-phy.h>
+#include <ns3/spectrum-channel.h>
+#include <ns3/antenna-model.h>
+#include <ns3/spectrum-signal-parameters.h>
+#include <ns3/mobility-model.h>
+#include <ns3/net-device.h>
+
+namespace ns3
+{
+
+
+/**
+ * \ingroup spectrum
+ *
+ * SpectrumPhy implementation that creates a customizable TV transmitter which
+ * transmits a PSD spectrum specified by user-set attributes.
+ *
+ *
+ * This PHY model supports a single antenna model instance which is
+ * used for transmission (this PHY model never receives).
+ */
+class TvSpectrumTransmitter : public SpectrumPhy
+{
+
+public:
+  /** 
+   * types of TV transmitters: analog, digital 8-VSB, or digital COFDM
+   */
+  enum TvType
+  {
+    TVTYPE_ANALOG,
+    TVTYPE_8VSB,
+    TVTYPE_COFDM
+  };
+  
+  TvSpectrumTransmitter (); //!< Default constructor
+  virtual ~TvSpectrumTransmitter (); //!< Destructor
+  
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
+  static TypeId GetTypeId (void);
+
+  // inherited from SpectrumPhy
+  void SetChannel (Ptr<SpectrumChannel> c);
+  void SetMobility (Ptr<MobilityModel> m);
+  void SetDevice (Ptr<NetDevice> d);
+  Ptr<MobilityModel> GetMobility ();
+  Ptr<NetDevice> GetDevice ();
+  // device does not use Rx but these pure virtual methods must be implemented
+  Ptr<const SpectrumModel> GetRxSpectrumModel () const;
+  Ptr<AntennaModel> GetRxAntenna ();
+  void StartRx (Ptr<SpectrumSignalParameters> params);
+
+  /** 
+   * Get the spectrum channel
+   * 
+   * @return a pointer to the assigned spectrum channel
+   */
+  Ptr<SpectrumChannel> GetChannel () const;
+
+  /** 
+   * Creates power spectral density (PSD) spectrum of the TV transmitter and
+   * sets it for transmission.
+   * Before calling this method, must set attributes and parameters that are 
+   * applicable to your transmitter.
+   * 
+   * 8-VSB PSD approximated from Figure 3 of the following article:
+   * Baron, Stanley. "First-Hand:Digital Television: The Digital Terrestrial 
+   * Television Broadcasting (DTTB) Standard." IEEE Global History Network.
+   * <http://www.ieeeghn.org/wiki/index.php/First-Hand:Digital_Television:_The_
+   * Digital_Terrestrial_Television_Broadcasting_(DTTB)_Standard>.
+   *
+   * COFDM PSD approximated from Figure 12 (8k mode) of the following article:
+   * Kopp, Carlo. "High Definition Television." High Definition Television. Air 
+   * Power Australia. <http://www.ausairpower.net/AC-1100.html>.
+   *
+   * Analog PSD approximated from Figure 4 of the following paper:
+   * Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. "Technical Challenges 
+   * for Cognitive Radio in the TV White Space Spectrum." Qualcomm Incorporated.
+   *
+   *
+   * @return a pointer to the power spectral density of the TV transmitter
+   */
+  virtual void CreateTvPsd ();
+
+  /** 
+   * Get the power spectral density of the TV transmitter's signal
+   * 
+   * @return a pointer to the PSD
+   */  
+  Ptr<SpectrumValue> GetTxPsd () const;
+
+  /** 
+   * Starts the TV Transmitter's transmission on the spectrum channel
+   */
+  virtual void Start ();
+
+  /** 
+   * Stops the TV Transmitter's transmission on the spectrum channel
+   */
+  virtual void Stop ();
+
+
+private:
+  Ptr<MobilityModel> m_mobility; //!< Pointer to mobility model object
+  Ptr<AntennaModel> m_antenna; //!< Pointer to antenna model object
+  Ptr<NetDevice> m_netDevice; //!< Pointer to net device object
+  Ptr<SpectrumChannel> m_channel; //!< Pointer to spectrum channel object
+
+  /** Sets up signal to be transmitted */
+  virtual void SetupTx ();
+
+  int m_tvType; //!< Type of TV transmitter
+  double m_startFrequency; //!< Start frequency (in Hz) of TV transmitter's signal
+  double m_channelBandwidth; //!< Bandwidth (in Hz) of TV transmitter's signal
+  uint16_t m_channelNumber; //!< Channel number of TV transmitter
+  double m_basePsd; //!< Base power spectral density value (in dBm/Hz) of TV transmitter's signal
+  Ptr<SpectrumValue> m_txPsd; //!< Pointer to power spectral density of TV transmitter's signal
+  Time m_startingTime; //!< Timepoint after simulation begins that TV transmitter will begin transmitting
+  Time m_transmitDuration; //!< Length of time that TV transmitter will transmit for
+  bool m_active; //!< True if TV transmitter is transmitting
+
+};
+
+} // namespace ns3
+
+#endif /* TV_SPECTRUM_TRANSMITTER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/test/tv-helper-distribution-test.cc	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,142 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#define private public //to make private method testable
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <ns3/tv-spectrum-transmitter-helper.h>
+
+/**
+ * This test verifies the accuracy of the private GetRandomNumTransmitters()  
+ * method in the TvSpectrumTransmitterHelper class. The method generates a 
+ * random number corresponding to the number of TV transmitters to create based 
+ * on the given location density (low, medium, or high) and maximum possible 
+ * number of TV channels. Low density will generate a transmitter for between 
+ * one (a single transmitter) and one third of the number of possible channels, 
+ * medium density will generate a transmitter for between one third and two 
+ * thirds, and high density will generate a transmitter for between two thirds 
+ * and all of the possible channels. In this test, it is verified that the 
+ * lower (1) and upper (max number of possible channels input) bounds are not 
+ * exceeded and that the number of transmitters to be generated does not overlap 
+ * between adjacent densities. For example, given 60 possible channels, for low 
+ * density between 1 and 20 transmitters can be created, for medium density 
+ * between 21 and 40 transmitters can be created, and for high density between 
+ * 41 and 60 transmitters can be created (all inclusive). This is tested with 
+ * various cases.
+ */
+NS_LOG_COMPONENT_DEFINE ("TvHelperDistributionTest");
+
+using namespace ns3;
+
+
+class TvHelperDistributionTestCase : public TestCase
+{
+public:
+  TvHelperDistributionTestCase (uint32_t maxNumTransmitters);
+  virtual ~TvHelperDistributionTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string Name (uint32_t maxNumTransmitters);
+  uint32_t m_maxNumTransmitters;
+};
+
+std::string 
+TvHelperDistributionTestCase::Name (uint32_t maxNumTransmitters)
+{
+  std::ostringstream oss;
+  oss << "Max Number of Transmitters = " << maxNumTransmitters;
+  return oss.str();
+}
+
+TvHelperDistributionTestCase::TvHelperDistributionTestCase (uint32_t maxNumTransmitters)
+  : TestCase (Name (maxNumTransmitters)),
+    m_maxNumTransmitters (maxNumTransmitters)
+{
+}
+
+TvHelperDistributionTestCase::~TvHelperDistributionTestCase ()
+{
+}
+
+void
+TvHelperDistributionTestCase::DoRun (void)
+{  
+  NS_LOG_FUNCTION (m_maxNumTransmitters);
+  TvSpectrumTransmitterHelper tvTransHelper;
+  uint32_t rand;
+  uint32_t maxLow = 0;
+  uint32_t minMid = m_maxNumTransmitters;
+  uint32_t maxMid = 0;
+  uint32_t minHigh = m_maxNumTransmitters;
+  for (int i = 0; i < 30; i ++) 
+    {
+      rand = tvTransHelper.GetRandomNumTransmitters (TvSpectrumTransmitterHelper::DENSITY_LOW, m_maxNumTransmitters);
+      NS_TEST_ASSERT_MSG_GT (rand, 0, "lower bound exceeded");
+      if (rand > maxLow)
+        {
+          maxLow = rand;
+        }
+    }
+  for (int i = 0; i < 30; i ++) 
+    {
+      rand = tvTransHelper.GetRandomNumTransmitters (TvSpectrumTransmitterHelper::DENSITY_MEDIUM, m_maxNumTransmitters);
+      if (rand < minMid)
+        {
+          minMid = rand;
+        }
+      if (rand > maxMid)
+        {
+          maxMid = rand;
+        }
+    }
+  for (int i = 0; i < 30; i ++) 
+    {
+      rand = tvTransHelper.GetRandomNumTransmitters (TvSpectrumTransmitterHelper::DENSITY_HIGH, m_maxNumTransmitters);
+      NS_TEST_ASSERT_MSG_LT (rand, m_maxNumTransmitters + 1, "upper bound exceeded");
+      if (rand < minHigh)
+        {
+          minHigh = rand;
+        }
+    }
+  NS_TEST_ASSERT_MSG_LT (maxLow, minMid, "low density overlaps with medium density");
+  NS_TEST_ASSERT_MSG_LT (maxMid, minHigh, "medium density overlaps with high density");
+}
+
+
+class TvHelperDistributionTestSuite : public TestSuite
+{
+public:
+  TvHelperDistributionTestSuite ();
+};
+
+TvHelperDistributionTestSuite::TvHelperDistributionTestSuite ()
+  : TestSuite ("tv-helper-distribution", UNIT)
+{
+  NS_LOG_INFO ("creating TvHelperDistributionTestSuite");
+  for (uint32_t maxNumTransmitters = 3; maxNumTransmitters <= 203; maxNumTransmitters+= 10)
+    {
+      AddTestCase (new TvHelperDistributionTestCase (maxNumTransmitters), 
+                   TestCase::QUICK);
+    }
+}
+
+static TvHelperDistributionTestSuite g_TvHelperDistributionTestSuite;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spectrum/test/tv-spectrum-transmitter-test.cc	Wed Apr 08 19:45:39 2015 -0700
@@ -0,0 +1,205 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Benjamin Cizdziel <ben.cizdziel@gmail.com>
+ */
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <ns3/spectrum-value.h>
+#include <ns3/enum.h>
+#include <ns3/double.h>
+#include <ns3/tv-spectrum-transmitter.h>
+
+/**
+ * This test verifies the accuracy of the spectrum/PSD model in the 
+ * TvSpectrumTransmitter class. To do so, it tests if the max power spectral 
+ * density, start frequency, and end frequency comply with expected values. 
+ * Values for TV/modulation type, start frequency, channel bandwidth, and 
+ * base PSD are swept and tested for each case.
+ */
+NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitterTest");
+
+using namespace ns3;
+
+const double TOLERANCE = 1e-15;
+
+
+class TvSpectrumTransmitterTestCase : public TestCase
+{
+public:
+  TvSpectrumTransmitterTestCase (double startFrequency, 
+                            double channelBandwidth, 
+                            double basePsd, 
+                            TvSpectrumTransmitter::TvType tvType);
+  virtual ~TvSpectrumTransmitterTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string Name (TvSpectrumTransmitter::TvType tvType, 
+                           double startFrequency, 
+                           double channelBandwidth, 
+                           double basePsd);
+
+  double m_startFrequency;
+  double m_channelBandwidth; 
+  double m_basePsd;
+  TvSpectrumTransmitter::TvType m_tvType;
+};
+
+
+std::string 
+TvSpectrumTransmitterTestCase::Name (TvSpectrumTransmitter::TvType tvType, 
+                                     double startFrequency, 
+                                     double channelBandwidth, 
+                                     double basePsd)
+{
+  std::ostringstream oss;
+  oss << "TV type = " << tvType << ", "
+      << "start frequency = " << startFrequency << " Hz, "
+      << "channel bandwidth = " << channelBandwidth << " Hz, "
+      << "base PSD = " << basePsd << " dBm per Hz";
+  return oss.str();
+}
+
+TvSpectrumTransmitterTestCase::TvSpectrumTransmitterTestCase (double startFrequency,
+						    double channelBandwidth,
+						    double basePsd,
+						    TvSpectrumTransmitter::TvType tvType)
+  : TestCase (Name (tvType, startFrequency, channelBandwidth, basePsd)),
+    m_startFrequency (startFrequency),
+    m_channelBandwidth (channelBandwidth),
+    m_basePsd (basePsd),
+    m_tvType (tvType)
+{
+}
+
+TvSpectrumTransmitterTestCase::~TvSpectrumTransmitterTestCase ()
+{
+}
+
+void
+TvSpectrumTransmitterTestCase::DoRun (void)
+{  
+  NS_LOG_FUNCTION (m_startFrequency << m_basePsd << m_tvType);
+
+  /* TV transmitter setup */
+  Ptr<TvSpectrumTransmitter> phy = CreateObject<TvSpectrumTransmitter>();
+  phy->SetAttribute ("StartFrequency", DoubleValue (m_startFrequency));
+  phy->SetAttribute ("ChannelBandwidth", DoubleValue (m_channelBandwidth));
+  phy->SetAttribute ("BasePsd", DoubleValue (m_basePsd)); 
+  phy->SetAttribute ("TvType", EnumValue (m_tvType));
+  phy->CreateTvPsd ();
+
+  /* Test max PSD value */
+  Ptr<SpectrumValue> psd = phy->GetTxPsd ();
+  Values::const_iterator psdIter = psd->ConstValuesBegin ();
+  double maxValue = 0;
+  while (psdIter != psd->ConstValuesEnd ())
+    {
+      if (*psdIter > maxValue)
+        {
+          maxValue = *psdIter;
+        }
+      ++psdIter;
+    }
+  double basePsdWattsHz = pow (10.0, (m_basePsd - 30) / 10.0); // convert dBm to W/Hz
+  if (m_tvType == TvSpectrumTransmitter::TVTYPE_8VSB) // pilot has highest PSD
+    {
+      double expectedPsd = (0.502 * basePsdWattsHz) + (21.577 * basePsdWattsHz);
+      NS_TEST_ASSERT_MSG_EQ_TOL (maxValue, 
+                                 expectedPsd, 
+                                 TOLERANCE, 
+                                 "peak PSD value (" << maxValue << ") is incorrect");
+    }
+  else // highest PSD is base PSD
+    {
+      NS_TEST_ASSERT_MSG_EQ_TOL (maxValue, 
+                                 basePsdWattsHz, 
+                                 TOLERANCE, 
+                                 "peak PSD value (" << maxValue << ") is incorrect");
+    }
+
+  /* Test frequency range */
+  Bands::const_iterator bandStart = psd->ConstBandsBegin ();
+  Bands::const_iterator bandEnd = psd->ConstBandsEnd ();
+  NS_TEST_ASSERT_MSG_EQ_TOL ((*bandStart).fc, 
+                             m_startFrequency, 
+                             TOLERANCE, 
+                             "start frequency value (" << (*bandStart).fc << ") is incorrect");
+  NS_TEST_ASSERT_MSG_EQ_TOL ((*(bandEnd - 1)).fc, 
+                             m_startFrequency + m_channelBandwidth, 
+                             TOLERANCE, 
+                             "end frequency value (" << (*(bandEnd - 1)).fc << ") is incorrect");
+}
+
+
+class TvSpectrumTransmitterTestSuite : public TestSuite
+{
+public:
+  TvSpectrumTransmitterTestSuite ();
+};
+
+TvSpectrumTransmitterTestSuite::TvSpectrumTransmitterTestSuite ()
+  : TestSuite ("tv-spectrum-transmitter", UNIT)
+{
+  NS_LOG_INFO ("creating TvSpectrumTransmitterTestSuite");
+  for (double startFreq = 100; startFreq < 1e15; startFreq *= 10)
+    {
+      for (double bandwidth = 100; bandwidth < 1e15; bandwidth *= 10)
+        {
+          for (double psd = -100; psd <= 100; psd += 20)
+            {
+              AddTestCase (new TvSpectrumTransmitterTestCase (startFreq, 
+                                                              bandwidth, 
+                                                              psd, 
+                                                              TvSpectrumTransmitter::TVTYPE_8VSB), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+  for (double startFreq = 100; startFreq < 1e15; startFreq *= 10)
+    {
+      for (double bandwidth = 100; bandwidth < 1e15; bandwidth *= 10)
+        {
+          for (double psd = -100; psd <= 100; psd += 20)
+            {
+              AddTestCase (new TvSpectrumTransmitterTestCase (startFreq, 
+                                                              bandwidth, 
+                                                              psd, 
+                                                              TvSpectrumTransmitter::TVTYPE_COFDM), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+  for (double startFreq = 100; startFreq < 1e15; startFreq *= 10)
+    {
+      for (double bandwidth = 100; bandwidth < 1e15; bandwidth *= 10)
+        {
+          for (double psd = -100; psd <= 100; psd += 20)
+            {
+              AddTestCase (new TvSpectrumTransmitterTestCase (startFreq, 
+                                                              bandwidth, 
+                                                              psd, 
+                                                              TvSpectrumTransmitter::TVTYPE_ANALOG), 
+                           TestCase::QUICK);
+            }
+        }
+    }
+}
+
+static TvSpectrumTransmitterTestSuite g_tvSpectrumTransmitterTestSuite;
--- a/src/spectrum/wscript	Wed Apr 08 19:42:20 2015 -0700
+++ b/src/spectrum/wscript	Wed Apr 08 19:45:39 2015 -0700
@@ -28,10 +28,12 @@
         'model/half-duplex-ideal-phy-signal-parameters.cc',
         'model/non-communicating-net-device.cc',
         'model/microwave-oven-spectrum-value-helper.cc',
+        'model/tv-spectrum-transmitter.cc',
         'helper/spectrum-helper.cc',
         'helper/adhoc-aloha-noack-ideal-phy-helper.cc',
         'helper/waveform-generator-helper.cc',
         'helper/spectrum-analyzer-helper.cc',
+        'helper/tv-spectrum-transmitter-helper.cc',
         ]
 
     module_test = bld.create_ns3_module_test_library('spectrum')
@@ -40,6 +42,8 @@
         'test/spectrum-value-test.cc',
         'test/spectrum-ideal-phy-test.cc',
         'test/spectrum-waveform-generator-test.cc',
+        'test/tv-helper-distribution-test.cc',
+        'test/tv-spectrum-transmitter-test.cc',
         ]
     
     headers = bld(features='ns3header')
@@ -69,10 +73,12 @@
         'model/half-duplex-ideal-phy-signal-parameters.h',
         'model/non-communicating-net-device.h',
         'model/microwave-oven-spectrum-value-helper.h',
+        'model/tv-spectrum-transmitter.h',
         'helper/spectrum-helper.h',
         'helper/adhoc-aloha-noack-ideal-phy-helper.h',
         'helper/waveform-generator-helper.h',
         'helper/spectrum-analyzer-helper.h',
+        'helper/tv-spectrum-transmitter-helper.h',
         'test/spectrum-test.h',
         ]